Check that the SCM log file is writable before using it (#13541).

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11698 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Jean-Philippe Lang 2013-04-03 20:01:41 +00:00
parent 25209273d3
commit 633e4a00e6
1 changed files with 25 additions and 4 deletions

View File

@ -219,18 +219,39 @@ module Redmine
end
# Path to the file where scm stderr output is logged
# Returns nil if the log file is not writable
def self.stderr_log_file
@stderr_log_path ||=
Redmine::Configuration['scm_stderr_log_file'].presence ||
Rails.root.join("log/#{Rails.env}.scm.stderr.log").to_s
if @stderr_log_file.nil?
writable = false
path = Redmine::Configuration['scm_stderr_log_file'].presence
path ||= Rails.root.join("log/#{Rails.env}.scm.stderr.log").to_s
if File.exists?(path)
if File.file?(path) && File.writable?(path)
writable = true
else
logger.warn("SCM log file (#{path}) is not writable")
end
else
begin
File.open(path, "w") {}
writable = true
rescue => e
logger.warn("SCM log file (#{path}) cannot be created: #{e.message}")
end
end
@stderr_log_file = writable ? path : false
end
@stderr_log_file || nil
end
def self.shellout(cmd, options = {}, &block)
if logger && logger.debug?
logger.debug "Shelling out: #{strip_credential(cmd)}"
# Capture stderr in a log file
if stderr_log_file
cmd = "#{cmd} 2>>#{shell_quote(stderr_log_file)}"
end
end
begin
mode = "r+"
IO.popen(cmd, mode) do |io|