From f590869eaa6a4c7f25a1df8eca171a119fcee7ed Mon Sep 17 00:00:00 2001 From: scott Chacon Date: Mon, 12 Nov 2007 17:58:02 -0800 Subject: added the tree functions and tests --- README | 4 ++++ lib/git/lib.rb | 10 ++++++++ lib/git/object.rb | 60 +++++++++++++++++++++++++++++++++++++++++----- tests/test_helper.rb | 17 ++++++------- tests/units/test_object.rb | 7 ++++++ 5 files changed, 84 insertions(+), 14 deletions(-) diff --git a/README b/README index 36fcba9..cc37f4c 100644 --- a/README +++ b/README @@ -67,6 +67,10 @@ Here are the operations that need read permission only. commit.date.strftime("%m-%d-%y") commit.message + tree = g.gtree("HEAD^{tree}") + tree.blobs + tree.subtrees + tree.children # blobs and subtrees g.revparse('v2.5:Makefile') diff --git a/lib/git/lib.rb b/lib/git/lib.rb index 13a3b4c..051025c 100644 --- a/lib/git/lib.rb +++ b/lib/git/lib.rb @@ -109,6 +109,16 @@ module Git command('cat-file', ['-p', sha]) end + def ls_tree(sha) + data = {'blob' => {}, 'tree' => {}} + command_lines('ls-tree', sha.to_s).each do |line| + (info, filenm) = line.split("\t") + (mode, type, sha) = info.split + data[type][filenm] = {:mode => mode, :sha => sha} + end + data + end + def branches_all arr = [] command_lines('branch', '-a').each do |b| diff --git a/lib/git/object.rb b/lib/git/object.rb index 58ea7ab..4886f09 100644 --- a/lib/git/object.rb +++ b/lib/git/object.rb @@ -51,15 +51,61 @@ module Git class Blob < AbstractObject + + def initialize(base, sha, mode = nil) + super(base, sha) + @mode = mode + end + def setup @type = 'blob' end end class Tree < AbstractObject + + @trees = nil + @blobs = nil + + def initialize(base, sha, mode = nil) + super(base, sha) + @mode = mode + end + def setup @type = 'tree' end + + def children + blobs.merge(subtrees) + end + + def blobs + check_tree + @blobs + end + alias_method :files, :blobs + + def trees + check_tree + @trees + end + alias_method :subtrees, :trees + alias_method :subdirectories, :trees + + private + + # actually run the git command + def check_tree + if !@trees + @trees = {} + @blobs = {} + data = @base.lib.ls_tree(@sha) + data['tree'].each { |k, d| @trees[k] = Tree.new(@base, d[:sha], d[:mode]) } + data['blob'].each { |k, d| @blobs[k] = Blob.new(@base, d[:sha], d[:mode]) } + end + end + end class Commit < AbstractObject @@ -123,12 +169,14 @@ module Git # see if this object has been initialized and do so if not def check_commit - data = @base.lib.commit_data(@sha) - @committer = Git::Author.new(data['committer']) - @author = Git::Author.new(data['author']) - @tree = Tree.new(@base, data['tree']) - @parents = data['parent'].map{ |sha| Commit.new(@base, sha) } - @message = data['message'].chomp + if !@tree + data = @base.lib.commit_data(@sha) + @committer = Git::Author.new(data['committer']) + @author = Git::Author.new(data['author']) + @tree = Tree.new(@base, data['tree']) + @parents = data['parent'].map{ |sha| Commit.new(@base, sha) } + @message = data['message'].chomp + end end end diff --git a/tests/test_helper.rb b/tests/test_helper.rb index 78328c9..9907ffe 100644 --- a/tests/test_helper.rb +++ b/tests/test_helper.rb @@ -22,17 +22,18 @@ class Test::Unit::TestCase end def teardown - if @wdir - FileUtils.rm_r(@wdir) + if @tmp_path + #puts "teardown #{@tmp_path}" + FileUtils.rm_r(@tmp_path) end end def create_temp_repo(clone_path) - filename = 'git_test' + Time.now.to_i.to_s + rand(300).to_s - tmp_path = File.join("/tmp/", filename) - FileUtils.mkdir_p(tmp_path) - FileUtils.cp_r(clone_path, tmp_path) - tmp_path = File.join(tmp_path, 'working') + filename = 'git_test' + Time.now.to_i.to_s + rand(300).to_s.rjust(3, '0') + @tmp_path = File.join("/tmp/", filename) + FileUtils.mkdir_p(@tmp_path) + FileUtils.cp_r(clone_path, @tmp_path) + tmp_path = File.join(@tmp_path, 'working') Dir.chdir(tmp_path) do FileUtils.mv('dot_git', '.git') end @@ -40,7 +41,7 @@ class Test::Unit::TestCase end def in_temp_dir(remove_after = true) - filename = 'git_test' + Time.now.to_i.to_s + rand(300).to_s + filename = 'git_test' + Time.now.to_i.to_s + rand(300).to_s.rjust(3, '0') tmp_path = File.join("/tmp/", filename) FileUtils.mkdir(tmp_path) Dir.chdir tmp_path do diff --git a/tests/units/test_object.rb b/tests/units/test_object.rb index c4a2de7..8b98e98 100644 --- a/tests/units/test_object.rb +++ b/tests/units/test_object.rb @@ -59,6 +59,13 @@ class TestObject < Test::Unit::TestCase o = @git.object('1cc8667014381^{tree}') assert(o.is_a?(Git::Object::Tree)) + o = @git.object('v2.7^{tree}') + + assert_equal(2, o.children.size) + assert_equal(1, o.blobs.size) + assert_equal(1, o.subtrees.size) + assert_equal(1, o.trees['ex_dir'].blobs.size) + o = @git.object('94c827875e2cadb8bc8d4cdd900f19aa9e8634c7') assert(o.is_a?(Git::Object::Tree)) assert_equal('tree', o.type) -- cgit