git clone works
[repobrowse.git] / lib / repobrowse / config.rb
blob55b6d4e957f71d15ad862221b7c4cb3b375d7f23
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'
6 require_relative 'git'
8 class Repobrowse::Config
9   attr_reader :repos
11   def initialize(file = ENV['REPOBROWSE_CONFIG'] ||
12                         File.expand_path('~/.repobrowse/config'))
13     @groups = Hash.new { |h,k| h[k] = [] }
14     if Hash === file
15       raw = file
16     else
17       raw = {}
18       cmd = %W(git config --file=#{file} -l)
19       IO.popen(cmd) do |out|
20         out.each do |l|
21           k, v = l.chomp!.split('=', 2)
22           (raw[-k] ||= []) << -v
23         end
24       end
25       raw.each_value(&:freeze)
26     end
27     raw[:snapshots] ||= '-tar.bz2 -tar.xz'
28     raw[:groups] = { hidden: [], none: [] }
29     @raw = raw
30     @repos = {}
31     raw.each do |k, v|
32       v = Array(v)
33       case k
34       when %r{\Arepo\.(.+)\.path\z}
35         repo_name = -$1
36         warn "multiple values defined for #{k.inspect}\n" if v.size > 1
37         path = v[-1]
38         add_repo(repo_name, path)
39       end
40     end
41   end
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}"]
48     end
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
54         disabled[type] = true
55     end
56     group = rv[:group] ||= :none
57     case group
58     when Array
59       Array(group).each { |g| @groups[g] << repo_name }
60     else
61       @groups[group] << repo_name
62     end
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"
66     end
67     rv[:snapshot_re] = %r{\A\Q#{Regexp.escape(snap)}[-_]}
68     @repos[repo_name] = Repobrowse::Repo.new(rv)
69   end
70 end