]> source.dussan.org Git - redmine.git/commitdiff
scm: git: use stdin instead of command line in "git log" (#10470)
authorToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Wed, 28 Mar 2012 15:40:37 +0000 (15:40 +0000)
committerToshi MARUYAMA <marutosijp2@yahoo.co.jp>
Wed, 28 Mar 2012 15:40:37 +0000 (15:40 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9282 e93f8b46-1217-0410-a6f0-8f06a7374b81

lib/redmine/scm/adapters/abstract_adapter.rb
lib/redmine/scm/adapters/git_adapter.rb

index 3797534c373d7985d6fde059db5f231ecd29cb68..bf512d1f12a936f083e663a99d980c99b8bf368b 100644 (file)
@@ -206,15 +206,15 @@ module Redmine
           self.class.logger
         end
 
-        def shellout(cmd, &block)
-          self.class.shellout(cmd, &block)
+        def shellout(cmd, options = {}, &block)
+          self.class.shellout(cmd, options, &block)
         end
 
         def self.logger
           Rails.logger
         end
 
-        def self.shellout(cmd, &block)
+        def self.shellout(cmd, options = {}, &block)
           if logger && logger.debug?
             logger.debug "Shelling out: #{strip_credential(cmd)}"
           end
@@ -226,7 +226,7 @@ module Redmine
             mode = "r+"
             IO.popen(cmd, mode) do |io|
               io.set_encoding("ASCII-8BIT") if io.respond_to?(:set_encoding)
-              io.close_write
+              io.close_write unless options[:write_stdin]
               block.call(io) if block_given?
             end
           ## If scm command does not exist,
index 307520faa0ecd35dd42568b8f8172455ad83caff..2264d686f916eaab7ff68f0ef9a5427c87c62aa9 100644 (file)
@@ -197,24 +197,28 @@ module Redmine
 
         def revisions(path, identifier_from, identifier_to, options={})
           revs = Revisions.new
-          cmd_args = %w|log --no-color --encoding=UTF-8 --raw --date=iso --pretty=fuller --parents|
+          cmd_args = %w|log --no-color --encoding=UTF-8 --raw --date=iso --pretty=fuller --parents --stdin|
           cmd_args << "--reverse" if options[:reverse]
           cmd_args << "-n" << "#{options[:limit].to_i}" if options[:limit]
-          from_to = ""
+          cmd_args << "--" << scm_iconv(@path_encoding, 'UTF-8', path) if path && !path.empty?
+          revisions = []
           if identifier_from || identifier_to
-            from_to << "#{identifier_from}.." if identifier_from
-            from_to << "#{identifier_to}" if identifier_to
-            cmd_args << from_to if !from_to.empty?
+            revisions << ""
+            revisions[0] << "#{identifier_from}.." if identifier_from
+            revisions[0] << "#{identifier_to}" if identifier_to
           else
-            cmd_args += options[:includes] unless options[:includes].blank?
+            unless options[:includes].blank?
+              revisions += options[:includes]
+            end
             unless options[:excludes].blank?
-              cmd_args << "--not"
-              cmd_args += options[:excludes]
+              revisions += options[:excludes].map{|r| "^#{r}"}
             end
           end
-          cmd_args << "--" << scm_iconv(@path_encoding, 'UTF-8', path) if path && !path.empty?
 
-          git_cmd(cmd_args) do |io|
+          git_cmd(cmd_args, {:write_stdin => true}) do |io|
+            io.binmode
+            io.puts(revisions.join("\n"))
+            io.close_write
             files=[]
             changeset = {}
             parsing_descr = 0  #0: not parsing desc or files, 1: parsing desc, 2: parsing files
@@ -383,7 +387,7 @@ module Redmine
           end
         end
 
-        def git_cmd(args, &block)
+        def git_cmd(args, options = {}, &block)
           repo_path = root_url || url
           full_args = ['--git-dir', repo_path]
           if self.class.client_version_above?([1, 7, 2])
@@ -393,6 +397,7 @@ module Redmine
           full_args += args
           ret = shellout(
                    self.class.sq_bin + ' ' + full_args.map { |e| shell_quote e.to_s }.join(' '),
+                   options,
                    &block
                    )
           if $? && $?.exitstatus != 0