summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/git/lib.rb20
-rw-r--r--lib/git/object.rb14
2 files changed, 25 insertions, 9 deletions
diff --git a/lib/git/lib.rb b/lib/git/lib.rb
index 55191fe..033df12 100644
--- a/lib/git/lib.rb
+++ b/lib/git/lib.rb
@@ -166,8 +166,8 @@ module Git
end
end
- def object_contents(sha)
- command('cat-file', ['-p', sha])
+ def object_contents(sha, &block)
+ command('cat-file', ['-p', sha], &block)
end
def ls_tree(sha)
@@ -596,20 +596,20 @@ module Git
command(cmd, opts, chdir).split("\n")
end
- def command(cmd, opts = [], chdir = true)
+ def command(cmd, opts = [], chdir = true, &block)
ENV['GIT_DIR'] = @git_dir if (@git_dir != ENV['GIT_DIR'])
ENV['GIT_INDEX_FILE'] = @git_index_file if (@git_index_file != ENV['GIT_INDEX_FILE'])
ENV['GIT_WORK_TREE'] = @git_work_dir if (@git_work_dir != ENV['GIT_WORK_TREE'])
path = @git_work_dir || @git_dir || @path
opts = opts.to_a.join(' ')
- git_cmd = "git #{cmd} #{opts}"
+ git_cmd = "git #{cmd} #{opts} 2>&1"
out = nil
if chdir && (Dir.getwd != path)
- Dir.chdir(path) { out = `#{git_cmd} 2>&1`.chomp }
+ Dir.chdir(path) { out = run_command(git_cmd, &block) }
else
- out = `#{git_cmd} 2>&1`.chomp
+ out = run_command(git_cmd, &block)
end
if @logger
@@ -626,5 +626,13 @@ module Git
out
end
+ def run_command(git_cmd, &block)
+ if block_given?
+ IO.popen(git_cmd, &block)
+ else
+ `#{git_cmd}`.chomp
+ end
+ end
+
end
end
diff --git a/lib/git/object.rb b/lib/git/object.rb
index e35060c..5ec24e2 100644
--- a/lib/git/object.rb
+++ b/lib/git/object.rb
@@ -28,9 +28,17 @@ module Git
@size || @size = @base.lib.object_size(@objectish)
end
- # caches the contents of this call in memory
- def contents
- @contents || @contents = @base.lib.object_contents(@objectish)
+ # get the object's contents
+ # if no block is given, the contents are cached in memory and returned as a string
+ # if a block is given, it yields an IO object (via IO::popen) which could be used to
+ # read a large file in chunks. use this for large files so that they are not held
+ # in memory
+ def contents(&block)
+ if block_given?
+ @base.lib.object_contents(@objectish, &block)
+ else
+ @contents || @contents = @base.lib.object_contents(@objectish)
+ end
end
def contents_array