test: remove httpd tests that ask for user
[git] / git-rb-setup.rb
1 #!/usr/bin/env ruby
2
3 def die(*args)
4   fmt = args.shift
5   $stderr.printf("fatal: %s\n" % fmt, *args)
6   exit 128
7 end
8
9 def sha1_to_hex(sha1)
10   sha1.unpack('H*').first
11 end
12
13 class CommandError < RuntimeError
14
15   def initialize(command)
16      @command = command
17   end
18
19   def to_s
20     Array(@command).join(' ').inspect
21   end
22
23 end
24
25 def run(cmd, *args)
26   system(*cmd, *args)
27   raise CommandError.new(cmd) unless $?.success?
28 end
29
30 class String
31   def skip_prefix(prefix)
32     return self[prefix.length..-1]
33   end
34 end
35
36 class ParseOpt
37   attr_writer :usage
38
39   class Option
40     attr_reader :short, :long, :help
41
42     def initialize(short, long, help, &block)
43       @block = block
44       @short = short
45       @long = long
46       @help = help
47     end
48
49     def call(v)
50       @block.call(v)
51     end
52   end
53
54   def initialize
55     @list = {}
56   end
57
58   def on(short = nil, long = nil, help: nil, &block)
59     opt = Option.new(short, long, help, &block)
60     @list[short] = opt if short
61     @list[long] = opt if long
62   end
63
64   def parse
65     if ARGV.member?('-h') or ARGV.member?('--help')
66       usage
67       exit 0
68     end
69     seen_dash = false
70     ARGV.delete_if do |cur|
71       opt = val = nil
72       next false if cur[0] != '-' or seen_dash
73       case cur
74       when '--'
75         seen_dash = true
76         next true
77       when /^--no-(.+)$/
78         opt = @list[$1]
79         val = false
80       when /^-([^-])(.+)?$/, /^--(.+?)(?:=(.+))?$/
81         opt = @list[$1]
82         val = $2 || true
83       end
84       if opt
85         opt.call(val)
86         true
87       else
88         usage
89         exit 1
90       end
91     end
92   end
93
94   def usage
95     def fmt(prefix, str)
96       return str ? prefix + str : nil
97     end
98     puts 'usage: %s' % @usage
99     @list.values.uniq.each do |opt|
100       s = '    '
101       s << ''
102       s << [fmt('-', opt.short), fmt('--', opt.long)].compact.join(', ')
103       s << ''
104       s << '%*s%s' % [26 - s.size, '', opt.help] if opt.help
105       puts s
106     end
107   end
108
109 end