gitrb 0.1.5 → 0.1.6

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/Rakefile CHANGED
@@ -1,24 +1,11 @@
1
1
  require 'rake'
2
2
  require 'rake/rdoctask'
3
3
 
4
- begin
5
- require 'spec/rake/spectask'
6
- rescue LoadError
7
- puts %{To use rspec for testing you must install the rspec gem:
8
- gem install rspec}
9
- exit 0
10
- end
11
-
12
- desc "Run all specs"
13
- Spec::Rake::SpecTask.new(:spec) do |t|
14
- t.spec_opts = ['-cfs', '--backtrace']
15
- t.spec_files = FileList['test/**/*_spec.rb']
16
- end
4
+ task :default => :test
17
5
 
18
- desc "Print SpecDocs"
19
- Spec::Rake::SpecTask.new(:doc) do |t|
20
- t.spec_opts = ["--format", "specdoc"]
21
- t.spec_files = FileList['test/*_spec.rb']
6
+ desc 'Run tests with bacon'
7
+ task :test => FileList['test/*_test.rb'] do |t|
8
+ sh "bacon -q -Ilib:test #{t.prerequisites.join(' ')}"
22
9
  end
23
10
 
24
11
  desc "Generate the RDoc"
@@ -28,6 +15,3 @@ Rake::RDocTask.new do |rdoc|
28
15
  rdoc.main = "README.md"
29
16
  rdoc.title = "Gitrb"
30
17
  end
31
-
32
- desc "Run the rspec"
33
- task :default => :spec
data/gitrb.gemspec CHANGED
@@ -1,17 +1,15 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'gitrb'
3
- s.version = '0.1.5'
3
+ s.version = '0.1.6'
4
4
  s.summary = 'Pure ruby git implementation'
5
5
  s.author = 'Daniel Mendler'
6
6
  s.email = 'mail@daniel-mendler.de'
7
7
  s.homepage = 'https://github.com/minad/gitrb'
8
8
  s.rubyforge_project = %q{gitrb}
9
- s.description = <<END
10
- Pure ruby git implementation similar to grit.
11
- END
9
+ s.description = 'Fast and lightweight ruby git implementation'
12
10
  s.require_path = 'lib'
13
11
  s.has_rdoc = true
14
- s.extra_rdoc_files = ['README.md']
12
+ s.extra_rdoc_files = ['README.md']
15
13
  s.files = %w{
16
14
  LICENSE
17
15
  README.md
@@ -30,12 +28,14 @@ lib/gitrb/tree.rb
30
28
  lib/gitrb/trie.rb
31
29
  lib/gitrb/user.rb
32
30
  lib/gitrb/util.rb
33
- test/bare_repository_spec.rb
31
+ test/bare_repository_test.rb
34
32
  test/benchmark.rb
35
- test/commit_spec.rb
36
- test/repository_spec.rb
37
- test/trie_spec.rb
38
- test/tree_spec.rb
33
+ test/commit_test.rb
34
+ test/helper.rb
35
+ test/profile.rb
36
+ test/repository_test.rb
37
+ test/trie_test.rb
38
+ test/tree_test.rb
39
39
  }
40
+ s.add_development_dependency('bacon')
40
41
  end
41
-
@@ -83,7 +83,14 @@ module Gitrb
83
83
  end
84
84
 
85
85
  # Diff
86
- def diff(from, to, path = nil)
86
+ # Options:
87
+ # :to - Required target commit
88
+ # :from - Optional source commit (otherwise comparision with empty tree)
89
+ # :path - Restrict to path
90
+ # :detect_renames - Detect renames O(n^2)
91
+ # :detect_copies - Detect copies O(n^2), very slow
92
+ def diff(opts)
93
+ from, to = opts[:from], opts[:to]
87
94
  if from && !(Commit === from)
88
95
  raise ArgumentError, "Invalid sha: #{from}" if from !~ SHA_PATTERN
89
96
  from = Reference.new(:repository => self, :id => from)
@@ -92,7 +99,10 @@ module Gitrb
92
99
  raise ArgumentError, "Invalid sha: #{to}" if to !~ SHA_PATTERN
93
100
  to = Reference.new(:repository => self, :id => to)
94
101
  end
95
- Diff.new(from, to, git_diff_tree('--root', '-u', '--full-index', from && from.id, to.id, '--', path))
102
+ Diff.new(from, to, git_diff_tree('--root', '--full-index', '-u',
103
+ opts[:detect_renames] ? '-M' : nil,
104
+ opts[:detect_copies] ? '-C' : nil,
105
+ from ? from.id : nil, to.id, '--', opts[:path]))
96
106
  end
97
107
 
98
108
  # All changes made inside a transaction are atomic. If some
@@ -145,12 +155,11 @@ module Gitrb
145
155
  def log(limit = 10, start = nil, path = nil)
146
156
  limit = limit.to_s
147
157
  start = start.to_s
158
+ path = path.to_s
148
159
  raise ArgumentError, "Invalid limit: #{limit}" if limit !~ /^\d+$/
149
160
  raise ArgumentError, "Invalid commit: #{start}" if start =~ /^\-/
150
- args = ['--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', "-#{limit}" ]
151
- args << start if !start.empty?
152
- args << '--' << path if path && !path.empty?
153
- log = git_log(*args).split(/\n*\x00\n*/)
161
+ 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',
162
+ "-#{limit}", start.empty? ? nil : start, '--', path.empty? ? nil : path).split(/\n*\x00\n*/)
154
163
  commits = []
155
164
  log.each_slice(2) do |data, message|
156
165
  data = data.split("\n")
@@ -176,15 +185,20 @@ module Gitrb
176
185
  raise ArgumentError, 'No id given' if !(String === id)
177
186
 
178
187
  if id =~ SHA_PATTERN
179
- raise NotFound, "Sha too short: #{id}" if id.length < 5
180
- list = @objects.find(id).to_a
181
- raise NotFound, "Sha is ambiguous: #{id}" if list.size > 1
182
- return list.first if list.size == 1
188
+ raise ArgumentError, "Sha too short: #{id}" if id.length < 5
189
+
190
+ trie = @objects.find(id)
191
+ raise NotFound, "Sha is ambiguous: #{id}" if trie.size > 1
192
+ return trie.value if !trie.empty?
183
193
  elsif id =~ REVISION_PATTERN
184
194
  list = git_rev_parse(id).split("\n") rescue nil
185
195
  raise NotFound, "Revision not found: #{id}" if !list || list.empty?
186
196
  raise NotFound, "Revision is ambiguous: #{id}" if list.size > 1
187
197
  id = list.first
198
+
199
+ trie = @objects.find(id)
200
+ raise NotFound, "Sha is ambiguous: #{id}" if trie.size > 1
201
+ return trie.value if !trie.empty?
188
202
  end
189
203
 
190
204
  @logger.debug "gitrb: Loading #{id}"
@@ -207,14 +221,10 @@ module Gitrb
207
221
  raise NotFound, "Bad object: #{id}" if content.length != size.to_i
208
222
  else
209
223
  trie = @packs.find(id)
210
- raise NotFound, "Object not found: #{id}" if !trie
211
-
212
- id += trie.key[-(41 - id.length)...-1]
213
-
214
- list = trie.to_a
215
- raise NotFound, "Sha is ambiguous: #{id}" if list.size > 1
216
-
217
- pack, offset = list.first
224
+ raise NotFound, "Object not found: #{id}" if trie.empty?
225
+ raise NotFound, "Sha is ambiguous: #{id}" if trie.size > 1
226
+ id = trie.key
227
+ pack, offset = trie.value
218
228
  content, type = pack.get_object(offset)
219
229
  end
220
230
 
@@ -365,7 +375,7 @@ module Gitrb
365
375
 
366
376
  def load_packs
367
377
  @packs = Trie.new
368
- @objects = Synchronized.new(Trie.new)
378
+ @objects = Util::Synchronized.new(Trie.new)
369
379
 
370
380
  packs_path = "#{@path}/objects/pack"
371
381
  if File.directory?(packs_path)
data/lib/gitrb/trie.rb CHANGED
@@ -4,72 +4,91 @@ module Gitrb
4
4
 
5
5
  attr_reader :key, :value
6
6
 
7
- def initialize(key = '', value = nil, children = [])
7
+ def initialize(key = nil, value = nil, children = [])
8
8
  @key = key
9
9
  @value = value
10
10
  @children = children
11
11
  end
12
12
 
13
+ def children
14
+ @children.compact
15
+ end
16
+
13
17
  def clear
14
- @key = ''
15
- @value = nil
16
- @children.clear
18
+ @key = @value = nil
19
+ @children = []
20
+ end
21
+
22
+ def empty?
23
+ self.size == 0
24
+ end
25
+
26
+ def each(&block)
27
+ yield(@value) if @value
28
+ children.each {|child| child.each(&block) }
29
+ end
30
+
31
+ def size
32
+ children.inject(@value ? 1 : 0) {|sum, child| sum + child.size }
17
33
  end
18
34
 
19
35
  def find(key)
20
- if key.empty?
21
- self
22
- else
23
- child = @children[key[0].ord]
24
- if child && key[0...child.key.length] == child.key
25
- child.find(key[child.key.length..-1])
36
+ if @key
37
+ if @key.index(key) == 0
38
+ self
39
+ elsif key.index(@key) == 0
40
+ child = @children[index(key)]
41
+ child ? child.find(key) : Trie.new
26
42
  else
27
- nil
43
+ Trie.new
28
44
  end
45
+ else
46
+ self
29
47
  end
30
48
  end
31
49
 
32
50
  def insert(key, value)
33
- if key.empty?
51
+ if !@key
52
+ @key = key
34
53
  @value = value
35
- self
36
- else
37
- idx = key[0].ord
38
- child = @children[idx]
39
- if child
40
- child.split(key) if key[0...child.key.length] != child.key
41
- child.insert(key[child.key.length..-1], value)
54
+ elsif @key == key
55
+ @value = value
56
+ elsif @key.index(key) == 0
57
+ child = Trie.new(@key, @value, @children)
58
+ @children = []
59
+ @children[@key[key.length].ord] = child
60
+ @key = key
61
+ @value = value
62
+ elsif key.index(@key) == 0
63
+ i = index(key)
64
+ if @children[i]
65
+ @children[i].insert(key, value)
42
66
  else
43
- @children[idx] = Trie.new(key, value)
67
+ @children[i] = Trie.new(key, value)
44
68
  end
45
- end
46
- end
47
-
48
- def each(&block)
49
- yield(@value) if !@key.empty?
50
- @children.compact.each {|c| c.each(&block) }
51
- end
69
+ else
70
+ n = 0
71
+ n += 1 while key[n] == @key[n]
52
72
 
53
- def values
54
- to_a
55
- end
73
+ child1 = Trie.new(@key, @value, @children)
74
+ child2 = Trie.new(key, value)
56
75
 
57
- def dup
58
- Trie.new(@key.dup, @value ? @value.dup : nil, @children.map {|c| c ? c.dup : nil })
76
+ @value = nil
77
+ @key = @key[0...n]
78
+ @children = []
79
+ @children[index(child1.key)] = child1
80
+ @children[index(child2.key)] = child2
81
+ end
59
82
  end
60
83
 
61
84
  def inspect
62
85
  "#<Gitrb::Trie @key=#{@key.inspect}, @value=#{@value.inspect}, @children=#{@children.compact.inspect}>"
63
86
  end
64
87
 
65
- def split(key)
66
- prefix = 0
67
- prefix += 1 while key[prefix] == @key[prefix]
68
- child = Trie.new(@key[prefix..-1], @value, @children)
69
- @children = []
70
- @children[@key[prefix].ord] = child
71
- @key = @key[0...prefix]
72
- @value = nil
88
+ private
89
+
90
+ def index(key)
91
+ key[@key.length].ord
73
92
  end
74
93
  end
75
94
  end
data/lib/gitrb/util.rb CHANGED
@@ -17,16 +17,16 @@ module Gitrb
17
17
  str
18
18
  end
19
19
  end
20
- end
21
20
 
22
- class Synchronized
23
- def initialize(obj)
24
- @obj = obj
25
- @mutex = Mutex.new
26
- end
21
+ class Synchronized
22
+ def initialize(obj)
23
+ @obj = obj
24
+ @mutex = Mutex.new
25
+ end
27
26
 
28
- def method_missing(*args)
29
- @mutex.synchronize { @obj.send(*args) }
27
+ def method_missing(*args)
28
+ @mutex.synchronize { @obj.send(*args) }
29
+ end
30
30
  end
31
31
  end
32
32
  end
@@ -1,14 +1,10 @@
1
- require "#{File.dirname(__FILE__)}/../lib/gitrb"
2
- require "#{File.dirname(__FILE__)}/helper"
3
- require 'pp'
1
+ require 'helper'
4
2
 
5
3
  describe Gitrb do
6
4
 
7
5
  REPO = '/tmp/gitrb_test.git'
8
6
 
9
- attr_reader :repo
10
-
11
- before(:each) do
7
+ before do
12
8
  FileUtils.rm_rf REPO
13
9
  Dir.mkdir REPO
14
10
 
@@ -18,13 +14,13 @@ describe Gitrb do
18
14
  it 'should fail to initialize without a valid git repository' do
19
15
  lambda {
20
16
  Gitrb::Repository.new('/foo', 'master', true)
21
- }.should raise_error(ArgumentError)
17
+ }.should.raise(ArgumentError)
22
18
  end
23
19
 
24
20
  it 'should save and load entries' do
25
21
  repo.root['a'] = Gitrb::Blob.new(:data => 'Hello')
26
22
  repo.commit
27
23
 
28
- repo.root['a'].data.should == 'Hello'
24
+ repo.root['a'].data.should.equal 'Hello'
29
25
  end
30
26
  end
data/test/benchmark.rb CHANGED
@@ -1,5 +1,3 @@
1
- Gem.activate 'diff-lcs'
2
-
3
1
  require 'gitrb'
4
2
  require 'grit'
5
3
  require 'benchmark'
@@ -1,13 +1,10 @@
1
- require "#{File.dirname(__FILE__)}/../lib/gitrb"
2
- require 'pp'
1
+ require 'helper'
3
2
 
4
3
  describe Gitrb::Commit do
5
4
 
6
5
  REPO = '/tmp/gitrb_test'
7
6
 
8
- attr_reader :repo
9
-
10
- before(:each) do
7
+ before do
11
8
  FileUtils.rm_rf REPO
12
9
  Dir.mkdir REPO
13
10
 
@@ -25,7 +22,7 @@ describe Gitrb::Commit do
25
22
 
26
23
  content = commit.dump
27
24
 
28
- content.should == "tree #{@repo.root.id}
25
+ content.should.equal "tree #{@repo.root.id}
29
26
  author #{user.dump}
30
27
  committer #{user.dump}
31
28
 
@@ -40,34 +37,12 @@ This is a message"
40
37
  commit = repo.commit("Commit Message", author, author)
41
38
 
42
39
  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"
40
+ io.gets.should.equal "commit #{commit.id}\n"
41
+ io.gets.should.equal "Author: hans <hans@email.de>\n"
42
+ io.gets.should.equal "Date: Mon Apr 20 00:00:00 2009 #{Time.now.strftime('%z')}\n"
43
+ io.gets.should.equal "\n"
44
+ io.gets.should.equal " Commit Message\n"
48
45
  end
49
46
  end
50
47
 
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
48
  end
data/test/helper.rb ADDED
@@ -0,0 +1,23 @@
1
+ require 'gitrb'
2
+
3
+ module TestHelper
4
+ def ls_tree(id)
5
+ repo.git_ls_tree(id).split("\n").map {|line| line.split(" ") }
6
+ end
7
+
8
+ def file(file, data)
9
+ Dir.chdir(repo.path[0..-6]) do
10
+ FileUtils.mkpath(File.dirname(file))
11
+ open(file, 'w') { |io| io << data }
12
+
13
+ repo.git_add(file)
14
+ repo.git_commit('-m', 'added #{file}')
15
+ File.unlink(file)
16
+ end
17
+ end
18
+ end
19
+
20
+ class Bacon::Context
21
+ include TestHelper
22
+ attr_reader :repo
23
+ end
data/test/profile.rb ADDED
@@ -0,0 +1,26 @@
1
+ require 'gitrb'
2
+ require 'fileutils'
3
+ require 'grit'
4
+ require 'ruby-prof'
5
+
6
+ REPO = '/tmp/gitrb'
7
+
8
+ FileUtils.rm_rf REPO
9
+ FileUtils.mkpath REPO
10
+
11
+ repo = Gitrb::Repository.new(:path => REPO, :create => true)
12
+ repo.transaction { 'aaa'.upto('jjj') { |key| repo.root[key] = Gitrb::Blob.new(:data => rand.to_s) } }
13
+
14
+ result = RubyProf.profile do
15
+ Gitrb::Repository.new(:path => '.').root.values { |v| v }
16
+ end
17
+
18
+ printer = RubyProf::GraphHtmlPrinter.new(result)
19
+ printer.print(File.open('gitrb.html', 'w'), :min_percent => 10)
20
+
21
+ result = RubyProf.profile do
22
+ Grit::Repo.new(:path => '.').tree.contents.each { |e| e.data }
23
+ end
24
+
25
+ printer = RubyProf::GraphHtmlPrinter.new(result)
26
+ printer.print(File.open('grit.html', 'w'), :min_percent => 10)
@@ -1,16 +1,10 @@
1
- require "#{File.dirname(__FILE__)}/../lib/gitrb"
2
- require "#{File.dirname(__FILE__)}/helper"
3
- require 'pp'
1
+ require 'helper'
4
2
 
5
3
  describe Gitrb do
6
4
 
7
- include Helper
8
-
9
5
  REPO = '/tmp/gitrb_test'
10
6
 
11
- attr_reader :repo
12
-
13
- before(:each) do
7
+ before do
14
8
  FileUtils.rm_rf REPO
15
9
  Dir.mkdir REPO
16
10
  @repo = Gitrb::Repository.new(:path => REPO, :create => true)
@@ -19,52 +13,52 @@ describe Gitrb do
19
13
  it 'should fail to initialize without a valid git repository' do
20
14
  lambda do
21
15
  Gitrb::Repository.new(:path => '/')
22
- end.should raise_error(ArgumentError)
16
+ end.should.raise(ArgumentError)
23
17
  end
24
18
 
25
19
  it 'should put and get objects by sha' do
26
20
  blob1 = repo.put(Gitrb::Blob.new(:data => 'Hello'))
27
21
  blob2 = repo.put(Gitrb::Blob.new(:data => 'World'))
28
22
 
29
- repo.get(blob1.id).should === blob1
30
- repo.get(blob1.id[0..4]).should === blob1
31
- repo.get(blob1.id[0..10]).should === blob1
23
+ repo.get(blob1.id).should.be.identical_to blob1
24
+ repo.get(blob1.id[0..4]).should.be.identical_to blob1
25
+ repo.get(blob1.id[0..10]).should.be.identical_to blob1
32
26
 
33
- repo.get(blob2.id).should === blob2
34
- repo.get(blob2.id[0..4]).should === blob2
35
- repo.get(blob2.id[0..10]).should === blob2
27
+ repo.get(blob2.id).should.be.identical_to blob2
28
+ repo.get(blob2.id[0..4]).should.be.identical_to blob2
29
+ repo.get(blob2.id[0..10]).should.be.identical_to blob2
36
30
  end
37
31
 
38
32
  it 'should find commits by revision' do
39
33
  repo.root['a'] = Gitrb::Blob.new(:data => 'Hello')
40
34
  commit1 = repo.commit
41
35
 
42
- repo.get('HEAD').should === commit1
43
- repo.get('master').should === commit1
44
- lambda { repo.get('HEAD^') }.should raise_error(Gitrb::NotFound)
36
+ repo.get('HEAD').should.be.identical_to commit1
37
+ repo.get('master').should.be.identical_to commit1
38
+ lambda { repo.get('HEAD^') }.should.raise(Gitrb::NotFound)
45
39
 
46
40
  repo.root['a'] = Gitrb::Blob.new(:data => 'World')
47
41
  commit2 = repo.commit
48
42
 
49
- repo.get('master').should === commit2
50
- repo.get('HEAD').should === commit2
51
- repo.get('HEAD^').should === commit1
52
- repo.get('HEAD~').should === commit1
53
- lambda { repo.get('HEAD^^') }.should raise_error(Gitrb::NotFound)
43
+ repo.get('master').should.be.identical_to commit2
44
+ repo.get('HEAD').should.be.identical_to commit2
45
+ repo.get('HEAD^').should.be.identical_to commit1
46
+ repo.get('HEAD~').should.be.identical_to commit1
47
+ lambda { repo.get('HEAD^^') }.should.raise(Gitrb::NotFound)
54
48
  end
55
49
 
56
50
  it 'should find modified entries' do
57
51
  repo.root['a'] = Gitrb::Blob.new(:data => 'Hello')
58
52
 
59
- repo.root.should be_modified
53
+ repo.root.should.be.modified
60
54
 
61
55
  repo.commit
62
56
 
63
- repo.root.should_not be_modified
57
+ repo.root.should.not.be.modified
64
58
 
65
59
  repo.root['a'] = Gitrb::Blob.new(:data => 'Bello')
66
60
 
67
- repo.root.should be_modified
61
+ repo.root.should.be.modified
68
62
  end
69
63
 
70
64
  it 'should load a repo' do
@@ -73,8 +67,8 @@ describe Gitrb do
73
67
 
74
68
  repo.refresh
75
69
 
76
- repo.root['a'].data.should == 'Hello'
77
- repo.root['b'].data.should == 'World'
70
+ repo.root['a'].data.should.equal 'Hello'
71
+ repo.root['b'].data.should.equal 'World'
78
72
  end
79
73
 
80
74
  it 'should load folders' do
@@ -83,11 +77,11 @@ describe Gitrb do
83
77
 
84
78
  repo.refresh
85
79
 
86
- repo.root['x'].object.should be_kind_of(Gitrb::Tree)
87
- repo.root['y'].object.should be_kind_of(Gitrb::Tree)
80
+ repo.root['x'].object.should.be.kind_of(Gitrb::Tree)
81
+ repo.root['y'].object.should.be.kind_of(Gitrb::Tree)
88
82
 
89
- repo.root['x']['a'].data.should == 'Hello'
90
- repo.root['y']['b'].data.should == 'World'
83
+ repo.root['x']['a'].data.should.equal 'Hello'
84
+ repo.root['y']['b'].data.should.equal 'World'
91
85
  end
92
86
 
93
87
  it 'should detect modification' do
@@ -97,17 +91,17 @@ describe Gitrb do
97
91
 
98
92
  repo.refresh
99
93
 
100
- repo.root['x/a'].data.should == 'a'
94
+ repo.root['x/a'].data.should.equal 'a'
101
95
 
102
96
  repo.transaction do
103
97
  repo.root['x/a'] = Gitrb::Blob.new(:data => 'b')
104
- repo.root['x'].should be_modified
105
- repo.root.should be_modified
98
+ repo.root['x'].should.be.modified
99
+ repo.root.should.be.modified
106
100
  end
107
101
 
108
102
  repo.refresh
109
103
 
110
- repo.root['x/a'].data.should == 'b'
104
+ repo.root['x/a'].data.should.equal 'b'
111
105
  end
112
106
 
113
107
  it 'should resolve paths' do
@@ -116,39 +110,39 @@ describe Gitrb do
116
110
 
117
111
  repo.refresh
118
112
 
119
- repo.root['x/a'].data.should == 'Hello'
120
- repo.root['y/b'].data.should == 'World'
113
+ repo.root['x/a'].data.should.equal 'Hello'
114
+ repo.root['y/b'].data.should.equal 'World'
121
115
 
122
116
  repo.root['y/b'] = Gitrb::Blob.new(:data => 'Now this')
123
117
 
124
- repo.root['y']['b'].data.should == 'Now this'
118
+ repo.root['y']['b'].data.should.equal 'Now this'
125
119
  end
126
120
 
127
121
  it 'should create new trees' do
128
122
  repo.root['new/tree'] = Gitrb::Blob.new(:data => 'This tree')
129
- repo.root['new/tree'].data.should == 'This tree'
123
+ repo.root['new/tree'].data.should.equal 'This tree'
130
124
  end
131
125
 
132
126
  it 'should delete entries' do
133
127
  repo.root['a'] = Gitrb::Blob.new(:data => 'Hello')
134
128
  repo.root.delete('a')
135
129
 
136
- repo.root['a'].should be_nil
130
+ repo.root['a'].should.be.nil
137
131
  end
138
132
 
139
133
  it 'should move entries' do
140
134
  repo.root['a/b/c'] = Gitrb::Blob.new(:data => 'Hello')
141
- repo.root['a/b/c'].data.should == 'Hello'
135
+ repo.root['a/b/c'].data.should.equal 'Hello'
142
136
  repo.root.move('a/b/c', 'x/y/z')
143
- repo.root['a/b/c'].should be_nil
144
- repo.root['x/y/z'].data.should == 'Hello'
137
+ repo.root['a/b/c'].should.be.nil
138
+ repo.root['x/y/z'].data.should.equal 'Hello'
145
139
  end
146
140
 
147
141
  it 'should have a head commit' do
148
142
  file 'a', 'Hello'
149
143
 
150
144
  repo.refresh
151
- repo.head.should_not be_nil
145
+ repo.head.should.not.be.nil
152
146
  end
153
147
 
154
148
  it 'should rollback a transaction' do
@@ -164,9 +158,9 @@ describe Gitrb do
164
158
  rescue
165
159
  end
166
160
 
167
- repo.root['a/b'].data.should == 'Hello'
168
- repo.root['c/d'].data.should == 'World'
169
- repo.root['x/a'].should be_nil
161
+ repo.root['a/b'].data.should.equal 'Hello'
162
+ repo.root['c/d'].data.should.equal 'World'
163
+ repo.root['x/a'].should.be.nil
170
164
  end
171
165
 
172
166
  it 'should commit a transaction' do
@@ -181,11 +175,11 @@ describe Gitrb do
181
175
  a = ls_tree(repo.root['a'].object.id)
182
176
  x = ls_tree(repo.root['x'].object.id)
183
177
 
184
- a.should == [["100644", "blob", "b653cf27cef08de46da49a11fa5016421e9e3b32", "b"]]
185
- x.should == [["100644", "blob", "87d2b203800386b1cc8735a7d540a33e246357fa", "a"]]
178
+ a.should.equal [["100644", "blob", "b653cf27cef08de46da49a11fa5016421e9e3b32", "b"]]
179
+ x.should.equal [["100644", "blob", "87d2b203800386b1cc8735a7d540a33e246357fa", "a"]]
186
180
 
187
- repo.git_show(a[0][2]).should == 'Changed'
188
- repo.git_show(x[0][2]).should == 'Added'
181
+ repo.git_show(a[0][2]).should.equal 'Changed'
182
+ repo.git_show(x[0][2]).should.equal 'Added'
189
183
  end
190
184
 
191
185
  it "should save blobs" do
@@ -199,9 +193,9 @@ describe Gitrb do
199
193
  b = repo.root['b'].id
200
194
  c = repo.root['c'].id
201
195
 
202
- repo.git_show(a).should == 'a'
203
- repo.git_show(b).should == 'b'
204
- repo.git_show(c).should == 'c'
196
+ repo.git_show(a).should.equal 'a'
197
+ repo.git_show(b).should.equal 'b'
198
+ repo.git_show(c).should.equal 'c'
205
199
  end
206
200
 
207
201
  it 'should allow only one transaction' do
@@ -223,7 +217,7 @@ describe Gitrb do
223
217
 
224
218
  repo.refresh
225
219
 
226
- repo.root['a/b'].data.should == 'Changed by second thread'
220
+ repo.root['a/b'].data.should.equal 'Changed by second thread'
227
221
  end
228
222
 
229
223
  it 'should find all objects' do
@@ -232,8 +226,8 @@ describe Gitrb do
232
226
  repo.root['d'] = Gitrb::Blob.new(:data => 'World')
233
227
  repo.commit
234
228
 
235
- repo.root.to_a[0][1].data.should == 'Hello'
236
- repo.root.to_a[1][1].data.should == 'World'
229
+ repo.root.to_a[0][1].data.should.equal 'Hello'
230
+ repo.root.to_a[1][1].data.should.equal 'World'
237
231
  end
238
232
 
239
233
  it "should load log" do
@@ -243,8 +237,8 @@ describe Gitrb do
243
237
  repo.root['b'] = Gitrb::Blob.new(:data => 'b')
244
238
  repo.commit 'added b'
245
239
 
246
- repo.log[0].message.should == 'added b'
247
- repo.log[1].message.should == 'added a'
240
+ repo.log[0].message.should.equal 'added b'
241
+ repo.log[1].message.should.equal 'added a'
248
242
  end
249
243
 
250
244
  it "should load tags" do
@@ -258,54 +252,67 @@ describe Gitrb do
258
252
  id = File.read(repo.path + '/refs/tags/0.1')
259
253
  tag = repo.get(id)
260
254
 
261
- tag.tagtype.should == 'commit'
262
- tag.object.object.should == repo.head
263
- tag.tagger.name.should == user.name
264
- tag.tagger.email.should == user.email
255
+ tag.tagtype.should.equal 'commit'
256
+ tag.object.object.should.equal repo.head
257
+ tag.tagger.name.should.equal user.name
258
+ tag.tagger.email.should.equal user.email
265
259
  tag.message.should =~ /message/
266
260
  end
267
261
 
268
262
  it 'should detect changes and refresh' do
269
263
  file 'a', 'data'
270
- repo.root['a'].should be_nil
271
- repo.should be_changed
264
+ repo.root['a'].should.be.nil
265
+ repo.should.be.changed
272
266
  repo.refresh
273
- repo.should_not be_changed
274
- repo.root['a'].data.should == 'data'
267
+ repo.should.not.be.changed
268
+ repo.root['a'].data.should.equal 'data'
275
269
  end
276
270
 
277
271
  it 'should clear cache' do
278
272
  file 'a', 'data'
279
273
  repo.refresh
280
- repo.root['a'].data.should == 'data'
274
+ repo.root['a'].data.should.equal 'data'
281
275
  repo.clear
282
- repo.root['a'].data.should == 'data'
276
+ repo.root['a'].data.should.equal 'data'
283
277
  end
284
278
 
285
279
  it 'should forbid branch switching from within transaction' do
286
280
  repo.transaction do
287
- lambda { repo.branch = 'test' }.should raise_error(ThreadError)
281
+ lambda { repo.branch = 'test' }.should.raise(ThreadError)
288
282
  end
289
283
  end
290
284
 
291
285
  it 'should forbid clearing from within transaction' do
292
286
  repo.transaction do
293
- lambda { repo.clear }.should raise_error(ThreadError)
287
+ lambda { repo.clear }.should.raise(ThreadError)
294
288
  end
295
289
  end
296
290
 
297
291
  it 'should forbid nested transactions' do
298
292
  repo.transaction do
299
- lambda { repo.transaction {} }.should raise_error(ThreadError)
293
+ lambda { repo.transaction {} }.should.raise(ThreadError)
300
294
  end
301
295
  end
302
296
 
303
297
  it 'should be in transaction' do
304
- repo.should_not be_in_transaction
298
+ repo.should.not.be.in_transaction
305
299
  repo.transaction do
306
- repo.should be_in_transaction
300
+ repo.should.be.in_transaction
307
301
  end
308
- repo.should_not be_in_transaction
302
+ repo.should.not.be.in_transaction
303
+ end
304
+
305
+ it "should diff 2 commits" do
306
+ repo.root['x'] = Gitrb::Blob.new(:data => 'a')
307
+ repo.root['y'] = Gitrb::Blob.new(:data => "\nFirst Line.\nSecond Line.\nLast Line.\n")
308
+ a = repo.commit
309
+
310
+ repo.diff(:to => a).patch.should.include "+First Line.\n+Second Line.\n+Last Line."
311
+ repo.root['y'] = Gitrb::Blob.new(:data => "\nFirst Line.\nLast Line.\nAnother Line.\n")
312
+ b = repo.commit
313
+
314
+ repo.diff(:from => a, :to => b).patch.should.include '+Another Line.'
315
+ repo.diff(:from => a, :to => b).patch.should.include '-Second Line.'
309
316
  end
310
317
 
311
318
  end
@@ -1,15 +1,9 @@
1
- require "#{File.dirname(__FILE__)}/../lib/gitrb"
2
- require "#{File.dirname(__FILE__)}/helper"
3
- require 'pp'
1
+ require 'helper'
4
2
 
5
3
  describe Gitrb::Tree do
6
4
  REPO = '/tmp/gitrb_test'
7
5
 
8
- include Helper
9
-
10
- attr_reader :repo, :tree
11
-
12
- before(:each) do
6
+ before do
13
7
  FileUtils.rm_rf REPO
14
8
  Dir.mkdir REPO
15
9
 
@@ -34,10 +28,10 @@ describe Gitrb::Tree do
34
28
  "100644 b\0#{b}" +
35
29
  "100644 c\0#{c}"
36
30
 
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')
31
+ repo.get(id).should.be.instance_of(Gitrb::Tree)
32
+ repo.get(id).names.should.include('a')
33
+ repo.get(id).names.should.include('b')
34
+ repo.get(id).names.should.include('c')
41
35
  end
42
36
 
43
37
  it "should save trees" do
@@ -49,7 +43,7 @@ describe Gitrb::Tree do
49
43
 
50
44
  tree.save
51
45
 
52
- ls_tree(tree.id).should ==
46
+ ls_tree(tree.id).should.equal\
53
47
  [["100644", "blob", "2e65efe2a145dda7ee51d1741299f848e5bf752e", "a"],
54
48
  ["100644", "blob", "63d8dbd40c23542e740659a7168a0ce3138ea748", "b"],
55
49
  ["100644", "blob", "3410062ba67c5ed59b854387a8bc0ec012479368", "c"]]
@@ -64,10 +58,10 @@ describe Gitrb::Tree do
64
58
 
65
59
  tree.save
66
60
 
67
- ls_tree(tree.id).should ==
61
+ ls_tree(tree.id).should.equal\
68
62
  [["040000", "tree", "24e88cb96c396400000ef706d1ca1ed9a88251aa", "x"]]
69
63
 
70
- ls_tree("24e88cb96c396400000ef706d1ca1ed9a88251aa").should ==
64
+ ls_tree("24e88cb96c396400000ef706d1ca1ed9a88251aa").should.equal\
71
65
  [["100644", "blob", "2e65efe2a145dda7ee51d1741299f848e5bf752e", "a"],
72
66
  ["100644", "blob", "63d8dbd40c23542e740659a7168a0ce3138ea748", "b"],
73
67
  ["100644", "blob", "3410062ba67c5ed59b854387a8bc0ec012479368", "c"]]
data/test/trie_test.rb ADDED
@@ -0,0 +1,96 @@
1
+ require 'gitrb'
2
+
3
+ describe Gitrb::Trie do
4
+
5
+ before do
6
+ @trie = Gitrb::Trie.new
7
+ end
8
+
9
+ it 'should be empty' do
10
+ @trie.should.be.empty
11
+ @trie.to_a.should.be.empty
12
+ @trie.size.should.equal 0
13
+ @trie.find('').should.be.identical_to @trie
14
+ @trie.find('abc').should.be.identical_to @trie
15
+ end
16
+
17
+ it 'should find by prefix' do
18
+ @trie.insert('abcdef', 1)
19
+ @trie.find('a').should.be.identical_to @trie.find('abcdef')
20
+ @trie.find('abc').should.be.identical_to @trie.find('abcdef')
21
+ @trie.find('abc').key.should.equal 'abcdef'
22
+ end
23
+
24
+ it 'should have clear' do
25
+ @trie.insert('abc', 1)
26
+ @trie.should.not.be.empty
27
+ @trie.clear
28
+ @trie.should.be.empty
29
+ end
30
+
31
+ it 'should split shorter node' do
32
+ @trie.insert('a', 1)
33
+ @trie.key.should.equal 'a'
34
+ @trie.value.should.equal 1
35
+ @trie.size.should.equal 1
36
+ @trie.find('a').should.be.identical_to @trie
37
+
38
+ @trie.insert('b', 2)
39
+ @trie.children.size.should.equal 2
40
+ @trie.key.should.equal ''
41
+ @trie.value.should.be.nil
42
+ @trie.size.should.equal 2
43
+ @trie.find('a').key.should.equal 'a'
44
+ @trie.find('b').key.should.equal 'b'
45
+ @trie.size.should.equal 2
46
+ end
47
+
48
+ it 'should add child' do
49
+ @trie.insert('a', 1)
50
+
51
+ @trie.insert('ab', 2)
52
+ @trie.size.should.equal 2
53
+ @trie.children.size.should.equal 1
54
+ @trie.find('a').children.size.should.equal 1
55
+ @trie.find('a').key.should.equal 'a'
56
+ @trie.find('a').value.should.equal 1
57
+ @trie.find('ab').key.should.equal 'ab'
58
+ @trie.find('ab').value.should.equal 2
59
+ end
60
+
61
+ it 'should overwrite value' do
62
+ @trie.insert('a', 1)
63
+ @trie.insert('a', 2)
64
+ @trie.find('a').value.should.equal 2
65
+ @trie.size.should.equal 1
66
+ end
67
+
68
+ it 'should add second-level child' do
69
+ @trie.insert('a', 1)
70
+ @trie.insert('ab', 2)
71
+ @trie.insert('abc', 3)
72
+
73
+ @trie.find('a').children.size.should.equal 1
74
+ @trie.find('ab').children.size.should.equal 1
75
+ @trie.find('abc').value.should.equal 3
76
+ @trie.size.should.equal 3
77
+ end
78
+
79
+ it 'set value of empty node' do
80
+ @trie.insert('a', 1)
81
+ @trie.insert('b', 2)
82
+ @trie.size.should.equal 2
83
+ @trie.insert('', 3)
84
+ @trie.value.should.equal 3
85
+ @trie.size.should.equal 3
86
+ end
87
+
88
+ it 'should split longer node' do
89
+ @trie.insert('ab', 1)
90
+ @trie.size.should.equal 1
91
+ @trie.insert('a', 2)
92
+ @trie.size.should.equal 2
93
+ @trie.find('ab').value.should.equal 1
94
+ @trie.find('a').value.should.equal 2
95
+ end
96
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 5
9
- version: 0.1.5
8
+ - 6
9
+ version: 0.1.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Daniel Mendler
@@ -14,13 +14,22 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-08-11 00:00:00 +02:00
17
+ date: 2010-08-13 00:00:00 +02:00
18
18
  default_executable:
19
- dependencies: []
20
-
21
- description: |
22
- Pure ruby git implementation similar to grit.
23
-
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: bacon
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :development
31
+ version_requirements: *id001
32
+ description: Fast and lightweight ruby git implementation
24
33
  email: mail@daniel-mendler.de
25
34
  executables: []
26
35
 
@@ -46,12 +55,14 @@ files:
46
55
  - lib/gitrb/trie.rb
47
56
  - lib/gitrb/user.rb
48
57
  - lib/gitrb/util.rb
49
- - test/bare_repository_spec.rb
58
+ - test/bare_repository_test.rb
50
59
  - test/benchmark.rb
51
- - test/commit_spec.rb
52
- - test/repository_spec.rb
53
- - test/trie_spec.rb
54
- - test/tree_spec.rb
60
+ - test/commit_test.rb
61
+ - test/helper.rb
62
+ - test/profile.rb
63
+ - test/repository_test.rb
64
+ - test/trie_test.rb
65
+ - test/tree_test.rb
55
66
  has_rdoc: true
56
67
  homepage: https://github.com/minad/gitrb
57
68
  licenses: []
data/test/trie_spec.rb DELETED
@@ -1,26 +0,0 @@
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