From 72ae34cf263c00376d6c13f932a5fb1cf59dbef2 Mon Sep 17 00:00:00 2001
From: scott Chacon <schacon@agadorsparticus.(none)>
Date: Sat, 17 Nov 2007 08:42:58 -0800
Subject: made it not change working directories when running git commands
 unless it needs to

---
 lib/git/lib.rb | 49 ++++++++++++++++++++++++++-----------------------
 1 file changed, 26 insertions(+), 23 deletions(-)

(limited to 'lib/git')

diff --git a/lib/git/lib.rb b/lib/git/lib.rb
index c22042f..31cf164 100644
--- a/lib/git/lib.rb
+++ b/lib/git/lib.rb
@@ -66,7 +66,7 @@ module Git
       arr_opts << opts[:object] if opts[:object].is_a? String
       arr_opts << '-- ' + opts[:path_limiter] if opts[:path_limiter].is_a? String
       
-      command_lines('log', arr_opts).map { |l| l.split.first }
+      command_lines('log', arr_opts, true).map { |l| l.split.first }
     end
     
     def revparse(string)
@@ -422,34 +422,37 @@ module Git
     
     private
     
-    def command_lines(cmd, opts = {})
-      command(cmd, opts).split("\n")
+    def command_lines(cmd, opts = {}, chdir = true)
+      command(cmd, opts, chdir).split("\n")
     end
     
-    def command(cmd, opts = {})
+    def command(cmd, opts = {}, chdir = true)
       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_DIR'] = @git_work_dir if (@git_work_dir != ENV['GIT_WORK_DIR'])
-      #path = @git_work_dir || @git_dir || @path
-      #Dir.chdir(path) do  
-        opts = opts.to_a.join(' ')
-        git_cmd = "git #{cmd} #{opts}"
+      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}"
+
+      out = nil
+      if chdir && (Dir.getwd != path)
+        Dir.chdir(path) { out = `git #{cmd} #{opts} 2>&1`.chomp } 
+      else
         out = `git #{cmd} #{opts} 2>&1`.chomp
-        #puts path
-        #puts "gd: #{@git_work_dir}"
-        #puts "gi: #{@git_index_file}"
-        #puts "pp: #{@path}"
-        #puts git_cmd
-        #puts out
-        #puts
-        if $?.exitstatus > 0
-          if $?.exitstatus == 1 && out == ''
-            return ''
-          end
-          raise Git::GitExecuteError.new(git_cmd + ':' + out.to_s) 
+      end
+      
+      #puts git_cmd
+      #puts out
+      #puts
+      
+      if $?.exitstatus > 0
+        if $?.exitstatus == 1 && out == ''
+          return ''
         end
-        out
-      #end
+        raise Git::GitExecuteError.new(git_cmd + ':' + out.to_s) 
+      end
+      out
     end
     
   end
-- 
cgit