gitrb 0.0.1
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/LICENSE +22 -0
- data/README.md +1 -0
- data/Rakefile +36 -0
- data/gitrb.gemspec +38 -0
- data/lib/gitrb/blob.rb +35 -0
- data/lib/gitrb/commit.rb +71 -0
- data/lib/gitrb/diff.rb +21 -0
- data/lib/gitrb/object.rb +59 -0
- data/lib/gitrb/pack.rb +347 -0
- data/lib/gitrb/repository.rb +373 -0
- data/lib/gitrb/tag.rb +35 -0
- data/lib/gitrb/tree.rb +163 -0
- data/lib/gitrb/trie.rb +75 -0
- data/lib/gitrb/user.rb +22 -0
- data/test/bare_repository_spec.rb +30 -0
- data/test/benchmark.rb +39 -0
- data/test/commit_spec.rb +73 -0
- data/test/repository_spec.rb +235 -0
- data/test/tree_spec.rb +75 -0
- data/test/trie_spec.rb +26 -0
- metadata +72 -0
data/test/benchmark.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
Gem.activate 'diff-lcs'
|
2
|
+
|
3
|
+
require 'gitrb'
|
4
|
+
require 'grit'
|
5
|
+
require 'benchmark'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
REPO = '/tmp/gitrb'
|
9
|
+
|
10
|
+
FileUtils.rm_rf REPO
|
11
|
+
FileUtils.mkpath REPO
|
12
|
+
Dir.chdir REPO
|
13
|
+
|
14
|
+
repo = Gitrb::Repository.new(:path => REPO, :create => true)
|
15
|
+
|
16
|
+
grit = nil
|
17
|
+
gitrb = nil
|
18
|
+
|
19
|
+
Benchmark.bm 20 do |x|
|
20
|
+
x.report 'store 1000 objects' do
|
21
|
+
repo.transaction { 'aaa'.upto('jjj') { |key| repo.root[key] = Gitrb::Blob.new(:data => rand.to_s) } }
|
22
|
+
end
|
23
|
+
x.report 'commit one object' do
|
24
|
+
repo.transaction { repo.root['aa'] = Gitrb::Blob.new(:data => rand.to_s) }
|
25
|
+
end
|
26
|
+
x.report 'init gitrb' do
|
27
|
+
gitrb = Gitrb::Repository.new(:path => '.')
|
28
|
+
end
|
29
|
+
x.report 'init grit' do
|
30
|
+
grit = Grit::Repo.new('.')
|
31
|
+
end
|
32
|
+
x.report 'load 1000 with gitrb' do
|
33
|
+
gitrb.root.values.each { |v| v.data }
|
34
|
+
end
|
35
|
+
x.report 'load 1000 with grit' do
|
36
|
+
grit.tree.contents.each { |e| e.data }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
data/test/commit_spec.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../lib/gitrb"
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
describe Gitrb::Commit do
|
5
|
+
|
6
|
+
REPO = '/tmp/gitrb_test'
|
7
|
+
|
8
|
+
attr_reader :repo
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
FileUtils.rm_rf REPO
|
12
|
+
Dir.mkdir REPO
|
13
|
+
|
14
|
+
@repo = Gitrb::Repository.new(:path => REPO, :create => true)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should dump in right format" do
|
18
|
+
user = Gitrb::User.new("hanni", "hanni@email.de", Time.now)
|
19
|
+
|
20
|
+
commit = Gitrb::Commit.new
|
21
|
+
commit.tree = @repo.root
|
22
|
+
commit.author = user
|
23
|
+
commit.committer = user
|
24
|
+
commit.message = "This is a message"
|
25
|
+
|
26
|
+
content = commit.dump
|
27
|
+
|
28
|
+
content.should == "tree #{@repo.root.id}
|
29
|
+
author #{user.dump}
|
30
|
+
committer #{user.dump}
|
31
|
+
|
32
|
+
This is a message"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be readable by git binary" do
|
36
|
+
time = Time.local(2009, 4, 20)
|
37
|
+
author = Gitrb::User.new("hans", "hans@email.de", time)
|
38
|
+
|
39
|
+
repo.root['a'] = Gitrb::Blob.new(:data => "Yay")
|
40
|
+
commit = repo.commit("Commit Message", author, author)
|
41
|
+
|
42
|
+
IO.popen("git log") do |io|
|
43
|
+
io.gets.should == "commit #{commit.id}\n"
|
44
|
+
io.gets.should == "Author: hans <hans@email.de>\n"
|
45
|
+
io.gets.should == "Date: Mon Apr 20 00:00:00 2009 #{Time.now.strftime('%z')}\n"
|
46
|
+
io.gets.should == "\n"
|
47
|
+
io.gets.should == " Commit Message\n"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should diff 2 commits" do
|
52
|
+
repo.root['x'] = Gitrb::Blob.new(:data => 'a')
|
53
|
+
repo.root['y'] = Gitrb::Blob.new(:data => "
|
54
|
+
First Line.
|
55
|
+
Second Line.
|
56
|
+
Last Line.
|
57
|
+
")
|
58
|
+
a = repo.commit
|
59
|
+
|
60
|
+
repo.root.delete('x')
|
61
|
+
repo.root['y'] = Gitrb::Blob.new(:data => "
|
62
|
+
First Line.
|
63
|
+
Last Line.
|
64
|
+
Another Line.
|
65
|
+
")
|
66
|
+
repo.root['z'] = Gitrb::Blob.new(:data => 'c')
|
67
|
+
|
68
|
+
b = repo.commit
|
69
|
+
|
70
|
+
diff = repo.diff(a, b)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../lib/gitrb"
|
2
|
+
require "#{File.dirname(__FILE__)}/helper"
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
describe Gitrb do
|
6
|
+
|
7
|
+
include Helper
|
8
|
+
|
9
|
+
REPO = '/tmp/gitrb_test'
|
10
|
+
|
11
|
+
attr_reader :repo
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
FileUtils.rm_rf REPO
|
15
|
+
Dir.mkdir REPO
|
16
|
+
@repo = Gitrb::Repository.new(:path => REPO, :create => true)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should fail to initialize without a valid git repository' do
|
20
|
+
lambda {
|
21
|
+
Gitrb::Repository.new(:path => '/')
|
22
|
+
}.should raise_error(ArgumentError)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should find modified entries' do
|
26
|
+
repo.root['a'] = Gitrb::Blob.new(:data => 'Hello')
|
27
|
+
|
28
|
+
repo.root.should be_modified
|
29
|
+
|
30
|
+
repo.commit
|
31
|
+
|
32
|
+
repo.root.should_not be_modified
|
33
|
+
|
34
|
+
repo.root['a'] = Gitrb::Blob.new(:data => 'Bello')
|
35
|
+
|
36
|
+
repo.root.should be_modified
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should load a repo' do
|
40
|
+
file 'a', 'Hello'
|
41
|
+
file 'b', 'World'
|
42
|
+
|
43
|
+
repo.refresh
|
44
|
+
|
45
|
+
repo.root['a'].data.should == 'Hello'
|
46
|
+
repo.root['b'].data.should == 'World'
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should load folders' do
|
50
|
+
file 'x/a', 'Hello'
|
51
|
+
file 'y/b', 'World'
|
52
|
+
|
53
|
+
repo.refresh
|
54
|
+
|
55
|
+
repo.root['x'].object.should be_kind_of(Gitrb::Tree)
|
56
|
+
repo.root['y'].object.should be_kind_of(Gitrb::Tree)
|
57
|
+
|
58
|
+
repo.root['x']['a'].data.should == 'Hello'
|
59
|
+
repo.root['y']['b'].data.should == 'World'
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should detect modification' do
|
63
|
+
repo.transaction do
|
64
|
+
repo.root['x/a'] = Gitrb::Blob.new(:data => 'a')
|
65
|
+
end
|
66
|
+
|
67
|
+
repo.refresh
|
68
|
+
|
69
|
+
repo.root['x/a'].data.should == 'a'
|
70
|
+
|
71
|
+
repo.transaction do
|
72
|
+
repo.root['x/a'] = Gitrb::Blob.new(:data => 'b')
|
73
|
+
repo.root['x'].should be_modified
|
74
|
+
repo.root.should be_modified
|
75
|
+
end
|
76
|
+
|
77
|
+
repo.refresh
|
78
|
+
|
79
|
+
repo.root['x/a'].data.should == 'b'
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should resolve paths' do
|
83
|
+
file 'x/a', 'Hello'
|
84
|
+
file 'y/b', 'World'
|
85
|
+
|
86
|
+
repo.refresh
|
87
|
+
|
88
|
+
repo.root['x/a'].data.should == 'Hello'
|
89
|
+
repo.root['y/b'].data.should == 'World'
|
90
|
+
|
91
|
+
repo.root['y/b'] = Gitrb::Blob.new(:data => 'Now this')
|
92
|
+
|
93
|
+
repo.root['y']['b'].data.should == 'Now this'
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should create new trees' do
|
97
|
+
repo.root['new/tree'] = Gitrb::Blob.new(:data => 'This tree')
|
98
|
+
repo.root['new/tree'].data.should == 'This tree'
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should delete entries' do
|
102
|
+
repo.root['a'] = Gitrb::Blob.new(:data => 'Hello')
|
103
|
+
repo.root.delete('a')
|
104
|
+
|
105
|
+
repo.root['a'].should be_nil
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should have a head commit' do
|
109
|
+
file 'a', 'Hello'
|
110
|
+
|
111
|
+
repo.refresh
|
112
|
+
repo.head.should_not be_nil
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'should detect changes' do
|
116
|
+
file 'a', 'Hello'
|
117
|
+
|
118
|
+
repo.should be_changed
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should rollback a transaction' do
|
122
|
+
file 'a/b', 'Hello'
|
123
|
+
file 'c/d', 'World'
|
124
|
+
|
125
|
+
begin
|
126
|
+
repo.transaction do
|
127
|
+
repo.root['a/b'] = 'Changed'
|
128
|
+
repo.root['x/a'] = 'Added'
|
129
|
+
raise
|
130
|
+
end
|
131
|
+
rescue
|
132
|
+
end
|
133
|
+
|
134
|
+
repo.root['a/b'].data.should == 'Hello'
|
135
|
+
repo.root['c/d'].data.should == 'World'
|
136
|
+
repo.root['x/a'].should be_nil
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should commit a transaction' do
|
140
|
+
file 'a/b', 'Hello'
|
141
|
+
file 'c/d', 'World'
|
142
|
+
|
143
|
+
repo.transaction do
|
144
|
+
repo.root['a/b'] = Gitrb::Blob.new(:data => 'Changed')
|
145
|
+
repo.root['x/a'] = Gitrb::Blob.new(:data => 'Added')
|
146
|
+
end
|
147
|
+
|
148
|
+
a = ls_tree(repo.root['a'].object.id)
|
149
|
+
x = ls_tree(repo.root['x'].object.id)
|
150
|
+
|
151
|
+
a.should == [["100644", "blob", "b653cf27cef08de46da49a11fa5016421e9e3b32", "b"]]
|
152
|
+
x.should == [["100644", "blob", "87d2b203800386b1cc8735a7d540a33e246357fa", "a"]]
|
153
|
+
|
154
|
+
repo.git_show(a[0][2]).should == 'Changed'
|
155
|
+
repo.git_show(x[0][2]).should == 'Added'
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should save blobs" do
|
159
|
+
repo.root['a'] = Gitrb::Blob.new(:data => 'a')
|
160
|
+
repo.root['b'] = Gitrb::Blob.new(:data => 'b')
|
161
|
+
repo.root['c'] = Gitrb::Blob.new(:data => 'c')
|
162
|
+
|
163
|
+
repo.commit
|
164
|
+
|
165
|
+
a = repo.root['a'].id
|
166
|
+
b = repo.root['b'].id
|
167
|
+
c = repo.root['c'].id
|
168
|
+
|
169
|
+
repo.git_show(a).should == 'a'
|
170
|
+
repo.git_show(b).should == 'b'
|
171
|
+
repo.git_show(c).should == 'c'
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'should allow only one transaction' do
|
175
|
+
file 'a/b', 'Hello'
|
176
|
+
|
177
|
+
ready = false
|
178
|
+
|
179
|
+
repo.transaction do
|
180
|
+
Thread.start do
|
181
|
+
repo.transaction do
|
182
|
+
repo.root['a/b'] = Gitrb::Blob.new(:data => 'Changed by second thread')
|
183
|
+
end
|
184
|
+
ready = true
|
185
|
+
end
|
186
|
+
repo.root['a/b'] = Gitrb::Blob.new(:data => 'Changed')
|
187
|
+
end
|
188
|
+
|
189
|
+
sleep 0.01 until ready
|
190
|
+
|
191
|
+
repo.refresh
|
192
|
+
|
193
|
+
repo.root['a/b'].data.should == 'Changed by second thread'
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'should find all objects' do
|
197
|
+
repo.refresh
|
198
|
+
repo.root['c'] = Gitrb::Blob.new(:data => 'Hello')
|
199
|
+
repo.root['d'] = Gitrb::Blob.new(:data => 'World')
|
200
|
+
repo.commit
|
201
|
+
|
202
|
+
repo.root.to_a[0][1].data.should == 'Hello'
|
203
|
+
repo.root.to_a[1][1].data.should == 'World'
|
204
|
+
end
|
205
|
+
|
206
|
+
it "should load log" do
|
207
|
+
repo.root['a'] = Gitrb::Blob.new(:data => 'a')
|
208
|
+
repo.commit 'added a'
|
209
|
+
|
210
|
+
repo.root['b'] = Gitrb::Blob.new(:data => 'b')
|
211
|
+
repo.commit 'added b'
|
212
|
+
|
213
|
+
repo.log[0].message.should == 'added b'
|
214
|
+
repo.log[1].message.should == 'added a'
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should load tags" do
|
218
|
+
file 'a', 'init'
|
219
|
+
|
220
|
+
repo.git_tag('-m', 'message', '0.1')
|
221
|
+
|
222
|
+
repo.refresh
|
223
|
+
|
224
|
+
user = repo.default_user
|
225
|
+
id = File.read(repo.path + '/refs/tags/0.1')
|
226
|
+
tag = repo.get(id)
|
227
|
+
|
228
|
+
tag.tagtype.should == 'commit'
|
229
|
+
tag.object.object.should == repo.head
|
230
|
+
tag.tagger.name.should == user.name
|
231
|
+
tag.tagger.email.should == user.email
|
232
|
+
tag.message.should =~ /message/
|
233
|
+
end
|
234
|
+
|
235
|
+
end
|
data/test/tree_spec.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../lib/gitrb"
|
2
|
+
require "#{File.dirname(__FILE__)}/helper"
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
describe Gitrb::Tree do
|
6
|
+
REPO = '/tmp/gitrb_test'
|
7
|
+
|
8
|
+
include Helper
|
9
|
+
|
10
|
+
attr_reader :repo, :tree
|
11
|
+
|
12
|
+
before(:each) do
|
13
|
+
FileUtils.rm_rf REPO
|
14
|
+
Dir.mkdir REPO
|
15
|
+
|
16
|
+
@repo = Gitrb::Repository.new(:path => REPO, :create => true)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should write a table" do
|
20
|
+
tree = Gitrb::Tree.new(:repository => repo)
|
21
|
+
|
22
|
+
tree['a'] = Gitrb::Blob.new(:data => 'a')
|
23
|
+
tree['b'] = Gitrb::Blob.new(:data => 'b')
|
24
|
+
tree['c'] = Gitrb::Blob.new(:data => 'c')
|
25
|
+
|
26
|
+
id = tree.save
|
27
|
+
|
28
|
+
a = ["2e65efe2a145dda7ee51d1741299f848e5bf752e"].pack('H*')
|
29
|
+
b = ["63d8dbd40c23542e740659a7168a0ce3138ea748"].pack('H*')
|
30
|
+
c = ["3410062ba67c5ed59b854387a8bc0ec012479368"].pack('H*')
|
31
|
+
|
32
|
+
data =
|
33
|
+
"100644 a\0#{a}" +
|
34
|
+
"100644 b\0#{b}" +
|
35
|
+
"100644 c\0#{c}"
|
36
|
+
|
37
|
+
repo.get(id).should be_a(Gitrb::Tree)
|
38
|
+
repo.get(id).names.should include('a')
|
39
|
+
repo.get(id).names.should include('b')
|
40
|
+
repo.get(id).names.should include('c')
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should save trees" do
|
44
|
+
tree = Gitrb::Tree.new(:repository => repo)
|
45
|
+
|
46
|
+
tree['a'] = Gitrb::Blob.new(:data => 'a')
|
47
|
+
tree['b'] = Gitrb::Blob.new(:data => 'b')
|
48
|
+
tree['c'] = Gitrb::Blob.new(:data => 'c')
|
49
|
+
|
50
|
+
tree.save
|
51
|
+
|
52
|
+
ls_tree(tree.id).should ==
|
53
|
+
[["100644", "blob", "2e65efe2a145dda7ee51d1741299f848e5bf752e", "a"],
|
54
|
+
["100644", "blob", "63d8dbd40c23542e740659a7168a0ce3138ea748", "b"],
|
55
|
+
["100644", "blob", "3410062ba67c5ed59b854387a8bc0ec012479368", "c"]]
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should save nested trees" do
|
59
|
+
tree = Gitrb::Tree.new(:repository => repo)
|
60
|
+
|
61
|
+
tree['x/a'] = Gitrb::Blob.new(:data => 'a')
|
62
|
+
tree['x/b'] = Gitrb::Blob.new(:data => 'b')
|
63
|
+
tree['x/c'] = Gitrb::Blob.new(:data => 'c')
|
64
|
+
|
65
|
+
tree.save
|
66
|
+
|
67
|
+
ls_tree(tree.id).should ==
|
68
|
+
[["040000", "tree", "24e88cb96c396400000ef706d1ca1ed9a88251aa", "x"]]
|
69
|
+
|
70
|
+
ls_tree("24e88cb96c396400000ef706d1ca1ed9a88251aa").should ==
|
71
|
+
[["100644", "blob", "2e65efe2a145dda7ee51d1741299f848e5bf752e", "a"],
|
72
|
+
["100644", "blob", "63d8dbd40c23542e740659a7168a0ce3138ea748", "b"],
|
73
|
+
["100644", "blob", "3410062ba67c5ed59b854387a8bc0ec012479368", "c"]]
|
74
|
+
end
|
75
|
+
end
|
data/test/trie_spec.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../lib/gitrb"
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
describe Gitrb::Trie do
|
5
|
+
|
6
|
+
it "should add children" do
|
7
|
+
trie = Gitrb::Trie.new
|
8
|
+
0.upto(100) do |i|
|
9
|
+
trie.insert('a' * i, i)
|
10
|
+
end
|
11
|
+
trie.find('').key.should == ''
|
12
|
+
trie.find('').value.should == 0
|
13
|
+
1.upto(100) do |i|
|
14
|
+
trie.find('a' * i).key.should == 'a'
|
15
|
+
trie.find('a' * i).value.should == i
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should split node" do
|
20
|
+
trie = Gitrb::Trie.new
|
21
|
+
trie.insert("abc", 1)
|
22
|
+
trie.insert("ab", 2)
|
23
|
+
trie.insert("ac", 3)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gitrb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Daniel Mendler
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-12-04 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Pure ruby git implementation similar to grit.
|
17
|
+
email: mail@daniel-mendler.de
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README.md
|
24
|
+
files:
|
25
|
+
- LICENSE
|
26
|
+
- README.md
|
27
|
+
- Rakefile
|
28
|
+
- gitrb.gemspec
|
29
|
+
- lib/gitrb/blob.rb
|
30
|
+
- lib/gitrb/commit.rb
|
31
|
+
- lib/gitrb/diff.rb
|
32
|
+
- lib/gitrb/object.rb
|
33
|
+
- lib/gitrb/pack.rb
|
34
|
+
- lib/gitrb/repository.rb
|
35
|
+
- lib/gitrb/tag.rb
|
36
|
+
- lib/gitrb/tree.rb
|
37
|
+
- lib/gitrb/trie.rb
|
38
|
+
- lib/gitrb/user.rb
|
39
|
+
- test/bare_repository_spec.rb
|
40
|
+
- test/benchmark.rb
|
41
|
+
- test/commit_spec.rb
|
42
|
+
- test/repository_spec.rb
|
43
|
+
- test/trie_spec.rb
|
44
|
+
- test/tree_spec.rb
|
45
|
+
has_rdoc: true
|
46
|
+
homepage: https://github.com/minad/gitrb
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0"
|
57
|
+
version:
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: "0"
|
63
|
+
version:
|
64
|
+
requirements: []
|
65
|
+
|
66
|
+
rubyforge_project: gitrb
|
67
|
+
rubygems_version: 1.3.1
|
68
|
+
signing_key:
|
69
|
+
specification_version: 2
|
70
|
+
summary: Pure ruby git implementation
|
71
|
+
test_files: []
|
72
|
+
|