1 # -*- encoding: binary -*-
2 # Copyright (C) 2017 all contributors <repobrowse@80x24.org>
3 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
4 # frozen_string_literal: true
5 require_relative 'repo'
8 class Repobrowse::Config
11 def initialize(file = ENV['REPOBROWSE_CONFIG'] ||
12 File.expand_path('~/.repobrowse/config'))
13 @groups = Hash.new { |h,k| h[k] = [] }
18 cmd = %W(git config --file=#{file} -l)
19 IO.popen(cmd) do |out|
21 k, v = l.chomp!.split('=', 2)
22 (raw[-k] ||= []) << -v
25 raw.each_value(&:freeze)
27 raw[:snapshots] ||= '-tar.bz2 -tar.xz'
28 raw[:groups] = { hidden: [], none: [] }
34 when %r{\Arepo\.(.+)\.path\z}
36 warn "multiple values defined for #{k.inspect}\n" if v.size > 1
38 add_repo(repo_name, path)
43 def add_repo(repo_name, path) # repo_name "git.git"
44 rv = { path: path, name: repo_name }
45 rv[:snapshot_pfx] = -path.split(%r{/+})[-1].chomp('.git')
46 %i[ vcs readme group snapshots ].each do |key|
47 rv[key] = @raw["repo.#{repo_name}.#{key}"]
49 rv[:snapshots] ||= @raw[:snapshots]
50 rv[:snapshots_disabled] = disabled = {}
51 rv[:snapshots].split(/\s+/n).each do |type|
52 # "-tar.bz2", "-" prefix denotes disabled
53 type.sub!(/\A-/, '') and
56 group = rv[:group] ||= :none
59 Array(group).each { |g| @groups[g] << repo_name }
61 @groups[group] << repo_name
63 snap = repo_name.split('/')[-1]
64 if (rv[:vcs] ||= 'git') == 'git'
65 snap.chomp!('.git') # seems common for git URLs to end in ".git"
67 rv[:snapshot_re] = %r{\A\Q#{Regexp.escape(snap)}[-_]}
68 @repos[repo_name] = Repobrowse::Repo.new(rv)