summaryrefslogtreecommitdiffstats
path: root/lib/git/lib.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/git/lib.rb')
-rw-r--r--lib/git/lib.rb83
1 files changed, 69 insertions, 14 deletions
diff --git a/lib/git/lib.rb b/lib/git/lib.rb
index 2937d52..8bb518b 100644
--- a/lib/git/lib.rb
+++ b/lib/git/lib.rb
@@ -3,15 +3,26 @@ module Git
class GitExecuteError < StandardError
end
- class GitNoOutput < StandardError
- end
-
class Lib
- @base = nil
-
+ @git_dir = nil
+ @git_index_file = nil
+ @git_work_dir = nil
+
def initialize(base)
- @base = base
+ if base.is_a?(Git::Base)
+ @git_dir = base.repo.path
+ @git_index_file = base.index.path
+ @git_work_dir = base.dir.path
+ elsif base.is_a?(Hash)
+ @git_dir = base[:repository]
+ @git_index_file = base[:index]
+ @git_work_dir = base[:working_directory]
+ end
+ end
+
+ def init
+ command('init')
end
def log_commits(opts = {})
@@ -42,13 +53,28 @@ module Git
end
def branches_all
- command_lines('branch', '-a').map do |b|
+ arr = []
+ command_lines('branch', '-a').each do |b|
current = false
current = true if b[0, 2] == '* '
- Git::Branch.new(@base, b.gsub('* ', '').strip, current)
+ arr << [b.gsub('* ', '').strip, current]
end
+ arr
+ end
+
+ def config_get(name)
+ command('config', ['--get', name])
end
+ def config_list
+ hsh = {}
+ command_lines('config', ['--list']).each do |line|
+ (key, value) = line.split('=')
+ hsh[key] = value
+ end
+ hsh
+ end
+
def config_remote(name)
hsh = {}
command_lines('config', ['--get-regexp', "remote.#{name}"]).each do |line|
@@ -68,7 +94,7 @@ module Git
grep_opts << '-i' if opts[:ignore_case]
grep_opts << '-v' if opts[:invert_match]
grep_opts << "-e '#{string}'"
- grep_opts << opts[:object] if opts[:object].is_a? String
+ grep_opts << opts[:object] if opts[:object].is_a?(String)
grep_opts << ('-- ' + opts[:path_limiter]) if opts[:path_limiter].is_a? String
hsh = {}
command_lines('grep', grep_opts).each do |line|
@@ -80,17 +106,46 @@ module Git
hsh
end
+ def diff_full(obj1 = 'HEAD', obj2 = nil, opts = {})
+ diff_opts = ['-p']
+ diff_opts << obj1
+ diff_opts << obj2 if obj2.is_a?(String)
+ diff_opts << ('-- ' + opts[:path_limiter]) if opts[:path_limiter].is_a? String
+
+ command('diff', diff_opts)
+ end
+
+ def diff_stats(obj1 = 'HEAD', obj2 = nil, opts = {})
+ diff_opts = ['--numstat']
+ diff_opts << obj1
+ diff_opts << obj2 if obj2.is_a?(String)
+ diff_opts << ('-- ' + opts[:path_limiter]) if opts[:path_limiter].is_a? String
+
+ hsh = {:total => {:insertions => 0, :deletions => 0, :lines => 0, :files => 0}, :files => {}}
+
+ command_lines('diff', diff_opts).each do |file|
+ (insertions, deletions, filename) = file.split("\t")
+ hsh[:total][:insertions] += insertions.to_i
+ hsh[:total][:deletions] += deletions.to_i
+ hsh[:total][:lines] = (hsh[:total][:deletions] + hsh[:total][:insertions])
+ hsh[:total][:files] += 1
+ hsh[:files][filename] = {:insertions => insertions.to_i, :deletions => deletions.to_i}
+ end
+
+ hsh
+ end
+
private
def command_lines(cmd, opts)
command(cmd, opts).split("\n")
end
- def command(cmd, opts)
- ENV['GIT_DIR'] = @base.repo.path
- ENV['GIT_INDEX_FILE'] = @base.index.path
- ENV['GIT_WORK_DIR'] = @base.dir.path
- Dir.chdir(@base.dir.path) do
+ def command(cmd, opts = {})
+ ENV['GIT_DIR'] = @git_dir
+ ENV['GIT_INDEX_FILE'] = @git_index_file if @git_index_file
+ ENV['GIT_WORK_DIR'] = @git_work_dir if @git_work_dir
+ Dir.chdir(@git_work_dir || @git_dir) do
opts = opts.to_a.join(' ')
#puts "git #{cmd} #{opts}"
out = `git #{cmd} #{opts} 2>&1`.chomp