gitolite 0.0.1.alpha → 0.0.2.alpha
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/Gemfile.lock +3 -1
- data/README.rdoc +61 -3
- data/gitolite.gemspec +1 -0
- data/lib/gitolite/config.rb +40 -6
- data/lib/gitolite/gitolite_admin.rb +29 -19
- data/lib/gitolite/ssh_key.rb +9 -8
- data/lib/gitolite/version.rb +1 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/ssh_key_spec.rb +169 -36
- metadata +52 -65
data/Gemfile.lock
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
gitolite (0.1.
|
4
|
+
gitolite (0.0.1.alpha)
|
5
5
|
grit (~> 2.4.1)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
10
|
diff-lcs (1.1.2)
|
11
|
+
forgery (0.3.6)
|
11
12
|
grit (2.4.1)
|
12
13
|
diff-lcs (~> 1.1)
|
13
14
|
mime-types (~> 1.15)
|
@@ -26,5 +27,6 @@ PLATFORMS
|
|
26
27
|
x86-mingw32
|
27
28
|
|
28
29
|
DEPENDENCIES
|
30
|
+
forgery (~> 0.3.6)
|
29
31
|
gitolite!
|
30
32
|
rspec (~> 2.4.0)
|
data/README.rdoc
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
-
= gitolite -
|
1
|
+
= gitolite - In alpha
|
2
2
|
|
3
3
|
This gem is designed to provide a Ruby interface to the {gitolite}[https://github.com/sitaramc/gitolite] git backend system. I am aiming to provide all management functionality that is available via the gitolite-admin repository (like SSH keys, repository permissions, etc)
|
4
4
|
|
5
|
+
This gem is still under very active development. There are a number of issues with it still. It is not ready for production use.
|
6
|
+
|
7
|
+
== Features
|
8
|
+
* Allows for the creation and management of repos within gitolite
|
9
|
+
* Allows for the creation and deletion of SSH keys within gitolite
|
10
|
+
|
5
11
|
== Requirements
|
6
12
|
* Ruby 1.9.2 or higher
|
7
13
|
* a working {gitolite}[https://github.com/sitaramc/gitolite] installation
|
@@ -9,14 +15,66 @@ This gem is designed to provide a Ruby interface to the {gitolite}[https://githu
|
|
9
15
|
|
10
16
|
== Installation
|
11
17
|
|
12
|
-
gem install gitolite
|
18
|
+
gem install gitolite --pre
|
13
19
|
|
14
20
|
== Usage
|
15
21
|
|
22
|
+
=== Load a gitolite-admin repo
|
23
|
+
|
24
|
+
require 'gitolite'
|
25
|
+
ga_repo = Gitolite::GitoliteAdmin.new("/path/to/gitolite/admin/repo")
|
26
|
+
|
27
|
+
For now, this method can only be called on an existing gitolite-admin repo. Support for bootstrapping a gitolite-repo will be added in the future (but will never be recommended).
|
28
|
+
|
29
|
+
=== Repo management
|
30
|
+
|
31
|
+
repo = Config::Repo.new("AwesomeRepo")
|
32
|
+
|
33
|
+
#For a list of permissions, see https://github.com/sitaramc/gitolite/blob/pu/doc/gitolite.conf.mkd
|
34
|
+
repo.add_permission("RW+", "", "bob", "joe", "susan")
|
35
|
+
|
36
|
+
#Add repo
|
37
|
+
ga_repo.add_repo(repo)
|
38
|
+
|
39
|
+
#Delete repo
|
40
|
+
ga_repo.rm_repo(repo)
|
41
|
+
|
42
|
+
=== SSH Key Management
|
43
|
+
|
44
|
+
#Two ways to create keys: manually or from an existing key
|
45
|
+
key = Gitolite::SSHKey.new("ssh-rsa", "big-public-key-blob", "email")
|
46
|
+
key2 = Gitolite::SSHKey.from_file("/path/to/ssh/key.pub")
|
47
|
+
|
48
|
+
#Add the keys
|
49
|
+
ga_repo.add_key(key)
|
50
|
+
ga_repo.add_key(key2)
|
51
|
+
|
52
|
+
#Remove key2
|
53
|
+
ga_repo.rm_key(key2)
|
54
|
+
|
55
|
+
=== Save changes
|
56
|
+
|
57
|
+
ga_repo.save
|
58
|
+
|
59
|
+
When this method is called, all changes get written to the file system and staged in git. For the time being, gitolite assumes full control of the gitolite-admin repository. This means that any keys in the keydir that are not being tracked will be removed and any human changes to gitolite.conf will be erased.
|
60
|
+
|
61
|
+
=== Apply changes
|
62
|
+
ga_repo.apply
|
63
|
+
|
64
|
+
This method will commit all changes with a generic message (will be improved upon later) and push to <tt>origin master</tt>.
|
65
|
+
|
66
|
+
=== Save and apply
|
67
|
+
ga_repo.save_and_apply
|
68
|
+
|
16
69
|
== Caveats
|
17
70
|
=== 1.8.x compatibility
|
18
|
-
This gem should work properly on Ruby 1.8.x with the exception of deny rules. In order to fully support Ruby < 1.9.x, an ordered Hash is required
|
71
|
+
This gem should work properly on Ruby 1.8.x with the exception of deny rules. In order to fully support Ruby < 1.9.x, an ordered Hash is required. The one implemented by ActiveSupport could probably be used. Support will be added if there appears to be a demand for it.
|
19
72
|
|
20
73
|
== Documentation
|
74
|
+
* Rdoc is coming soon
|
21
75
|
|
22
76
|
== Future
|
77
|
+
* support folders in the keydir
|
78
|
+
* support includes tags
|
79
|
+
* support bootstrapping a gitolite-admin repo
|
80
|
+
* cleanup methods to make adding and removing easier (like add_key should accept an array of keys)
|
data/gitolite.gemspec
CHANGED
data/lib/gitolite/config.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Gitolite
|
2
2
|
class Config
|
3
|
-
attr_accessor :repos, :groups
|
3
|
+
attr_accessor :repos, :groups, :filename
|
4
4
|
|
5
5
|
def initialize(config)
|
6
6
|
@repos = {}
|
7
7
|
@groups = Hash.new { |k,v| k[v] = [] }
|
8
|
+
@filename = File.basename(config)
|
8
9
|
process_config(config)
|
9
10
|
end
|
10
11
|
|
@@ -21,7 +22,7 @@ module Gitolite
|
|
21
22
|
@config = {}
|
22
23
|
end
|
23
24
|
|
24
|
-
def add_permission(perm, refex, users)
|
25
|
+
def add_permission(perm, refex, *users)
|
25
26
|
if ALLOWED_PERMISSIONS.include? perm
|
26
27
|
@permissions[perm][refex].concat users
|
27
28
|
else
|
@@ -38,7 +39,15 @@ module Gitolite
|
|
38
39
|
end
|
39
40
|
|
40
41
|
def to_s
|
41
|
-
@name
|
42
|
+
repo = "repo #{@name}\n"
|
43
|
+
|
44
|
+
@permissions.each do |perm, list|
|
45
|
+
list.each do |refex, users|
|
46
|
+
repo += " " + perm.ljust(6) + refex.ljust(20) + "= " + users.join(' ') + "\n"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
repo
|
42
51
|
end
|
43
52
|
|
44
53
|
#Gets raised if a permission that isn't in the allowed
|
@@ -47,6 +56,33 @@ module Gitolite
|
|
47
56
|
end
|
48
57
|
end
|
49
58
|
|
59
|
+
#TODO: merge repo unless overwrite = true
|
60
|
+
def add_repo(repo, overwrite = false)
|
61
|
+
raise "Repo must be of type Gitolite::Config::Repo!" unless repo.instance_of? Gitolite::Config::Repo
|
62
|
+
@repos[repo.name] = repo
|
63
|
+
end
|
64
|
+
|
65
|
+
def rm_repo(repo)
|
66
|
+
raise "Repo must be of type Gitolite::Config::Repo!" unless repo.instance_of? Gitolite::Config::Repo
|
67
|
+
@repos.delete repo.name
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_file(path)
|
71
|
+
new_conf = File.join(path, @filename)
|
72
|
+
File.open(new_conf, "w") do |f|
|
73
|
+
@groups.each do |k,v|
|
74
|
+
members = v.join(' ')
|
75
|
+
f.write "#{k.ljust(20)}= #{members}\n"
|
76
|
+
end
|
77
|
+
|
78
|
+
@repos.each do |k, v|
|
79
|
+
f.write v.to_s
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
new_conf
|
84
|
+
end
|
85
|
+
|
50
86
|
private
|
51
87
|
#Based on
|
52
88
|
#https://github.com/sitaramc/gitolite/blob/pu/src/gl-compile-conf#cleanup_conf_line
|
@@ -116,8 +152,6 @@ module Gitolite
|
|
116
152
|
puts "'#{line}'"
|
117
153
|
end
|
118
154
|
end
|
119
|
-
|
120
|
-
|
121
155
|
end
|
122
156
|
end
|
123
|
-
end
|
157
|
+
end
|
@@ -2,39 +2,42 @@ module Gitolite
|
|
2
2
|
class GitoliteAdmin
|
3
3
|
attr_accessor :gl_admin, :ssh_keys, :config
|
4
4
|
|
5
|
-
CONF = "
|
6
|
-
|
5
|
+
CONF = "gitolite.conf"
|
6
|
+
CONFDIR = "conf"
|
7
|
+
KEYDIR = "keydir"
|
7
8
|
|
8
9
|
#Intialize with the path to
|
9
10
|
#the gitolite-admin repository
|
10
11
|
def initialize(path, options = {})
|
11
12
|
@gl_admin = Grit::Repo.new(path)
|
12
13
|
|
13
|
-
@path = path
|
14
14
|
@conf = options[:conf] || CONF
|
15
|
+
@confdir = options[:confdir] || CONFDIR
|
15
16
|
@keydir = options[:keydir] || KEYDIR
|
16
17
|
|
17
|
-
@ssh_keys = load_keys(File.join(
|
18
|
-
@config = Config.new(File.join(
|
18
|
+
@ssh_keys = load_keys(File.join(path, @keydir))
|
19
|
+
@config = Config.new(File.join(path, @confdir, @conf))
|
19
20
|
end
|
20
21
|
|
21
22
|
#Writes all aspects out to the file system
|
22
23
|
#will also stage all changes
|
23
24
|
def save
|
25
|
+
Dir.chdir(@gl_admin.working_dir)
|
26
|
+
|
24
27
|
#Process config file
|
28
|
+
new_conf = @config.to_file(@confdir)
|
29
|
+
@gl_admin.add(new_conf)
|
25
30
|
|
26
31
|
#Process ssh keys
|
27
|
-
files = list_keys(
|
32
|
+
files = list_keys(@keydir).map{|f| File.basename f}
|
28
33
|
keys = @ssh_keys.values.map{|f| f.map {|t| t.filename}}.flatten
|
29
|
-
|
30
|
-
#Remove all keys we don't have a record for
|
34
|
+
|
31
35
|
to_remove = (files - keys).map { |f| File.join(@keydir, f)}
|
32
|
-
@gl_admin.remove(to_remove)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
f.write key.to_s
|
36
|
+
@gl_admin.remove(to_remove)
|
37
|
+
|
38
|
+
@ssh_keys.each_value do |key|
|
39
|
+
key.each do |k|
|
40
|
+
@gl_admin.add(k.to_file(@keydir))
|
38
41
|
end
|
39
42
|
end
|
40
43
|
end
|
@@ -42,18 +45,22 @@ module Gitolite
|
|
42
45
|
#commits all staged changes and pushes back
|
43
46
|
#to origin
|
44
47
|
def apply
|
45
|
-
|
48
|
+
#TODO: generate a better commit message
|
49
|
+
@gl_admin.commit_index("Commit by gitolite gem")
|
50
|
+
@gl_admin.git.push({}, "origin", "master")
|
46
51
|
end
|
47
52
|
|
48
53
|
#Calls save and apply in order
|
49
54
|
def save_and_apply
|
55
|
+
self.save
|
56
|
+
self.apply
|
50
57
|
end
|
51
|
-
|
58
|
+
|
52
59
|
def add_key(key)
|
53
60
|
raise "Key must be of type Gitolite::SSHKey!" unless key.instance_of? Gitolite::SSHKey
|
54
61
|
@ssh_keys[key.owner] << key
|
55
62
|
end
|
56
|
-
|
63
|
+
|
57
64
|
def rm_key(key)
|
58
65
|
@ssh_keys[key.owner].delete key
|
59
66
|
end
|
@@ -73,10 +80,13 @@ module Gitolite
|
|
73
80
|
|
74
81
|
keys
|
75
82
|
end
|
76
|
-
|
83
|
+
|
77
84
|
def list_keys(path)
|
85
|
+
old_path = Dir.pwd
|
78
86
|
Dir.chdir(path)
|
79
|
-
Dir.glob("**/*.pub")
|
87
|
+
keys = Dir.glob("**/*.pub")
|
88
|
+
Dir.chdir(old_path)
|
89
|
+
keys
|
80
90
|
end
|
81
91
|
end
|
82
92
|
end
|
data/lib/gitolite/ssh_key.rb
CHANGED
@@ -15,7 +15,7 @@ module Gitolite
|
|
15
15
|
@type = type
|
16
16
|
@blob = blob
|
17
17
|
@email = email
|
18
|
-
|
18
|
+
|
19
19
|
@owner = owner || email
|
20
20
|
@location = location
|
21
21
|
end
|
@@ -36,26 +36,28 @@ module Gitolite
|
|
36
36
|
if email.nil?
|
37
37
|
email = owner
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
self.new(type, blob, email, owner, location)
|
41
41
|
end
|
42
42
|
|
43
43
|
def to_s
|
44
44
|
[@type, @blob, @email].join(' ')
|
45
45
|
end
|
46
|
-
|
47
|
-
def to_file(
|
48
|
-
File.
|
46
|
+
|
47
|
+
def to_file(path)
|
48
|
+
key_file = File.join(path, self.filename)
|
49
|
+
File.open(key_file, "w") do |f|
|
49
50
|
f.write (self.to_s)
|
50
51
|
end
|
52
|
+
key_file
|
51
53
|
end
|
52
|
-
|
54
|
+
|
53
55
|
def filename
|
54
56
|
file = @owner
|
55
57
|
file += "@#{@location}" unless @location.empty?
|
56
58
|
file += ".pub"
|
57
59
|
end
|
58
|
-
|
60
|
+
|
59
61
|
def ==(key)
|
60
62
|
@type == key.type &&
|
61
63
|
@blob == key.blob &&
|
@@ -65,4 +67,3 @@ module Gitolite
|
|
65
67
|
end
|
66
68
|
end
|
67
69
|
end
|
68
|
-
|
data/lib/gitolite/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
data/spec/ssh_key_spec.rb
CHANGED
@@ -1,111 +1,114 @@
|
|
1
|
+
require 'spec_helper'
|
1
2
|
require 'gitolite/ssh_key'
|
2
3
|
include Gitolite
|
3
4
|
|
4
5
|
describe Gitolite::SSHKey do
|
6
|
+
key_dir = File.join(File.dirname(__FILE__),'keys')
|
7
|
+
|
5
8
|
describe '#owner' do
|
6
9
|
it 'owner should be bob for bob.pub' do
|
7
|
-
key = File.join(
|
8
|
-
s = SSHKey.
|
10
|
+
key = File.join(key_dir, 'bob.pub')
|
11
|
+
s = SSHKey.from_file(key)
|
9
12
|
s.owner.should == 'bob'
|
10
13
|
end
|
11
14
|
|
12
15
|
it 'owner should be bob for bob@desktop.pub' do
|
13
|
-
key = File.join(
|
14
|
-
s = SSHKey.
|
16
|
+
key = File.join(key_dir, 'bob@desktop.pub')
|
17
|
+
s = SSHKey.from_file(key)
|
15
18
|
s.owner.should == 'bob'
|
16
19
|
end
|
17
20
|
|
18
21
|
it 'owner should be bob@zilla.com for bob@zilla.com.pub' do
|
19
|
-
key = File.join(
|
20
|
-
s = SSHKey.
|
22
|
+
key = File.join(key_dir, 'bob@zilla.com.pub')
|
23
|
+
s = SSHKey.from_file(key)
|
21
24
|
s.owner.should == 'bob@zilla.com'
|
22
25
|
end
|
23
26
|
|
24
27
|
it 'owner should be bob@zilla.com for bob@zilla.com@desktop.pub' do
|
25
|
-
key = File.join(
|
26
|
-
s = SSHKey.
|
28
|
+
key = File.join(key_dir, 'bob@zilla.com@desktop.pub')
|
29
|
+
s = SSHKey.from_file(key)
|
27
30
|
s.owner.should == 'bob@zilla.com'
|
28
31
|
end
|
29
32
|
|
30
33
|
it 'owner should be jakub123 for jakub123.pub' do
|
31
|
-
key = File.join(
|
32
|
-
s = SSHKey.
|
34
|
+
key = File.join(key_dir, 'jakub123.pub')
|
35
|
+
s = SSHKey.from_file(key)
|
33
36
|
s.owner.should == 'jakub123'
|
34
37
|
end
|
35
38
|
|
36
39
|
it 'owner should be jakub123@foo.net for jakub123@foo.net.pub' do
|
37
|
-
key = File.join(
|
38
|
-
s = SSHKey.
|
40
|
+
key = File.join(key_dir, 'jakub123@foo.net.pub')
|
41
|
+
s = SSHKey.from_file(key)
|
39
42
|
s.owner.should == 'jakub123@foo.net'
|
40
43
|
end
|
41
44
|
|
42
45
|
it 'owner should be joe@sch.ool.edu for joe@sch.ool.edu' do
|
43
|
-
key = File.join(
|
44
|
-
s = SSHKey.
|
46
|
+
key = File.join(key_dir, 'joe@sch.ool.edu.pub')
|
47
|
+
s = SSHKey.from_file(key)
|
45
48
|
s.owner.should == 'joe@sch.ool.edu'
|
46
49
|
end
|
47
50
|
|
48
51
|
it 'owner should be joe@sch.ool.edu for joe@sch.ool.edu@desktop.pub' do
|
49
|
-
key = File.join(
|
50
|
-
s = SSHKey.
|
52
|
+
key = File.join(key_dir, 'joe@sch.ool.edu@desktop.pub')
|
53
|
+
s = SSHKey.from_file(key)
|
51
54
|
s.owner.should == 'joe@sch.ool.edu'
|
52
55
|
end
|
53
56
|
end
|
54
57
|
|
55
58
|
describe '#location' do
|
56
59
|
it 'location should be "" for bob.pub' do
|
57
|
-
key = File.join(
|
58
|
-
s = SSHKey.
|
60
|
+
key = File.join(key_dir, 'bob.pub')
|
61
|
+
s = SSHKey.from_file(key)
|
59
62
|
s.location.should == ''
|
60
63
|
end
|
61
64
|
|
62
65
|
it 'location should be "desktop" for bob@desktop.pub' do
|
63
|
-
key = File.join(
|
64
|
-
s = SSHKey.
|
66
|
+
key = File.join(key_dir, 'bob@desktop.pub')
|
67
|
+
s = SSHKey.from_file(key)
|
65
68
|
s.location.should == 'desktop'
|
66
69
|
end
|
67
70
|
|
68
71
|
it 'location should be "" for bob@zilla.com.pub' do
|
69
|
-
key = File.join(
|
70
|
-
s = SSHKey.
|
72
|
+
key = File.join(key_dir, 'bob@zilla.com.pub')
|
73
|
+
s = SSHKey.from_file(key)
|
71
74
|
s.location.should == ''
|
72
75
|
end
|
73
76
|
|
74
77
|
it 'location should be "desktop" for bob@zilla.com@desktop.pub' do
|
75
|
-
key = File.join(
|
76
|
-
s = SSHKey.
|
78
|
+
key = File.join(key_dir, 'bob@zilla.com@desktop.pub')
|
79
|
+
s = SSHKey.from_file(key)
|
77
80
|
s.location.should == 'desktop'
|
78
81
|
end
|
79
82
|
|
80
83
|
it 'location should be "" for jakub123.pub' do
|
81
|
-
key = File.join(
|
82
|
-
s = SSHKey.
|
84
|
+
key = File.join(key_dir, 'jakub123.pub')
|
85
|
+
s = SSHKey.from_file(key)
|
83
86
|
s.location.should == ''
|
84
87
|
end
|
85
88
|
|
86
89
|
it 'location should be "" for jakub123@foo.net.pub' do
|
87
|
-
key = File.join(
|
88
|
-
s = SSHKey.
|
90
|
+
key = File.join(key_dir, 'jakub123@foo.net.pub')
|
91
|
+
s = SSHKey.from_file(key)
|
89
92
|
s.location.should == ''
|
90
93
|
end
|
91
94
|
|
92
95
|
it 'location should be "" for joe@sch.ool.edu' do
|
93
|
-
key = File.join(
|
94
|
-
s = SSHKey.
|
96
|
+
key = File.join(key_dir, 'joe@sch.ool.edu.pub')
|
97
|
+
s = SSHKey.from_file(key)
|
95
98
|
s.location.should == ''
|
96
99
|
end
|
97
100
|
|
98
101
|
it 'location should be "desktop" for joe@sch.ool.edu@desktop.pub' do
|
99
|
-
key = File.join(
|
100
|
-
s = SSHKey.
|
102
|
+
key = File.join(key_dir, 'joe@sch.ool.edu@desktop.pub')
|
103
|
+
s = SSHKey.from_file(key)
|
101
104
|
s.location.should == 'desktop'
|
102
105
|
end
|
103
106
|
end
|
104
107
|
|
105
108
|
describe '#keys' do
|
106
109
|
it 'should load ssh key properly' do
|
107
|
-
key = File.join(
|
108
|
-
s = SSHKey.
|
110
|
+
key = File.join(key_dir, 'bob.pub')
|
111
|
+
s = SSHKey.from_file(key)
|
109
112
|
parts = File.read(key).split #should get type, blob, email
|
110
113
|
|
111
114
|
s.type.should == parts[0]
|
@@ -116,9 +119,139 @@ describe Gitolite::SSHKey do
|
|
116
119
|
|
117
120
|
describe '#email' do
|
118
121
|
it 'should use owner if email is missing' do
|
119
|
-
key = File.join(
|
120
|
-
s = SSHKey.
|
122
|
+
key = File.join(key_dir, 'jakub123@foo.net.pub')
|
123
|
+
s = SSHKey.from_file(key)
|
121
124
|
s.owner.should == s.email
|
122
125
|
end
|
123
126
|
end
|
127
|
+
|
128
|
+
describe '#new' do
|
129
|
+
it 'should create a valid ssh key' do
|
130
|
+
type = "ssh-rsa"
|
131
|
+
blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
|
132
|
+
email = Forgery::Internet.email_address
|
133
|
+
|
134
|
+
s = SSHKey.new(type, blob, email)
|
135
|
+
|
136
|
+
s.to_s.should == [type, blob, email].join(' ')
|
137
|
+
s.owner.should == email
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'should create a valid ssh key while specifying an owner' do
|
141
|
+
type = "ssh-rsa"
|
142
|
+
blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
|
143
|
+
email = Forgery::Internet.email_address
|
144
|
+
owner = Forgery::Name.first_name
|
145
|
+
|
146
|
+
s = SSHKey.new(type, blob, email, owner)
|
147
|
+
|
148
|
+
s.to_s.should == [type, blob, email].join(' ')
|
149
|
+
s.owner.should == owner
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'should create a valid ssh key while specifying an owner and location' do
|
153
|
+
type = "ssh-rsa"
|
154
|
+
blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
|
155
|
+
email = Forgery::Internet.email_address
|
156
|
+
owner = Forgery::Name.first_name
|
157
|
+
location = Forgery::Name.location
|
158
|
+
|
159
|
+
s = SSHKey.new(type, blob, email, owner, location)
|
160
|
+
|
161
|
+
s.to_s.should == [type, blob, email].join(' ')
|
162
|
+
s.owner.should == owner
|
163
|
+
s.location.should == location
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe '#filename' do
|
168
|
+
it 'should create a filename that is the <email>.pub' do
|
169
|
+
type = "ssh-rsa"
|
170
|
+
blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
|
171
|
+
email = Forgery::Internet.email_address
|
172
|
+
|
173
|
+
s = SSHKey.new(type, blob, email)
|
174
|
+
|
175
|
+
s.filename.should == "#{email}.pub"
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'should create a filename that is the <owner>.pub' do
|
179
|
+
type = "ssh-rsa"
|
180
|
+
blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
|
181
|
+
email = Forgery::Internet.email_address
|
182
|
+
owner = Forgery::Name.first_name
|
183
|
+
|
184
|
+
s = SSHKey.new(type, blob, email, owner)
|
185
|
+
|
186
|
+
s.filename.should == "#{owner}.pub"
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'should create a filename that is the <email>@<location>.pub' do
|
190
|
+
type = "ssh-rsa"
|
191
|
+
blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
|
192
|
+
email = Forgery::Internet.email_address
|
193
|
+
location = Forgery::Basic.text(:at_least => 8, :at_most => 15)
|
194
|
+
|
195
|
+
s = SSHKey.new(type, blob, email, nil, location)
|
196
|
+
|
197
|
+
s.filename.should == "#{email}@#{location}.pub"
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'should create a filename that is the <owner>@<location>.pub' do
|
201
|
+
type = "ssh-rsa"
|
202
|
+
blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
|
203
|
+
email = Forgery::Internet.email_address
|
204
|
+
owner = Forgery::Name.first_name
|
205
|
+
location = Forgery::Basic.text(:at_least => 8, :at_most => 15)
|
206
|
+
|
207
|
+
s = SSHKey.new(type, blob, email, owner, location)
|
208
|
+
|
209
|
+
s.filename.should == "#{owner}@#{location}.pub"
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
describe '#to_file' do
|
214
|
+
it 'should write a "valid" SSH public key to the file system' do
|
215
|
+
type = "ssh-rsa"
|
216
|
+
blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
|
217
|
+
email = Forgery::Internet.email_address
|
218
|
+
owner = Forgery::Name.first_name
|
219
|
+
location = Forgery::Basic.text(:at_least => 8, :at_most => 15)
|
220
|
+
|
221
|
+
s = SSHKey.new(type, blob, email, owner, location)
|
222
|
+
|
223
|
+
tmpdir = Dir.tmpdir
|
224
|
+
s.to_file(tmpdir)
|
225
|
+
|
226
|
+
s.to_s.should == File.read(File.join(tmpdir, s.filename))
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'should return the filename written' do
|
230
|
+
type = "ssh-rsa"
|
231
|
+
blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
|
232
|
+
email = Forgery::Internet.email_address
|
233
|
+
owner = Forgery::Name.first_name
|
234
|
+
location = Forgery::Basic.text(:at_least => 8, :at_most => 15)
|
235
|
+
|
236
|
+
s = SSHKey.new(type, blob, email, owner, location)
|
237
|
+
|
238
|
+
tmpdir = Dir.tmpdir
|
239
|
+
|
240
|
+
|
241
|
+
s.to_file(tmpdir).should == File.join(tmpdir, s.filename)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
describe '==' do
|
246
|
+
it 'should have two keys equalling one another' do
|
247
|
+
type = "ssh-rsa"
|
248
|
+
blob = Forgery::Basic.text(:at_least => 372, :at_most => 372)
|
249
|
+
email = Forgery::Internet.email_address
|
250
|
+
|
251
|
+
s1 = SSHKey.new(type, blob, email)
|
252
|
+
s2 = SSHKey.new(type, blob, email)
|
253
|
+
|
254
|
+
s1.should == s2
|
255
|
+
end
|
256
|
+
end
|
124
257
|
end
|
metadata
CHANGED
@@ -1,63 +1,59 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitolite
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- alpha
|
10
|
-
version: 0.0.1.alpha
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2.alpha
|
5
|
+
prerelease: 6
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Stafford Brunk
|
14
|
-
autorequire:
|
9
|
+
autorequire: !!null
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-02-01 00:00:00.000000000 -05:00
|
13
|
+
default_executable: !!null
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
22
16
|
name: rspec
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: &23994300 !ruby/object:Gem::Requirement
|
25
18
|
none: false
|
26
|
-
requirements:
|
19
|
+
requirements:
|
27
20
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
segments:
|
30
|
-
- 2
|
31
|
-
- 4
|
32
|
-
- 0
|
21
|
+
- !ruby/object:Gem::Version
|
33
22
|
version: 2.4.0
|
34
23
|
type: :development
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: grit
|
38
24
|
prerelease: false
|
39
|
-
|
25
|
+
version_requirements: *23994300
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: forgery
|
28
|
+
requirement: &23993928 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.6
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *23993928
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: grit
|
39
|
+
requirement: &23993640 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
|
-
requirements:
|
41
|
+
requirements:
|
42
42
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
segments:
|
45
|
-
- 2
|
46
|
-
- 4
|
47
|
-
- 1
|
43
|
+
- !ruby/object:Gem::Version
|
48
44
|
version: 2.4.1
|
49
45
|
type: :runtime
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *23993640
|
48
|
+
description: This gem is designed to provide a Ruby interface to the gitolite git
|
49
|
+
backend system. This gem aims to provide all management functionality that is available
|
50
|
+
via the gitolite-admin repository (like SSH keys, repository permissions, etc)
|
51
|
+
email:
|
53
52
|
- wingrunr21@gmail.com
|
54
53
|
executables: []
|
55
|
-
|
56
54
|
extensions: []
|
57
|
-
|
58
55
|
extra_rdoc_files: []
|
59
|
-
|
60
|
-
files:
|
56
|
+
files:
|
61
57
|
- .gitignore
|
62
58
|
- Gemfile
|
63
59
|
- Gemfile.lock
|
@@ -86,36 +82,27 @@ files:
|
|
86
82
|
has_rdoc: true
|
87
83
|
homepage: https://www.github.com/wingrunr21/gitolite
|
88
84
|
licenses: []
|
89
|
-
|
90
|
-
post_install_message:
|
85
|
+
post_install_message: !!null
|
91
86
|
rdoc_options: []
|
92
|
-
|
93
|
-
require_paths:
|
87
|
+
require_paths:
|
94
88
|
- lib
|
95
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
90
|
none: false
|
97
|
-
requirements:
|
98
|
-
- -
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
|
101
|
-
|
102
|
-
version: "0"
|
103
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
96
|
none: false
|
105
|
-
requirements:
|
106
|
-
- -
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
segments:
|
109
|
-
- 1
|
110
|
-
- 3
|
111
|
-
- 1
|
97
|
+
requirements:
|
98
|
+
- - ! '>'
|
99
|
+
- !ruby/object:Gem::Version
|
112
100
|
version: 1.3.1
|
113
101
|
requirements: []
|
114
|
-
|
115
102
|
rubyforge_project: gitolite
|
116
|
-
rubygems_version: 1.
|
117
|
-
signing_key:
|
103
|
+
rubygems_version: 1.5.0
|
104
|
+
signing_key: !!null
|
118
105
|
specification_version: 3
|
119
|
-
summary: A Ruby gem for manipulating the gitolite git backend via the gitolite-admin
|
106
|
+
summary: A Ruby gem for manipulating the gitolite git backend via the gitolite-admin
|
107
|
+
repository.
|
120
108
|
test_files: []
|
121
|
-
|