gitrb 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/gitrb.gemspec +1 -1
- data/lib/gitrb/repository.rb +21 -15
- data/lib/gitrb/util.rb +22 -0
- data/lib/gitrb.rb +1 -10
- data/test/repository_spec.rb +29 -6
- metadata +2 -2
data/gitrb.gemspec
CHANGED
data/lib/gitrb/repository.rb
CHANGED
@@ -33,6 +33,7 @@ module Gitrb
|
|
33
33
|
@logger = options[:logger] || Logger.new(nil)
|
34
34
|
@encoding = options[:encoding] || DEFAULT_ENCODING
|
35
35
|
@lock = {}
|
36
|
+
@transaction = Mutex.new
|
36
37
|
|
37
38
|
@path = options[:path]
|
38
39
|
@path.chomp!('/')
|
@@ -52,13 +53,16 @@ module Gitrb
|
|
52
53
|
|
53
54
|
# Switch branch
|
54
55
|
def branch=(branch)
|
55
|
-
|
56
|
-
|
56
|
+
raise 'Forbidden from within a transaction' if in_transaction?
|
57
|
+
@transaction.synchronize do
|
58
|
+
@branch = branch
|
59
|
+
load
|
60
|
+
end
|
57
61
|
end
|
58
62
|
|
59
63
|
# Has our repository been changed on disk?
|
60
64
|
def changed?
|
61
|
-
head
|
65
|
+
!head || head.id != read_head_id
|
62
66
|
end
|
63
67
|
|
64
68
|
# Load the repository, if it has been changed on disk.
|
@@ -66,9 +70,18 @@ module Gitrb
|
|
66
70
|
load if changed?
|
67
71
|
end
|
68
72
|
|
73
|
+
# Clear cached objects
|
74
|
+
def clear
|
75
|
+
raise 'Forbidden from within a transaction' if in_transaction?
|
76
|
+
@transaction.synchronize do
|
77
|
+
@objects.clear
|
78
|
+
load
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
69
82
|
# Is there any transaction going on?
|
70
83
|
def in_transaction?
|
71
|
-
|
84
|
+
!!@lock[Thread.current.object_id]
|
72
85
|
end
|
73
86
|
|
74
87
|
# Diff
|
@@ -286,14 +299,6 @@ module Gitrb
|
|
286
299
|
User.new(name, email)
|
287
300
|
end
|
288
301
|
|
289
|
-
def dup
|
290
|
-
super.instance_eval do
|
291
|
-
@objects = Trie.new
|
292
|
-
load
|
293
|
-
self
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
302
|
private
|
298
303
|
|
299
304
|
def check_git_version
|
@@ -327,6 +332,7 @@ module Gitrb
|
|
327
332
|
# Tries to get lock on lock file, load the this repository if
|
328
333
|
# has changed in the repository.
|
329
334
|
def start_transaction
|
335
|
+
@transaction.lock
|
330
336
|
file = File.open("#{head_path}.lock", 'w')
|
331
337
|
file.flock(File::LOCK_EX)
|
332
338
|
@lock[Thread.current.object_id] = file
|
@@ -349,6 +355,7 @@ module Gitrb
|
|
349
355
|
@lock[Thread.current.object_id].close rescue nil
|
350
356
|
@lock.delete(Thread.current.object_id)
|
351
357
|
File.unlink("#{head_path}.lock") rescue nil
|
358
|
+
@transaction.unlock
|
352
359
|
end
|
353
360
|
|
354
361
|
def get_type(id, expected)
|
@@ -359,7 +366,7 @@ module Gitrb
|
|
359
366
|
|
360
367
|
def load_packs
|
361
368
|
@packs = Trie.new
|
362
|
-
@objects = Trie.new
|
369
|
+
@objects = Synchronized.new(Trie.new)
|
363
370
|
|
364
371
|
packs_path = "#{@path}/objects/pack"
|
365
372
|
if File.directory?(packs_path)
|
@@ -382,7 +389,7 @@ module Gitrb
|
|
382
389
|
@head = nil
|
383
390
|
@root = Tree.new(:repository => self)
|
384
391
|
end
|
385
|
-
@logger.debug "gitrb: Reloaded, head is #{
|
392
|
+
@logger.debug "gitrb: Reloaded, head is #{head ? head.id : 'nil'}"
|
386
393
|
end
|
387
394
|
|
388
395
|
# Returns the hash value of an object string.
|
@@ -425,6 +432,5 @@ module Gitrb
|
|
425
432
|
def legacy_loose_object?(buf)
|
426
433
|
buf[0].ord == 0x78 && ((buf[0].ord << 8) | buf[1].ord) % 31 == 0
|
427
434
|
end
|
428
|
-
|
429
435
|
end
|
430
436
|
end
|
data/lib/gitrb/util.rb
CHANGED
@@ -18,4 +18,26 @@ module Gitrb
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
class Synchronized
|
23
|
+
def initialize(obj)
|
24
|
+
@obj = obj
|
25
|
+
@mutex = Mutex.new
|
26
|
+
end
|
27
|
+
|
28
|
+
def method_missing(*args)
|
29
|
+
@mutex.synchronize { @obj.send(*args) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# str[0] returns a 1-char string in Ruby 1.9 but a
|
35
|
+
# Fixnum in 1.8. Monkeypatch a fix if we're on 1.8.
|
36
|
+
if !1.respond_to?(:ord)
|
37
|
+
class Fixnum
|
38
|
+
def ord
|
39
|
+
self
|
40
|
+
end
|
41
|
+
end
|
21
42
|
end
|
43
|
+
|
data/lib/gitrb.rb
CHANGED
@@ -4,6 +4,7 @@ require 'fileutils'
|
|
4
4
|
require 'logger'
|
5
5
|
require 'enumerator'
|
6
6
|
require 'stringio'
|
7
|
+
require 'thread'
|
7
8
|
|
8
9
|
require 'gitrb/util'
|
9
10
|
require 'gitrb/gitobject'
|
@@ -17,13 +18,3 @@ require 'gitrb/pack'
|
|
17
18
|
require 'gitrb/commit'
|
18
19
|
require 'gitrb/trie'
|
19
20
|
require 'gitrb/repository'
|
20
|
-
|
21
|
-
# str[0] returns a 1-char string in Ruby 1.9 but a
|
22
|
-
# Fixnum in 1.8. Monkeypatch a fix if we're on 1.8.
|
23
|
-
if !1.respond_to?(:ord)
|
24
|
-
class Fixnum
|
25
|
-
def ord
|
26
|
-
self
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/test/repository_spec.rb
CHANGED
@@ -151,12 +151,6 @@ describe Gitrb do
|
|
151
151
|
repo.head.should_not be_nil
|
152
152
|
end
|
153
153
|
|
154
|
-
it 'should detect changes' do
|
155
|
-
file 'a', 'Hello'
|
156
|
-
|
157
|
-
repo.should be_changed
|
158
|
-
end
|
159
|
-
|
160
154
|
it 'should rollback a transaction' do
|
161
155
|
file 'a/b', 'Hello'
|
162
156
|
file 'c/d', 'World'
|
@@ -271,4 +265,33 @@ describe Gitrb do
|
|
271
265
|
tag.message.should =~ /message/
|
272
266
|
end
|
273
267
|
|
268
|
+
it 'should detect changes and refresh' do
|
269
|
+
file 'a', 'data'
|
270
|
+
repo.root['a'].should be_nil
|
271
|
+
repo.should be_changed
|
272
|
+
repo.refresh
|
273
|
+
repo.should_not be_changed
|
274
|
+
repo.root['a'].data.should == 'data'
|
275
|
+
end
|
276
|
+
|
277
|
+
it 'should clear cache' do
|
278
|
+
file 'a', 'data'
|
279
|
+
repo.refresh
|
280
|
+
repo.root['a'].data.should == 'data'
|
281
|
+
repo.clear
|
282
|
+
repo.root['a'].data.should == 'data'
|
283
|
+
end
|
284
|
+
|
285
|
+
it 'should forbid branch switching from within transaction' do
|
286
|
+
repo.transaction do
|
287
|
+
lambda { repo.branch = 'test' }.should raise_error(RuntimeError)
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
it 'should forbid clearing from within transaction' do
|
292
|
+
repo.transaction do
|
293
|
+
lambda { repo.clear }.should raise_error(RuntimeError)
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
274
297
|
end
|