git_store 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,257 @@
1
+ require "#{File.dirname(__FILE__)}/../lib/git_store"
2
+ require "#{File.dirname(__FILE__)}/helper"
3
+ require 'pp'
4
+
5
+ describe GitStore do
6
+
7
+ REPO = '/tmp/git_store_test'
8
+
9
+ attr_reader :store
10
+
11
+ before(:each) do
12
+ FileUtils.rm_rf REPO
13
+ Dir.mkdir REPO
14
+ Dir.chdir REPO
15
+
16
+ `git init`
17
+ @store = GitStore.new(REPO)
18
+ end
19
+
20
+ def file(file, data)
21
+ FileUtils.mkpath(File.dirname(file))
22
+ open(file, 'w') { |io| io << data }
23
+
24
+ `git add #{file}`
25
+ `git commit -m 'added #{file}'`
26
+ File.unlink(file)
27
+ end
28
+
29
+ it 'should fail to initialize without a valid git repository' do
30
+ lambda {
31
+ GitStore.new('/')
32
+ }.should raise_error(ArgumentError)
33
+ end
34
+
35
+ it 'should find modified entries' do
36
+ store['a'] = 'Hello'
37
+
38
+ store.root.should be_modified
39
+
40
+ store.commit
41
+
42
+ store.root.should_not be_modified
43
+
44
+ store['a'] = 'Bello'
45
+
46
+ store.root.should be_modified
47
+ end
48
+
49
+ it 'should load a repo' do
50
+ file 'a', 'Hello'
51
+ file 'b', 'World'
52
+
53
+ store.load
54
+
55
+ store['a'].should == 'Hello'
56
+ store['b'].should == 'World'
57
+ end
58
+
59
+ it 'should load folders' do
60
+ file 'x/a', 'Hello'
61
+ file 'y/b', 'World'
62
+
63
+ store.load
64
+ store['x'].should be_kind_of(GitStore::Tree)
65
+ store['y'].should be_kind_of(GitStore::Tree)
66
+
67
+ store['x']['a'].should == 'Hello'
68
+ store['y']['b'].should == 'World'
69
+ end
70
+
71
+ it 'should load yaml' do
72
+ file 'x/a.yml', '[1, 2, 3, 4]'
73
+
74
+ store.load
75
+
76
+ store['x']['a.yml'].should == [1,2,3,4]
77
+ store['x']['a.yml'] = [1,2,3,4,5]
78
+ end
79
+
80
+ it 'should save yaml' do
81
+ store['x/a.yml'] = [1,2,3,4,5]
82
+ store['x/a.yml'].should == [1,2,3,4,5]
83
+ end
84
+
85
+ it 'should detect modification' do
86
+ store.transaction do
87
+ store['x/a'] = 'a'
88
+ end
89
+
90
+ store.load
91
+
92
+ store['x/a'].should == 'a'
93
+
94
+ store.transaction do
95
+ store['x/a'] = 'b'
96
+ store['x'].should be_modified
97
+ store.root.should be_modified
98
+ end
99
+
100
+ store.load
101
+
102
+ store['x/a'].should == 'b'
103
+ end
104
+
105
+ it 'should resolve paths' do
106
+ file 'x/a', 'Hello'
107
+ file 'y/b', 'World'
108
+
109
+ store.load
110
+
111
+ store['x/a'].should == 'Hello'
112
+ store['y/b'].should == 'World'
113
+
114
+ store['y/b'] = 'Now this'
115
+
116
+ store['y']['b'].should == 'Now this'
117
+ end
118
+
119
+ it 'should create new trees' do
120
+ store['new/tree'] = 'This tree'
121
+ store['new/tree'].should == 'This tree'
122
+ end
123
+
124
+ it 'should delete entries' do
125
+ store['a'] = 'Hello'
126
+ store.delete('a')
127
+
128
+ store['a'].should be_nil
129
+ end
130
+
131
+ it 'should have a head commit' do
132
+ file 'a', 'Hello'
133
+
134
+ store.load
135
+ store.head.should_not be_nil
136
+ end
137
+
138
+ it 'should detect changes' do
139
+ file 'a', 'Hello'
140
+
141
+ store.should be_changed
142
+ end
143
+
144
+ it 'should rollback a transaction' do
145
+ file 'a/b', 'Hello'
146
+ file 'c/d', 'World'
147
+
148
+ begin
149
+ store.transaction do
150
+ store['a/b'] = 'Changed'
151
+ store['x/a'] = 'Added'
152
+ raise
153
+ end
154
+ rescue
155
+ end
156
+
157
+ store['a/b'].should == 'Hello'
158
+ store['c/d'].should == 'World'
159
+ store['x/a'].should be_nil
160
+ end
161
+
162
+ it 'should commit a transaction' do
163
+ file 'a/b', 'Hello'
164
+ file 'c/d', 'World'
165
+
166
+ store.transaction do
167
+ store['a/b'] = 'Changed'
168
+ store['x/a'] = 'Added'
169
+ end
170
+
171
+ a = git_ls_tree(store['a'].id)
172
+ x = git_ls_tree(store['x'].id)
173
+
174
+ a.should == [["100644", "blob", "b653cf27cef08de46da49a11fa5016421e9e3b32", "b"]]
175
+ x.should == [["100644", "blob", "87d2b203800386b1cc8735a7d540a33e246357fa", "a"]]
176
+
177
+ git_show(a[0][2]).should == 'Changed'
178
+ git_show(x[0][2]).should == 'Added'
179
+ end
180
+
181
+ it "should save blobs" do
182
+ store['a'] = 'a'
183
+ store['b'] = 'b'
184
+ store['c'] = 'c'
185
+
186
+ store.commit
187
+
188
+ a = store.id_for('blob', 'a')
189
+ b = store.id_for('blob', 'b')
190
+ c = store.id_for('blob', 'c')
191
+
192
+ git_show(a).should == 'a'
193
+ git_show(b).should == 'b'
194
+ git_show(c).should == 'c'
195
+ end
196
+
197
+ it 'should allow only one transaction' do
198
+ file 'a/b', 'Hello'
199
+
200
+ ready = false
201
+
202
+ store.transaction do
203
+ Thread.start do
204
+ store.transaction do
205
+ store['a/b'] = 'Changed by second thread'
206
+ end
207
+ ready = true
208
+ end
209
+ store['a/b'] = 'Changed'
210
+ end
211
+
212
+ sleep 0.01 until ready
213
+
214
+ store.load
215
+
216
+ store['a/b'].should == 'Changed by second thread'
217
+ end
218
+
219
+ it 'should find all objects' do
220
+ store.load
221
+ store['c'] = 'Hello'
222
+ store['d'] = 'World'
223
+ store.commit
224
+
225
+ store.to_a.should == [['c', 'Hello'], ['d', 'World']]
226
+ end
227
+
228
+ it "should load commits" do
229
+ store['a'] = 'a'
230
+ store.commit 'added a'
231
+
232
+ store['b'] = 'b'
233
+ store.commit 'added b'
234
+
235
+ store.commits[0].message.should == 'added b'
236
+ store.commits[1].message.should == 'added a'
237
+ end
238
+
239
+ it "should load tags" do
240
+ file 'a', 'init'
241
+
242
+ `git tag -m 'message' 0.1`
243
+
244
+ store.load
245
+
246
+ user = GitStore::User.from_config
247
+ id = File.read('.git/refs/tags/0.1')
248
+ tag = store.get(id)
249
+
250
+ tag.type.should == 'commit'
251
+ tag.object.should == store.head
252
+ tag.tagger.name.should == user.name
253
+ tag.tagger.email.should == user.email
254
+ tag.message.should =~ /message/
255
+ end
256
+
257
+ end
data/test/tree_spec.rb ADDED
@@ -0,0 +1,92 @@
1
+ require "#{File.dirname(__FILE__)}/../lib/git_store"
2
+ require "#{File.dirname(__FILE__)}/helper"
3
+ require 'pp'
4
+
5
+ describe GitStore::Tree do
6
+ REPO = '/tmp/git_store_test'
7
+
8
+ attr_reader :store, :tree
9
+
10
+ before(:each) do
11
+ FileUtils.rm_rf REPO
12
+ Dir.mkdir REPO
13
+ Dir.chdir REPO
14
+
15
+ `git init`
16
+
17
+ @store = GitStore.new(REPO)
18
+ end
19
+
20
+ it "should parse a table" do
21
+ tree = GitStore::Tree.new(store)
22
+
23
+ a = store.put_object("blob", "a")
24
+ b = store.put_object("blob", "b")
25
+ c = store.put_object("blob", "c")
26
+
27
+ data =
28
+ "100644 a\0#{ [a].pack("H*") }" +
29
+ "100644 b\0#{ [b].pack("H*") }" +
30
+ "100644 c\0#{ [c].pack("H*") }"
31
+
32
+ tree.parse(data)
33
+
34
+ tree.get('a').should == 'a'
35
+ tree.get('b').should == 'b'
36
+ tree.get('c').should == 'c'
37
+ end
38
+
39
+ it "should write a table" do
40
+ tree = GitStore::Tree.new(store)
41
+
42
+ tree['a'] = 'a'
43
+ tree['b'] = 'b'
44
+ tree['c'] = 'c'
45
+
46
+ id = tree.write
47
+
48
+ a = ["2e65efe2a145dda7ee51d1741299f848e5bf752e"].pack('H*')
49
+ b = ["63d8dbd40c23542e740659a7168a0ce3138ea748"].pack('H*')
50
+ c = ["3410062ba67c5ed59b854387a8bc0ec012479368"].pack('H*')
51
+
52
+ data =
53
+ "100644 a\0#{a}" +
54
+ "100644 b\0#{b}" +
55
+ "100644 c\0#{c}"
56
+
57
+ store.get_object(id).should == ['tree', data]
58
+ end
59
+
60
+ it "should save trees" do
61
+ tree = GitStore::Tree.new(store)
62
+
63
+ tree['a'] = 'a'
64
+ tree['b'] = 'b'
65
+ tree['c'] = 'c'
66
+
67
+ tree.write
68
+
69
+ git_ls_tree(tree.id).should ==
70
+ [["100644", "blob", "2e65efe2a145dda7ee51d1741299f848e5bf752e", "a"],
71
+ ["100644", "blob", "63d8dbd40c23542e740659a7168a0ce3138ea748", "b"],
72
+ ["100644", "blob", "3410062ba67c5ed59b854387a8bc0ec012479368", "c"]]
73
+ end
74
+
75
+ it "should save nested trees" do
76
+ tree = GitStore::Tree.new(store)
77
+
78
+ tree['x/a'] = 'a'
79
+ tree['x/b'] = 'b'
80
+ tree['x/c'] = 'c'
81
+
82
+ tree.write
83
+
84
+ git_ls_tree(tree.id).should ==
85
+ [["040000", "tree", "24e88cb96c396400000ef706d1ca1ed9a88251aa", "x"]]
86
+
87
+ git_ls_tree("24e88cb96c396400000ef706d1ca1ed9a88251aa").should ==
88
+ [["100644", "blob", "2e65efe2a145dda7ee51d1741299f848e5bf752e", "a"],
89
+ ["100644", "blob", "63d8dbd40c23542e740659a7168a0ce3138ea748", "b"],
90
+ ["100644", "blob", "3410062ba67c5ed59b854387a8bc0ec012479368", "c"]]
91
+ end
92
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git_store
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Matthias Georgi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-02-07 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: |
17
+ GitStore implements a versioned data store based on the revision
18
+ management system Git. You can store object hierarchies as nested
19
+ hashes, which will be mapped on the directory structure of a git
20
+ repository. GitStore checks out the repository into a in-memory
21
+ representation, which can be modified and finally committed.
22
+
23
+ email: matti.georgi@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - README.md
30
+ files:
31
+ - .gitignore
32
+ - LICENSE
33
+ - README.md
34
+ - Rakefile
35
+ - git_store.gemspec
36
+ - lib/git_store.rb
37
+ - lib/git_store/blob.rb
38
+ - lib/git_store/commit.rb
39
+ - lib/git_store/diff.rb
40
+ - lib/git_store/handlers.rb
41
+ - lib/git_store/pack.rb
42
+ - lib/git_store/tag.rb
43
+ - lib/git_store/tree.rb
44
+ - lib/git_store/user.rb
45
+ - test/bare_store_spec.rb
46
+ - test/benchmark.rb
47
+ - test/commit_spec.rb
48
+ - test/git_store_spec.rb
49
+ - test/tree_spec.rb
50
+ has_rdoc: true
51
+ homepage: http://ww.matthias-georgi.de/git_store
52
+ licenses: []
53
+
54
+ post_install_message:
55
+ rdoc_options: []
56
+
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ version:
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: "0"
70
+ version:
71
+ requirements: []
72
+
73
+ rubyforge_project:
74
+ rubygems_version: 1.3.5
75
+ signing_key:
76
+ specification_version: 3
77
+ summary: a simple data store based on git
78
+ test_files: []
79
+