gitolite 0.0.3.alpha → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -21,7 +21,6 @@ module Gitolite
21
21
  end
22
22
 
23
23
  def self.from_file(key)
24
-
25
24
  raise "#{key} does not exist!" unless File.exists?(key)
26
25
 
27
26
  #Get our owner and location
@@ -29,8 +28,23 @@ module Gitolite
29
28
  owner = $1
30
29
  location = $2 || ""
31
30
 
31
+ # Use string key constructor
32
+ self.from_string(File.read(key), owner, location)
33
+ end
34
+
35
+ # Construct a SSHKey from a string
36
+ def self.from_string(key_string, owner, location = "")
37
+ if owner.nil?
38
+ raise ArgumentError, "owner was nil, you must specify an owner"
39
+ end
40
+
32
41
  #Get parts of the key
33
- type, blob, email = File.read(key).split
42
+ type, blob, email = key_string.split
43
+
44
+ # We need at least a type or blob
45
+ if type.nil? || blob.nil?
46
+ raise ArgumentError, "'#{key_string}' is not a valid SSH key string"
47
+ end
34
48
 
35
49
  #If the key didn't have an email, just use the owner
36
50
  if email.nil?
@@ -1,3 +1,3 @@
1
1
  module Gitolite
2
- VERSION = "0.0.3.alpha"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -1,3 +1,4 @@
1
+ require 'plexus'
1
2
  require 'gitolite/config'
2
3
  require 'spec_helper'
3
4
 
@@ -317,6 +318,69 @@ describe Gitolite::Config do
317
318
  c = Gitolite::Config.init
318
319
  lambda{ c.to_file('/home/test.rb') }.should raise_error(ArgumentError)
319
320
  end
321
+
322
+ it 'should resolve group dependencies such that all groups are defined before they are used' do
323
+ c = Gitolite::Config.init
324
+ c.filename = "test_deptree.conf"
325
+
326
+ # Build some groups out of order
327
+ g = Gitolite::Config::Group.new "groupa"
328
+ g.add_users "bob", "@groupb"
329
+ c.add_group(g)
330
+
331
+ g = Gitolite::Config::Group.new "groupb"
332
+ g.add_users "joe", "sam", "susan", "andrew"
333
+ c.add_group(g)
334
+
335
+ g = Gitolite::Config::Group.new "groupc"
336
+ g.add_users "jane", "@groupb", "brandon"
337
+ c.add_group(g)
338
+
339
+ g = Gitolite::Config::Group.new "groupd"
340
+ g.add_users "larry", "@groupc"
341
+ c.add_group(g)
342
+
343
+ # Write the config to a file
344
+ file = c.to_file('/tmp')
345
+
346
+ # Read the conf and make sure our order is correct
347
+ f = File.read(file)
348
+ lines = f.lines.map {|l| l.strip}
349
+
350
+ # Compare the file lines. Spacing is important here since we are doing a direct comparision
351
+ lines[0].should == "@groupb = andrew joe sam susan"
352
+ lines[1].should == "@groupc = @groupb brandon jane"
353
+ lines[2].should == "@groupd = @groupc larry"
354
+ lines[3].should == "@groupa = @groupb bob"
355
+
356
+ # Cleanup
357
+ File.unlink(file)
358
+ end
359
+
360
+ it 'should raise a GroupDependencyError if there is a cyclic dependency' do
361
+ c = Gitolite::Config.init
362
+ c.filename = "test_deptree.conf"
363
+
364
+ # Build some groups out of order
365
+ g = Gitolite::Config::Group.new "groupa"
366
+ g.add_users "bob", "@groupb"
367
+ c.add_group(g)
368
+
369
+ g = Gitolite::Config::Group.new "groupb"
370
+ g.add_users "joe", "sam", "susan", "@groupc"
371
+ c.add_group(g)
372
+
373
+ g = Gitolite::Config::Group.new "groupc"
374
+ g.add_users "jane", "@groupa", "brandon"
375
+ c.add_group(g)
376
+
377
+ g = Gitolite::Config::Group.new "groupd"
378
+ g.add_users "larry", "@groupc"
379
+ c.add_group(g)
380
+
381
+ # Attempt to write the config file
382
+ lambda{ c.to_file('/tmp')}.should raise_error(Gitolite::Config::GroupDependencyError)
383
+ end
320
384
  end
321
385
 
322
386
  describe "#cleanup_config_line" do
@@ -1,3 +1,4 @@
1
+ require 'hashery'
1
2
  require 'gitolite/config/repo'
2
3
  require 'spec_helper'
3
4
 
@@ -57,6 +58,92 @@ describe Gitolite::Config::Repo do
57
58
  end
58
59
  end
59
60
 
61
+ describe "permissions" do
62
+ before(:each) do
63
+ @repo = Gitolite::Config::Repo.new("CoolRepo")
64
+ end
65
+
66
+ it 'should allow adding the permission C' do
67
+ @repo.add_permission("C", "", "bob")
68
+ end
69
+
70
+ it 'should allow adding the permission -' do
71
+ @repo.add_permission("-", "", "bob")
72
+ end
73
+
74
+ it 'should allow adding the permission R' do
75
+ @repo.add_permission("R", "", "bob")
76
+ end
77
+
78
+ it 'should allow adding the permission RM' do
79
+ @repo.add_permission("RM", "", "bob")
80
+ end
81
+
82
+ it 'should allow adding the permission RW' do
83
+ @repo.add_permission("RW", "", "bob")
84
+ end
85
+
86
+ it 'should allow adding the permission RWM' do
87
+ @repo.add_permission("RWM", "", "bob")
88
+ end
89
+
90
+ it 'should allow adding the permission RW+' do
91
+ @repo.add_permission("RW+", "", "bob")
92
+ end
93
+
94
+ it 'should allow adding the permission RW+M' do
95
+ @repo.add_permission("RW+M", "", "bob")
96
+ end
97
+
98
+ it 'should allow adding the permission RWC' do
99
+ @repo.add_permission("RWC", "", "bob")
100
+ end
101
+
102
+ it 'should allow adding the permission RWCM' do
103
+ @repo.add_permission("RWCM", "", "bob")
104
+ end
105
+
106
+ it 'should allow adding the permission RW+C' do
107
+ @repo.add_permission("RW+C", "", "bob")
108
+ end
109
+
110
+ it 'should allow adding the permission RW+CM' do
111
+ @repo.add_permission("RW+CM", "", "bob")
112
+ end
113
+
114
+ it 'should allow adding the permission RWD' do
115
+ @repo.add_permission("RWD", "", "bob")
116
+ end
117
+
118
+ it 'should allow adding the permission RWDM' do
119
+ @repo.add_permission("RWDM", "", "bob")
120
+ end
121
+
122
+ it 'should allow adding the permission RW+D' do
123
+ @repo.add_permission("RW+D", "", "bob")
124
+ end
125
+
126
+ it 'should allow adding the permission RW+DM' do
127
+ @repo.add_permission("RW+DM", "", "bob")
128
+ end
129
+
130
+ it 'should allow adding the permission RWCD' do
131
+ @repo.add_permission("RWCD", "", "bob")
132
+ end
133
+
134
+ it 'should allow adding the permission RWCDM' do
135
+ @repo.add_permission("RWCDM", "", "bob")
136
+ end
137
+
138
+ it 'should allow adding the permission RW+CD' do
139
+ @repo.add_permission("RW+CD", "", "bob")
140
+ end
141
+
142
+ it 'should allow adding the permission RW+CDM' do
143
+ @repo.add_permission("RW+CDM", "", "bob")
144
+ end
145
+ end
146
+
60
147
  describe 'git config options' do
61
148
  it 'should allow setting a git configuration option' do
62
149
  email = "bob@zilla.com"
@@ -4,7 +4,67 @@ include Gitolite
4
4
 
5
5
  describe Gitolite::SSHKey do
6
6
  key_dir = File.join(File.dirname(__FILE__),'keys')
7
-
7
+
8
+ describe "#from_string" do
9
+ it 'should construct an SSH key from a string' do
10
+ key = File.join(key_dir, 'bob.pub')
11
+ key_string = File.read(key)
12
+ s = SSHKey.from_string(key_string, "bob")
13
+
14
+ s.owner.should == 'bob'
15
+ s.location.should == ""
16
+ s.blob.should == key_string.split[1]
17
+ end
18
+
19
+ it 'should raise an ArgumentError when an owner isnt specified' do
20
+ key_string = "not_a_real_key"
21
+ lambda { SSHKey.from_string(key_string) }.should raise_error
22
+ end
23
+
24
+ it 'should have a location when one is specified' do
25
+ key = File.join(key_dir, 'bob.pub')
26
+ key_string = File.read(key)
27
+ s = SSHKey.from_string(key_string, "bob", "kansas")
28
+
29
+ s.owner.should == 'bob'
30
+ s.location.should == "kansas"
31
+ s.blob.should == key_string.split[1]
32
+ end
33
+
34
+ it 'should raise an ArgumentError when owner is nil' do
35
+ lambda { SSHKey.from_string("bad_string", nil) }.should raise_error
36
+ end
37
+
38
+ it 'should raise an ArgumentError when we get an invalid SSHKey string' do
39
+ lambda { SSHKey.from_string("bad_string", "bob") }.should raise_error
40
+ end
41
+ end
42
+
43
+ describe "#from_file" do
44
+ it 'should load a key from a file' do
45
+ key = File.join(key_dir, 'bob.pub')
46
+ s = SSHKey.from_file(key)
47
+ key_string = File.read(key).split
48
+
49
+ s.owner.should == "bob"
50
+ s.blob.should == key_string[1]
51
+ end
52
+
53
+ it 'should load a key with a location from a file' do
54
+ key = File.join(key_dir, 'bob@desktop.pub')
55
+ s = SSHKey.from_file(key)
56
+ s.owner.should == 'bob'
57
+ s.location.should == 'desktop'
58
+ end
59
+
60
+ it 'should load a key with owner and location from a file' do
61
+ key = File.join(key_dir, 'joe-bob@god-zilla.com@desktop.pub')
62
+ s = SSHKey.from_file(key)
63
+ s.owner.should == 'joe-bob@god-zilla.com'
64
+ s.location.should == 'desktop'
65
+ end
66
+ end
67
+
8
68
  describe '#owner' do
9
69
  it 'owner should be bob for bob.pub' do
10
70
  key = File.join(key_dir, 'bob.pub')
@@ -136,92 +196,92 @@ describe Gitolite::SSHKey do
136
196
  s.owner.should == s.email
137
197
  end
138
198
  end
139
-
199
+
140
200
  describe '#new' do
141
201
  it 'should create a valid ssh key' do
142
202
  type = "ssh-rsa"
143
203
  blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
144
204
  email = Forgery::Internet.email_address
145
-
205
+
146
206
  s = SSHKey.new(type, blob, email)
147
-
207
+
148
208
  s.to_s.should == [type, blob, email].join(' ')
149
209
  s.owner.should == email
150
210
  end
151
-
211
+
152
212
  it 'should create a valid ssh key while specifying an owner' do
153
213
  type = "ssh-rsa"
154
214
  blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
155
215
  email = Forgery::Internet.email_address
156
216
  owner = Forgery::Name.first_name
157
-
217
+
158
218
  s = SSHKey.new(type, blob, email, owner)
159
-
219
+
160
220
  s.to_s.should == [type, blob, email].join(' ')
161
221
  s.owner.should == owner
162
222
  end
163
-
223
+
164
224
  it 'should create a valid ssh key while specifying an owner and location' do
165
225
  type = "ssh-rsa"
166
226
  blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
167
227
  email = Forgery::Internet.email_address
168
228
  owner = Forgery::Name.first_name
169
229
  location = Forgery::Name.location
170
-
230
+
171
231
  s = SSHKey.new(type, blob, email, owner, location)
172
-
232
+
173
233
  s.to_s.should == [type, blob, email].join(' ')
174
234
  s.owner.should == owner
175
235
  s.location.should == location
176
236
  end
177
237
  end
178
-
238
+
179
239
  describe '#filename' do
180
240
  it 'should create a filename that is the <email>.pub' do
181
241
  type = "ssh-rsa"
182
242
  blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
183
243
  email = Forgery::Internet.email_address
184
-
244
+
185
245
  s = SSHKey.new(type, blob, email)
186
-
246
+
187
247
  s.filename.should == "#{email}.pub"
188
248
  end
189
-
249
+
190
250
  it 'should create a filename that is the <owner>.pub' do
191
251
  type = "ssh-rsa"
192
252
  blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
193
253
  email = Forgery::Internet.email_address
194
254
  owner = Forgery::Name.first_name
195
-
255
+
196
256
  s = SSHKey.new(type, blob, email, owner)
197
-
257
+
198
258
  s.filename.should == "#{owner}.pub"
199
259
  end
200
-
260
+
201
261
  it 'should create a filename that is the <email>@<location>.pub' do
202
262
  type = "ssh-rsa"
203
263
  blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
204
264
  email = Forgery::Internet.email_address
205
265
  location = Forgery::Basic.text(:at_least => 8, :at_most => 15)
206
-
266
+
207
267
  s = SSHKey.new(type, blob, email, nil, location)
208
-
268
+
209
269
  s.filename.should == "#{email}@#{location}.pub"
210
270
  end
211
-
271
+
212
272
  it 'should create a filename that is the <owner>@<location>.pub' do
213
273
  type = "ssh-rsa"
214
274
  blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
215
275
  email = Forgery::Internet.email_address
216
276
  owner = Forgery::Name.first_name
217
277
  location = Forgery::Basic.text(:at_least => 8, :at_most => 15)
218
-
278
+
219
279
  s = SSHKey.new(type, blob, email, owner, location)
220
-
280
+
221
281
  s.filename.should == "#{owner}@#{location}.pub"
222
282
  end
223
283
  end
224
-
284
+
225
285
  describe '#to_file' do
226
286
  it 'should write a "valid" SSH public key to the file system' do
227
287
  type = "ssh-rsa"
@@ -229,40 +289,40 @@ describe Gitolite::SSHKey do
229
289
  email = Forgery::Internet.email_address
230
290
  owner = Forgery::Name.first_name
231
291
  location = Forgery::Basic.text(:at_least => 8, :at_most => 15)
232
-
292
+
233
293
  s = SSHKey.new(type, blob, email, owner, location)
234
-
294
+
235
295
  tmpdir = Dir.tmpdir
236
296
  s.to_file(tmpdir)
237
-
297
+
238
298
  s.to_s.should == File.read(File.join(tmpdir, s.filename))
239
299
  end
240
-
300
+
241
301
  it 'should return the filename written' do
242
302
  type = "ssh-rsa"
243
303
  blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
244
304
  email = Forgery::Internet.email_address
245
305
  owner = Forgery::Name.first_name
246
306
  location = Forgery::Basic.text(:at_least => 8, :at_most => 15)
247
-
307
+
248
308
  s = SSHKey.new(type, blob, email, owner, location)
249
-
309
+
250
310
  tmpdir = Dir.tmpdir
251
-
252
-
311
+
312
+
253
313
  s.to_file(tmpdir).should == File.join(tmpdir, s.filename)
254
314
  end
255
315
  end
256
-
316
+
257
317
  describe '==' do
258
318
  it 'should have two keys equalling one another' do
259
319
  type = "ssh-rsa"
260
320
  blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
261
321
  email = Forgery::Internet.email_address
262
-
322
+
263
323
  s1 = SSHKey.new(type, blob, email)
264
324
  s2 = SSHKey.new(type, blob, email)
265
-
325
+
266
326
  s1.should == s2
267
327
  end
268
328
  end
metadata CHANGED
@@ -1,135 +1,143 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: gitolite
3
- version: !ruby/object:Gem::Version
4
- hash: -1851332174
5
- prerelease: 6
6
- segments:
7
- - 0
8
- - 0
9
- - 3
10
- - alpha
11
- version: 0.0.3.alpha
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
12
6
  platform: ruby
13
- authors:
7
+ authors:
14
8
  - Stafford Brunk
15
9
  autorequire:
16
10
  bindir: bin
17
11
  cert_chain: []
18
-
19
- date: 2011-10-23 00:00:00 Z
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2012-04-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: rspec
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
18
+ requirements:
27
19
  - - ~>
28
- - !ruby/object:Gem::Version
29
- hash: 23
30
- segments:
31
- - 2
32
- - 6
33
- - 0
34
- version: 2.6.0
20
+ - !ruby/object:Gem::Version
21
+ version: 2.9.0
35
22
  type: :development
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: forgery
39
23
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
41
25
  none: false
42
- requirements:
26
+ requirements:
43
27
  - - ~>
44
- - !ruby/object:Gem::Version
45
- hash: 11
46
- segments:
47
- - 0
48
- - 5
49
- - 0
28
+ - !ruby/object:Gem::Version
29
+ version: 2.9.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: forgery
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
50
37
  version: 0.5.0
51
38
  type: :development
52
- version_requirements: *id002
53
- - !ruby/object:Gem::Dependency
54
- name: rdoc
55
39
  prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.5.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rdoc
48
+ requirement: !ruby/object:Gem::Requirement
57
49
  none: false
58
- requirements:
50
+ requirements:
59
51
  - - ~>
60
- - !ruby/object:Gem::Version
61
- hash: 43
62
- segments:
63
- - 3
64
- - 9
65
- - 4
66
- version: 3.9.4
52
+ - !ruby/object:Gem::Version
53
+ version: '3.12'
67
54
  type: :development
68
- version_requirements: *id003
69
- - !ruby/object:Gem::Dependency
70
- name: rcov
71
55
  prerelease: false
72
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
73
57
  none: false
74
- requirements:
58
+ requirements:
75
59
  - - ~>
76
- - !ruby/object:Gem::Version
77
- hash: 45
78
- segments:
79
- - 0
80
- - 9
81
- - 11
82
- version: 0.9.11
60
+ - !ruby/object:Gem::Version
61
+ version: '3.12'
62
+ - !ruby/object:Gem::Dependency
63
+ name: simplecov
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.6.2
83
70
  type: :development
84
- version_requirements: *id004
85
- - !ruby/object:Gem::Dependency
86
- name: grit
87
71
  prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
89
73
  none: false
90
- requirements:
74
+ requirements:
91
75
  - - ~>
92
- - !ruby/object:Gem::Version
93
- hash: 29
94
- segments:
95
- - 2
96
- - 4
97
- - 1
98
- version: 2.4.1
76
+ - !ruby/object:Gem::Version
77
+ version: 0.6.2
78
+ - !ruby/object:Gem::Dependency
79
+ name: grit
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 2.5.0
99
86
  type: :runtime
100
- version_requirements: *id005
101
- - !ruby/object:Gem::Dependency
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 2.5.0
94
+ - !ruby/object:Gem::Dependency
102
95
  name: hashery
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 1.5.0
102
+ type: :runtime
103
103
  prerelease: false
104
- requirement: &id006 !ruby/object:Gem::Requirement
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 1.5.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: plexus
112
+ requirement: !ruby/object:Gem::Requirement
105
113
  none: false
106
- requirements:
114
+ requirements:
107
115
  - - ~>
108
- - !ruby/object:Gem::Version
109
- hash: 7
110
- segments:
111
- - 1
112
- - 4
113
- - 0
114
- version: 1.4.0
116
+ - !ruby/object:Gem::Version
117
+ version: 0.5.10
115
118
  type: :runtime
116
- version_requirements: *id006
117
- description: This gem is designed to provide a Ruby interface to the gitolite git backend system. This gem aims to provide all management functionality that is available via the gitolite-admin repository (like SSH keys, repository permissions, etc)
118
- email:
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.5.10
126
+ description: This gem is designed to provide a Ruby interface to the gitolite git
127
+ backend system. This gem aims to provide all management functionality that is available
128
+ via the gitolite-admin repository (like SSH keys, repository permissions, etc)
129
+ email:
119
130
  - wingrunr21@gmail.com
120
131
  executables: []
121
-
122
132
  extensions: []
123
-
124
133
  extra_rdoc_files: []
125
-
126
- files:
134
+ files:
127
135
  - .gemtest
128
136
  - .gitignore
129
137
  - Gemfile
130
138
  - Gemfile.lock
131
139
  - LICENSE
132
- - README.rdoc
140
+ - README.markdown
133
141
  - Rakefile
134
142
  - gitolite.gemspec
135
143
  - lib/gitolite.rb
@@ -161,40 +169,30 @@ files:
161
169
  - spec/ssh_key_spec.rb
162
170
  homepage: https://www.github.com/wingrunr21/gitolite
163
171
  licenses: []
164
-
165
172
  post_install_message:
166
173
  rdoc_options: []
167
-
168
- require_paths:
174
+ require_paths:
169
175
  - lib
170
- required_ruby_version: !ruby/object:Gem::Requirement
176
+ required_ruby_version: !ruby/object:Gem::Requirement
171
177
  none: false
172
- requirements:
173
- - - ">="
174
- - !ruby/object:Gem::Version
175
- hash: 3
176
- segments:
177
- - 0
178
- version: "0"
179
- required_rubygems_version: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ required_rubygems_version: !ruby/object:Gem::Requirement
180
183
  none: false
181
- requirements:
182
- - - ">"
183
- - !ruby/object:Gem::Version
184
- hash: 25
185
- segments:
186
- - 1
187
- - 3
188
- - 1
189
- version: 1.3.1
184
+ requirements:
185
+ - - ! '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
190
188
  requirements: []
191
-
192
189
  rubyforge_project: gitolite
193
- rubygems_version: 1.8.10
190
+ rubygems_version: 1.8.21
194
191
  signing_key:
195
192
  specification_version: 3
196
- summary: A Ruby gem for manipulating the gitolite git backend via the gitolite-admin repository.
197
- test_files:
193
+ summary: A Ruby gem for manipulating the gitolite git backend via the gitolite-admin
194
+ repository.
195
+ test_files:
198
196
  - spec/concurrency_spec.rb
199
197
  - spec/config_spec.rb
200
198
  - spec/configs/complicated.conf