summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/git/lib.rb10
-rw-r--r--lib/git/object.rb60
2 files changed, 64 insertions, 6 deletions
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