gitosis_easy_conf 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.rvmrc +1 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +72 -0
- data/Rakefile +62 -0
- data/VERSION +1 -0
- data/examples/Rakefile +179 -0
- data/examples/gitosis.complex.conf +138 -0
- data/examples/gitosis.concise.conf +18 -0
- data/examples/gitosis.readme.conf +122 -0
- data/gitosis_easy_conf.gemspec +187 -0
- data/lib/gitosis_easy_conf/config.rb +26 -0
- data/lib/gitosis_easy_conf/forkers.rb +45 -0
- data/lib/gitosis_easy_conf/groups.rb +69 -0
- data/lib/gitosis_easy_conf/repositories.rb +88 -0
- data/lib/gitosis_easy_conf.rb +60 -0
- data/test/helper.rb +40 -0
- data/test/test_gitosis_config.rb +99 -0
- data/test/test_gitosis_forker.rb +96 -0
- data/test/test_gitosis_groups.rb +100 -0
- data/test/test_gitosis_repositories.rb +371 -0
- metadata +547 -0
@@ -0,0 +1,187 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{gitosis_easy_conf}
|
8
|
+
s.version = "0.0.3"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Gerrit Riessen"]
|
12
|
+
s.date = %q{2011-09-01}
|
13
|
+
s.description = %q{Easy gitosis configuration}
|
14
|
+
s.email = %q{gerrit.riessen@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".rvmrc",
|
22
|
+
"Gemfile",
|
23
|
+
"LICENSE.txt",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"examples/Rakefile",
|
28
|
+
"examples/gitosis.complex.conf",
|
29
|
+
"examples/gitosis.concise.conf",
|
30
|
+
"examples/gitosis.readme.conf",
|
31
|
+
"gitosis_easy_conf.gemspec",
|
32
|
+
"lib/gitosis_easy_conf.rb",
|
33
|
+
"lib/gitosis_easy_conf/config.rb",
|
34
|
+
"lib/gitosis_easy_conf/forkers.rb",
|
35
|
+
"lib/gitosis_easy_conf/groups.rb",
|
36
|
+
"lib/gitosis_easy_conf/repositories.rb",
|
37
|
+
"test/helper.rb",
|
38
|
+
"test/test_gitosis_config.rb",
|
39
|
+
"test/test_gitosis_forker.rb",
|
40
|
+
"test/test_gitosis_groups.rb",
|
41
|
+
"test/test_gitosis_repositories.rb"
|
42
|
+
]
|
43
|
+
s.homepage = %q{https://github.com/gorenje/gitosis_easy_conf}
|
44
|
+
s.licenses = ["MIT"]
|
45
|
+
s.require_paths = ["lib"]
|
46
|
+
s.rubygems_version = %q{1.6.2}
|
47
|
+
s.summary = %q{Make writing a gitosis configuration easier}
|
48
|
+
|
49
|
+
if s.respond_to? :specification_version then
|
50
|
+
s.specification_version = 3
|
51
|
+
|
52
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
53
|
+
s.add_runtime_dependency(%q<gitosis_easy_conf>, [">= 0"])
|
54
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
55
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
56
|
+
s.add_development_dependency(%q<inifile>, [">= 0"])
|
57
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
58
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
59
|
+
s.add_development_dependency(%q<rr>, [">= 0"])
|
60
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
61
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
62
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
63
|
+
s.add_development_dependency(%q<inifile>, [">= 0"])
|
64
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
65
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
66
|
+
s.add_development_dependency(%q<rr>, [">= 0"])
|
67
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
68
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
69
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
70
|
+
s.add_development_dependency(%q<inifile>, [">= 0"])
|
71
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
72
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
73
|
+
s.add_development_dependency(%q<rr>, [">= 0"])
|
74
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
75
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
76
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
77
|
+
s.add_development_dependency(%q<inifile>, [">= 0"])
|
78
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
79
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
80
|
+
s.add_development_dependency(%q<rr>, [">= 0"])
|
81
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
82
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
83
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
84
|
+
s.add_development_dependency(%q<inifile>, [">= 0"])
|
85
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
86
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
87
|
+
s.add_development_dependency(%q<rr>, [">= 0"])
|
88
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
89
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
90
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
91
|
+
s.add_development_dependency(%q<inifile>, [">= 0"])
|
92
|
+
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
93
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
94
|
+
s.add_development_dependency(%q<rr>, [">= 0"])
|
95
|
+
s.add_runtime_dependency(%q<inifile>, [">= 0"])
|
96
|
+
else
|
97
|
+
s.add_dependency(%q<gitosis_easy_conf>, [">= 0"])
|
98
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
99
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
100
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
101
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
102
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
103
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
104
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
105
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
106
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
107
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
108
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
109
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
110
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
111
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
112
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
113
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
114
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
115
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
116
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
117
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
118
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
119
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
120
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
121
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
122
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
123
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
124
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
125
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
126
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
127
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
128
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
129
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
130
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
131
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
132
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
133
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
134
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
135
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
136
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
137
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
138
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
139
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
140
|
+
end
|
141
|
+
else
|
142
|
+
s.add_dependency(%q<gitosis_easy_conf>, [">= 0"])
|
143
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
144
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
145
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
146
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
147
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
148
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
149
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
150
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
151
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
152
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
153
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
154
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
155
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
156
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
157
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
158
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
159
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
160
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
161
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
162
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
163
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
164
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
165
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
166
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
167
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
168
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
169
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
170
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
171
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
172
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
173
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
174
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
175
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
176
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
177
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
178
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
179
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
180
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
181
|
+
s.add_dependency(%q<rdoc>, [">= 0"])
|
182
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
183
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
184
|
+
s.add_dependency(%q<inifile>, [">= 0"])
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Gitosis
|
2
|
+
class Config
|
3
|
+
def initialize(&block)
|
4
|
+
@configs = {}
|
5
|
+
instance_eval(&block)
|
6
|
+
end
|
7
|
+
|
8
|
+
def method_missing(method, *args, &block)
|
9
|
+
if args.length > 0 || block_given?
|
10
|
+
@configs[method] = case method
|
11
|
+
when :fork_naming_convention then
|
12
|
+
if block_given? && ![2,-1].include?(block.arity)
|
13
|
+
raise BlockArityIncorrect, "Block needs exactly two arguments"
|
14
|
+
end
|
15
|
+
block
|
16
|
+
when :filename then
|
17
|
+
args.first
|
18
|
+
else
|
19
|
+
[args, block]
|
20
|
+
end
|
21
|
+
else
|
22
|
+
@configs[method]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Define a mapping from a Gitosis user and their public key. Here the use of string and
|
2
|
+
# symbol are unimportant, i.e.
|
3
|
+
# Gitosis.forkers do
|
4
|
+
# fubar :key_one
|
5
|
+
# fubar "key_one"
|
6
|
+
# end
|
7
|
+
# are equivalent.
|
8
|
+
#
|
9
|
+
module Gitosis
|
10
|
+
class Forker
|
11
|
+
def initialize(&block)
|
12
|
+
@forkers = {}
|
13
|
+
instance_eval(&block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(method, *args, &block)
|
17
|
+
if args.length > 0
|
18
|
+
|
19
|
+
if @forkers.values.include?(args.first.to_s)
|
20
|
+
raise(SamePublicKeyForForkers, "Key '#{args.first}' used by '#{method}' "+
|
21
|
+
"and #{@forkers.invert[args.first.to_s]}'")
|
22
|
+
end
|
23
|
+
|
24
|
+
if @forkers.keys.include?(method)
|
25
|
+
raise(ForkerAlreadyDefined, "Forker '#{method}' already defined with key: " +
|
26
|
+
"#{@forkers[method]}")
|
27
|
+
end
|
28
|
+
|
29
|
+
@forkers[method] = args.first.to_s
|
30
|
+
else
|
31
|
+
raise(Gitosis::UnknownForker,
|
32
|
+
"Forker '#{method}' Not Found") unless @forkers.keys.include?(method)
|
33
|
+
@forkers[method]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def [](name)
|
38
|
+
send(name.to_sym)
|
39
|
+
end
|
40
|
+
|
41
|
+
def all
|
42
|
+
@forkers.keys
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Group definition use strings and symbols to define groups with mutliple members and
|
2
|
+
# shared membership:
|
3
|
+
# Gitosis.groups do
|
4
|
+
# fubar 'public.key'
|
5
|
+
# snafu :fubar
|
6
|
+
# luke 'fubar'
|
7
|
+
# combined :luke, :snafu, :fubar
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# This means that the following have the values:
|
11
|
+
# Gitosis.groups[:fubar] ==> 'public.key'
|
12
|
+
# Gitosis.groups[:snafu] ==> 'public.key'
|
13
|
+
# Gitosis.groups[:luke] ==> 'fubar'
|
14
|
+
# Gitosis.groups[:combined] ==> 'public.key fubar'
|
15
|
+
#
|
16
|
+
# String values are public keys and symbols are references to group names.
|
17
|
+
# Duplicate key names are removed and returned is a concatenation of all keys.
|
18
|
+
#
|
19
|
+
module Gitosis
|
20
|
+
class Group
|
21
|
+
|
22
|
+
def initialize(&block)
|
23
|
+
@groups = {}
|
24
|
+
instance_eval(&block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def method_missing(method, *args, &block)
|
28
|
+
if args.length > 0
|
29
|
+
@groups[method.to_sym] = args
|
30
|
+
else
|
31
|
+
raise UnknownGroup, "Unkown group '#{method}'" unless @groups[method]
|
32
|
+
@groups[method].uniq.join(" ")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def denormalize
|
37
|
+
@groups.keys.each do |key|
|
38
|
+
@groups[key] = @groups[key].collect do |member|
|
39
|
+
@_refs = []
|
40
|
+
denormalize_member(member)
|
41
|
+
end.flatten
|
42
|
+
end
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
def [](name)
|
47
|
+
send(name)
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def denormalize_member(member)
|
53
|
+
case member
|
54
|
+
when String then member
|
55
|
+
when Symbol
|
56
|
+
if @_refs.include?(member)
|
57
|
+
raise SelfReferencingGroup, "Group '#{member}' cycle reference"
|
58
|
+
end
|
59
|
+
@_refs << member
|
60
|
+
|
61
|
+
raise UnknownGroup, "Unkown group '#{member}'" unless @groups[member]
|
62
|
+
|
63
|
+
@groups[member].collect { |a| denormalize_member(a) }
|
64
|
+
else
|
65
|
+
raise UnknownGroupType, "Group '#{member}' type not supported: #{member.class}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# Definition of a gitosis repository.
|
2
|
+
#
|
3
|
+
require 'inifile'
|
4
|
+
|
5
|
+
module Gitosis
|
6
|
+
EmptyConfig = {
|
7
|
+
:writable => [], :readable => [], :forks => []
|
8
|
+
}
|
9
|
+
|
10
|
+
class Repository
|
11
|
+
def initialize(&block)
|
12
|
+
@base_config = EmptyConfig
|
13
|
+
|
14
|
+
conf_file_name = Gitosis.config.filename
|
15
|
+
@no_file_found = if conf_file_name.nil? or !File.exists?(conf_file_name)
|
16
|
+
@conffile = {}
|
17
|
+
true
|
18
|
+
else
|
19
|
+
@conffile = IniFile.new(conf_file_name)
|
20
|
+
false
|
21
|
+
end
|
22
|
+
@conffile["gitosis"] = {}
|
23
|
+
@origconffile = @conffile.clone
|
24
|
+
|
25
|
+
@fork_name = Gitosis.config.fork_naming_convention || lambda do |repo,forker|
|
26
|
+
"#{forker}_#{repo}"
|
27
|
+
end
|
28
|
+
|
29
|
+
instance_eval(&block)
|
30
|
+
end
|
31
|
+
|
32
|
+
def write
|
33
|
+
@conffile.write unless @conffile.eql?(@origconffile) || @no_file_found
|
34
|
+
end
|
35
|
+
|
36
|
+
def with_base_configuration(config,&block)
|
37
|
+
@base_config = config || EmptyConfig
|
38
|
+
instance_eval(&block)
|
39
|
+
@base_config = EmptyConfig
|
40
|
+
end
|
41
|
+
|
42
|
+
def method_missing(method, *args, &block)
|
43
|
+
args = [{}] if args.first.nil?
|
44
|
+
repo_name = (args.first[:name] || method).to_sym
|
45
|
+
|
46
|
+
committers = _get_keys([@base_config,args.first].map{|h| h[:writable]})
|
47
|
+
@conffile["group #{repo_name}.writable"] = {
|
48
|
+
'members' => committers,
|
49
|
+
'writable' => repo_name.to_s
|
50
|
+
} unless committers == ""
|
51
|
+
|
52
|
+
readers = _get_keys([@base_config,args.first].map{|h| h[:readable]})
|
53
|
+
@conffile["group #{repo_name}.readonly"] = {
|
54
|
+
'members' => readers,
|
55
|
+
'readonly' => repo_name.to_s
|
56
|
+
} unless readers == ""
|
57
|
+
|
58
|
+
[@base_config, args.first].map { |h| h[:forks] }.flatten.compact.
|
59
|
+
collect { |a| a == :all ? Gitosis.forkers.all : a }.flatten.compact.each do |forker|
|
60
|
+
|
61
|
+
fork_repo_name = @fork_name.call(repo_name,forker)
|
62
|
+
|
63
|
+
@conffile["group fork.#{repo_name}.#{forker}.writable"] = {
|
64
|
+
'members' => ::Forker[forker],
|
65
|
+
'writable' => fork_repo_name,
|
66
|
+
}
|
67
|
+
|
68
|
+
@conffile["group fork.#{repo_name}.#{forker}.readonly"] = {
|
69
|
+
'members' => readers,
|
70
|
+
'readonly' => fork_repo_name,
|
71
|
+
} unless readers == ""
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def _get_keys(ary)
|
78
|
+
ary.flatten.compact.collect do |member|
|
79
|
+
case member
|
80
|
+
when String then member
|
81
|
+
when Symbol then Gitosis.groups[member]
|
82
|
+
else
|
83
|
+
raise UnknownGroup, "Group '#{member}'"
|
84
|
+
end
|
85
|
+
end.flatten.join(' ')
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'gitosis_easy_conf/repositories'
|
2
|
+
require 'gitosis_easy_conf/groups'
|
3
|
+
require 'gitosis_easy_conf/forkers'
|
4
|
+
require 'gitosis_easy_conf/config'
|
5
|
+
|
6
|
+
module Gitosis
|
7
|
+
extend self
|
8
|
+
|
9
|
+
# Exceptions
|
10
|
+
%w[
|
11
|
+
SelfReferencingGroup UnknownForker UnknownGroup
|
12
|
+
UnknownGroupType SamePublicKeyForForkers ForkerAlreadyDefined
|
13
|
+
BlockArityIncorrect
|
14
|
+
].each do |exception_name|
|
15
|
+
const_set( exception_name, Class.new(StandardError))
|
16
|
+
end
|
17
|
+
|
18
|
+
# Configuration verbs -- config, forkers, groups (or roles) and repositories.
|
19
|
+
def config(&block)
|
20
|
+
if block_given?
|
21
|
+
if defined?(@@config)
|
22
|
+
@@config.instance_eval(&block)
|
23
|
+
else
|
24
|
+
@@config = Config.new(&block)
|
25
|
+
end
|
26
|
+
else
|
27
|
+
@@config ||= Config.new(){}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def forkers(&block)
|
32
|
+
block_given? ? @@forkers = Forker.new(&block) : (@@forkers ||= nil)
|
33
|
+
end
|
34
|
+
|
35
|
+
def groups(&block)
|
36
|
+
block_given? ? @@groups = Group.new(&block).denormalize : (@@groups ||= nil)
|
37
|
+
end
|
38
|
+
alias :roles :groups
|
39
|
+
|
40
|
+
def repositories(&block)
|
41
|
+
block_given? ? @@repository = Repository.new(&block) : @@repository
|
42
|
+
end
|
43
|
+
|
44
|
+
def setup(filename = nil, &block)
|
45
|
+
config do
|
46
|
+
filename filename
|
47
|
+
end
|
48
|
+
|
49
|
+
class_eval(&block)
|
50
|
+
repositories.write
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class Forker
|
55
|
+
class << self
|
56
|
+
def [](name)
|
57
|
+
Gitosis.forkers.send(name.to_sym)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
require 'shoulda'
|
12
|
+
require 'inifile'
|
13
|
+
require 'rr'
|
14
|
+
|
15
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
16
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
17
|
+
require 'gitosis_easy_conf'
|
18
|
+
|
19
|
+
class Test::Unit::TestCase
|
20
|
+
include RR::Adapters::TestUnit
|
21
|
+
|
22
|
+
# used in the repository tests, compares the complete gitosis configuration.
|
23
|
+
# assumes the existence of @results hash.
|
24
|
+
def assert_config(expected,msg)
|
25
|
+
assert_equal( (["gitosis"] + expected.keys).sort, @results.keys.sort,
|
26
|
+
msg + " (top level keys)")
|
27
|
+
assert_equal( {}, @results["gitosis"], msg + " (empty gitosis)")
|
28
|
+
|
29
|
+
expected.keys.each do |group_keys|
|
30
|
+
gmsg = msg + " [#{group_keys}]"
|
31
|
+
assert_equal(expected[group_keys].keys.sort,
|
32
|
+
@results[group_keys].keys.sort, gmsg+" (prop keys)")
|
33
|
+
|
34
|
+
exp, com = expected[group_keys], @results[group_keys]
|
35
|
+
exp.keys.each do |property_key|
|
36
|
+
assert_equal exp[property_key], com[property_key], gmsg + " [#{property_key}]"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestGitosisConfig < Test::Unit::TestCase
|
4
|
+
context "config" do
|
5
|
+
|
6
|
+
should "return a config hash if block given" do
|
7
|
+
Gitosis.config do
|
8
|
+
fubar(:one,:two) do
|
9
|
+
puts "blah"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
assert_equal [:one,:two], Gitosis.config.fubar.first
|
13
|
+
assert Gitosis.config.fubar.last.is_a?(Proc)
|
14
|
+
end
|
15
|
+
|
16
|
+
should "return a filename" do
|
17
|
+
Gitosis.config do
|
18
|
+
filename
|
19
|
+
end
|
20
|
+
assert_equal nil, Gitosis.config.filename
|
21
|
+
|
22
|
+
Gitosis.config do
|
23
|
+
filename do
|
24
|
+
puts "blah"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
assert_equal nil, Gitosis.config.filename
|
28
|
+
|
29
|
+
Gitosis.config do
|
30
|
+
filename("fubar","snafu") do
|
31
|
+
puts "blah"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
assert_equal "fubar", Gitosis.config.filename
|
35
|
+
end
|
36
|
+
|
37
|
+
should "return a fork_name_convention" do
|
38
|
+
Gitosis.config do
|
39
|
+
fork_name_convention
|
40
|
+
end
|
41
|
+
assert_equal nil, Gitosis.config.fork_naming_convention
|
42
|
+
|
43
|
+
Gitosis.config do
|
44
|
+
fork_name_convention("one")
|
45
|
+
end
|
46
|
+
assert_equal nil, Gitosis.config.fork_naming_convention
|
47
|
+
|
48
|
+
Gitosis.config do
|
49
|
+
fork_naming_convention("fubar","snafu") do |para,para2|
|
50
|
+
"#{para}+#{para2}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
assert_equal Proc, Gitosis.config.fork_naming_convention.class
|
54
|
+
assert_equal "1+2", Gitosis.config.fork_naming_convention.call("1","2")
|
55
|
+
|
56
|
+
Gitosis.config do
|
57
|
+
fork_naming_convention do |para,para2|
|
58
|
+
"#{para}+#{para2}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
assert_equal Proc, Gitosis.config.fork_naming_convention.class
|
62
|
+
assert_equal "1+2", Gitosis.config.fork_naming_convention.call("1","2")
|
63
|
+
|
64
|
+
Gitosis.config do
|
65
|
+
fork_naming_convention do |*args|
|
66
|
+
'%s+%s' % args.map { |a| a.to_s }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
assert_equal Proc, Gitosis.config.fork_naming_convention.class
|
70
|
+
assert_equal "1+2", Gitosis.config.fork_naming_convention.call("1","2")
|
71
|
+
end
|
72
|
+
|
73
|
+
should "fork_name_convention should complain if arity is not correct" do
|
74
|
+
assert_raises Gitosis::BlockArityIncorrect do
|
75
|
+
Gitosis.config do
|
76
|
+
fork_naming_convention("fubar","snafu") do
|
77
|
+
nil
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
assert_raises Gitosis::BlockArityIncorrect do
|
83
|
+
Gitosis.config do
|
84
|
+
fork_naming_convention("fubar","snafu") do |a|
|
85
|
+
nil
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
assert_raises Gitosis::BlockArityIncorrect do
|
91
|
+
Gitosis.config do
|
92
|
+
fork_naming_convention("fubar","snafu") do |a,b,c|
|
93
|
+
nil
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|