gitrb 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/gitrb.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'gitrb'
3
- s.version = '0.2.3'
3
+ s.version = '0.2.4'
4
4
  s.summary = 'Pure ruby git implementation'
5
5
  s.author = 'Daniel Mendler'
6
6
  s.email = 'mail@daniel-mendler.de'
data/lib/gitrb.rb CHANGED
@@ -4,7 +4,6 @@ require 'fileutils'
4
4
  require 'logger'
5
5
  require 'enumerator'
6
6
  require 'stringio'
7
- require 'thread'
8
7
 
9
8
  require 'gitrb/util'
10
9
  require 'gitrb/gitobject'
@@ -42,8 +42,6 @@ module Gitrb
42
42
  @branch = options[:branch] || 'master'
43
43
  @logger = options[:logger] || Logger.new(nil)
44
44
  @encoding = options[:encoding] || DEFAULT_ENCODING
45
- @lock = {}
46
- @transaction = Mutex.new
47
45
 
48
46
  @path = options[:path]
49
47
  @path.chomp!('/')
@@ -56,6 +54,14 @@ module Gitrb
56
54
  load
57
55
  end
58
56
 
57
+ def dup
58
+ super.instance_eval do
59
+ @objects = Trie.new
60
+ load
61
+ self
62
+ end
63
+ end
64
+
59
65
  # Bare repository?
60
66
  def bare?
61
67
  @bare
@@ -63,10 +69,8 @@ module Gitrb
63
69
 
64
70
  # Switch branch
65
71
  def branch=(branch)
66
- @transaction.synchronize do
67
- @branch = branch
68
- load
69
- end
72
+ @branch = branch
73
+ load
70
74
  end
71
75
 
72
76
  # Has our repository been changed on disk?
@@ -81,22 +85,15 @@ module Gitrb
81
85
 
82
86
  # Clear cached objects
83
87
  def clear
84
- @transaction.synchronize do
85
- @objects.clear
86
- load
87
- end
88
- end
89
-
90
- # Is there any transaction going on?
91
- def in_transaction?
92
- !!@lock[Thread.current.object_id]
88
+ @objects.clear
89
+ load
93
90
  end
94
91
 
95
92
  # Difference between versions
96
93
  # Options:
97
94
  # :to - Required target commit
98
95
  # :from - Optional source commit (otherwise comparision with empty tree)
99
- # :path - Restrict to path
96
+ # :path - Restrict to path/or paths
100
97
  # :detect_renames - Detect renames O(n^2)
101
98
  # :detect_copies - Detect copies O(n^2), very slow
102
99
  def diff(opts)
@@ -112,7 +109,7 @@ module Gitrb
112
109
  Diff.new(from, to, git_diff_tree('--root', '--full-index', '-u',
113
110
  opts[:detect_renames] ? '-M' : nil,
114
111
  opts[:detect_copies] ? '-C' : nil,
115
- from ? from.id : nil, to.id, '--', opts[:path]))
112
+ from ? from.id : nil, to.id, '--', *opts[:path]))
116
113
  end
117
114
 
118
115
  # All changes made inside a transaction are atomic. If some
@@ -122,19 +119,20 @@ module Gitrb
122
119
  # repository.transaction { repository['a'] = 'b' }
123
120
  #
124
121
  def transaction(message = '', author = nil, committer = nil)
125
- @transaction.synchronize do
126
- begin
127
- start_transaction
128
- result = yield
129
- commit(message, author, committer)
130
- result
131
- rescue
132
- rollback_transaction
133
- raise
134
- ensure
135
- finish_transaction
136
- end
137
- end
122
+ lock = File.open("#{head_path}.lock", 'w')
123
+ lock.flock(File::LOCK_EX)
124
+ refresh
125
+
126
+ result = yield
127
+ commit(message, author, committer)
128
+ result
129
+ rescue
130
+ @objects.clear
131
+ load
132
+ raise
133
+ ensure
134
+ lock.close rescue nil
135
+ File.unlink("#{head_path}.lock") rescue nil
138
136
  end
139
137
 
140
138
  # Write a commit object to disk and set the head of the current branch.
@@ -162,15 +160,19 @@ module Gitrb
162
160
  end
163
161
 
164
162
  # Returns a list of commits starting from head commit.
163
+ # Options:
164
+ # :path - Restrict to path/or paths
165
+ # :max_count - Maximum count of commits
166
+ # :skip - Skip n commits
167
+ # :start - Commit to start from
165
168
  def log(opts = {})
166
169
  max_count = opts[:max_count]
167
170
  skip = opts[:skip]
168
171
  start = opts[:start]
169
- path = opts[:path]
170
172
  raise ArgumentError, "Invalid commit: #{start}" if start.to_s =~ /^\-/
171
173
  log = git_log('--pretty=tformat:%H%n%P%n%T%n%an%n%ae%n%at%n%cn%n%ce%n%ct%n%x00%s%n%b%x00',
172
174
  skip ? "--skip=#{skip.to_i}" : nil,
173
- max_count ? "--max-count=#{max_count.to_i}" : nil, start, '--', path).split(/\n*\x00\n*/)
175
+ max_count ? "--max-count=#{max_count.to_i}" : nil, start, '--', *opts[:path]).split(/\n*\x00\n*/)
174
176
  commits = []
175
177
  log.each_slice(2) do |data, message|
176
178
  data = data.split("\n")
@@ -261,7 +263,7 @@ module Gitrb
261
263
 
262
264
  content = object.dump
263
265
  data = "#{object.type} #{content.bytesize rescue content.length}\0#{content}"
264
- id = sha(data)
266
+ id = Digest::SHA1.hexdigest(data)
265
267
  path = object_path(id)
266
268
 
267
269
  @logger.debug "gitrb: Storing #{id}"
@@ -348,34 +350,6 @@ module Gitrb
348
350
  end
349
351
  end
350
352
 
351
- # Start a transaction.
352
- #
353
- # Tries to get lock on lock file, load the this repository if
354
- # has changed in the repository.
355
- def start_transaction
356
- file = File.open("#{head_path}.lock", 'w')
357
- file.flock(File::LOCK_EX)
358
- @lock[Thread.current.object_id] = file
359
- refresh
360
- end
361
-
362
- # Rerepository the state of the repository.
363
- #
364
- # Any changes made to the repository are discarded.
365
- def rollback_transaction
366
- @objects.clear
367
- load
368
- end
369
-
370
- # Finish the transaction.
371
- #
372
- # Release the lock file.
373
- def finish_transaction
374
- @lock[Thread.current.object_id].close rescue nil
375
- @lock.delete(Thread.current.object_id)
376
- File.unlink("#{head_path}.lock") rescue nil
377
- end
378
-
379
353
  def get_type(id, expected)
380
354
  object = get(id)
381
355
  raise NotFound, "Wrong type #{object.type}, expected #{expected}" if object && object.type != expected
@@ -384,7 +358,7 @@ module Gitrb
384
358
 
385
359
  def load_packs
386
360
  @packs = Trie.new
387
- @objects = Util::Synchronized.new(Trie.new)
361
+ @objects = Trie.new
388
362
 
389
363
  packs_path = "#{@path}/objects/pack"
390
364
  if File.directory?(packs_path)
@@ -410,11 +384,6 @@ module Gitrb
410
384
  @logger.debug "gitrb: Reloaded, head is #{head ? head.id : 'nil'}"
411
385
  end
412
386
 
413
- # Returns the hash value of an object string.
414
- def sha(str)
415
- Digest::SHA1.hexdigest(str)[0, 40]
416
- end
417
-
418
387
  # Returns the path to the current head file.
419
388
  def head_path
420
389
  "#{path}/refs/heads/#{branch}"
data/lib/gitrb/util.rb CHANGED
@@ -17,17 +17,6 @@ module Gitrb
17
17
  str
18
18
  end
19
19
  end
20
-
21
- class Synchronized
22
- def initialize(obj)
23
- @obj = obj
24
- @mutex = Mutex.new
25
- end
26
-
27
- def method_missing(*args)
28
- @mutex.synchronize { @obj.send(*args) }
29
- end
30
- end
31
20
  end
32
21
  end
33
22
 
@@ -190,31 +190,6 @@ describe Gitrb do
190
190
  repo.git_show(c).should.equal 'c'
191
191
  end
192
192
 
193
- it 'should allow only one transaction' do
194
- file 'a/b', 'Hello'
195
-
196
- ready = false
197
-
198
- # This test case produces a deadlock in old ruby versions
199
- # (Works in 1.8.7_p302 and 1.9)
200
- repo.transaction do
201
- Thread.start do
202
- repo.transaction do
203
- sleep 0.1
204
- repo.root['a/b'] = Gitrb::Blob.new(:data => 'Changed by second thread')
205
- end
206
- ready = true
207
- end
208
- repo.root['a/b'] = Gitrb::Blob.new(:data => 'Changed')
209
- end
210
-
211
- repo.root['a/b'].data.should.equal 'Changed'
212
-
213
- sleep 0.01 until ready
214
-
215
- repo.root['a/b'].data.should.equal 'Changed by second thread'
216
- end
217
-
218
193
  it 'should find all objects' do
219
194
  repo.root['c'] = Gitrb::Blob.new(:data => 'Hello')
220
195
  repo.root['d'] = Gitrb::Blob.new(:data => 'World')
@@ -272,32 +247,6 @@ describe Gitrb do
272
247
  repo.root['a'].data.should.equal 'data'
273
248
  end
274
249
 
275
- it 'should forbid branch switching from within transaction' do
276
- repo.transaction do
277
- lambda { repo.branch = 'test' }.should.raise(ThreadError)
278
- end
279
- end
280
-
281
- it 'should forbid clearing from within transaction' do
282
- repo.transaction do
283
- lambda { repo.clear }.should.raise(ThreadError)
284
- end
285
- end
286
-
287
- it 'should forbid nested transactions' do
288
- repo.transaction do
289
- lambda { repo.transaction {} }.should.raise(ThreadError)
290
- end
291
- end
292
-
293
- it 'should be in transaction' do
294
- repo.should.not.be.in_transaction
295
- repo.transaction do
296
- repo.should.be.in_transaction
297
- end
298
- repo.should.not.be.in_transaction
299
- end
300
-
301
250
  it "should diff 2 commits" do
302
251
  repo.root['x'] = Gitrb::Blob.new(:data => 'a')
303
252
  repo.root['y'] = Gitrb::Blob.new(:data => "\nFirst Line.\nSecond Line.\nLast Line.\n")
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 3
9
- version: 0.2.3
8
+ - 4
9
+ version: 0.2.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Daniel Mendler
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-03 00:00:00 +02:00
17
+ date: 2010-09-16 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency