scm: git: use stdin instead of command line in "git log" (#10470)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@9282 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
fbe959b2a8
commit
3e11f9abfe
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue