aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorJack Nagel2014-06-15 11:24:24 -0500
committerJack Nagel2014-06-15 20:23:20 -0500
commit299b272c6c244bc703828d6f91052dd87ac5d35c (patch)
treecd8ad868f5d578387c8cf51372b54aaaa0ac5db4 /Library
parent6e1450e974803e4b7c61f91d03fb55d5de416232 (diff)
downloadbrew-299b272c6c244bc703828d6f91052dd87ac5d35c.tar.bz2
brew-test-bot: make test commands shell-safe
Diffstat (limited to 'Library')
-rwxr-xr-xLibrary/Contributions/cmd/brew-test-bot.rb118
1 files changed, 62 insertions, 56 deletions
diff --git a/Library/Contributions/cmd/brew-test-bot.rb b/Library/Contributions/cmd/brew-test-bot.rb
index 59e54a993..f8818705e 100755
--- a/Library/Contributions/cmd/brew-test-bot.rb
+++ b/Library/Contributions/cmd/brew-test-bot.rb
@@ -36,7 +36,7 @@ class Step
@category = test.category
@command = command
@puts_output_on_success = options[:puts_output_on_success]
- @name = command.split[1].delete '-'
+ @name = command[1].delete("-")
@status = :running
@repository = HOMEBREW_REPOSITORY
@time = 0
@@ -61,7 +61,7 @@ class Step
end
def command_short
- @command.gsub(/(brew|--force|--retry|--verbose|--build-bottle|--rb) /, '').strip.squeeze ' '
+ (@command - %w[brew --force --retry --verbose --build-bottle --rb]).join(" ")
end
def passed?
@@ -73,8 +73,9 @@ class Step
end
def puts_command
- print "#{Tty.blue}==>#{Tty.white} #{@command}#{Tty.reset}"
- tabs = (80 - "PASSED".length + 1 - @command.length) / 8
+ cmd = @command.join(" ")
+ print "#{Tty.blue}==>#{Tty.white} #{cmd}#{Tty.reset}"
+ tabs = (80 - "PASSED".length + 1 - cmd.length) / 8
tabs.times{ print "\t" }
$stdout.flush
end
@@ -91,14 +92,15 @@ class Step
puts_command
start_time = Time.now
- run_command = "#{@command} &>'#{log_file_path}'"
- if run_command.start_with? 'git '
- Dir.chdir @repository do
- `#{run_command}`
- end
- else
- `#{run_command}`
+
+ pid = fork do
+ STDOUT.reopen(log_file_path, "wb")
+ STDERR.reopen(log_file_path, "wb")
+ Dir.chdir(@repository) if @command.first == "git"
+ exec(*@command)
end
+ Process.wait(pid)
+
end_time = Time.now
@time = end_time - start_time
@@ -177,10 +179,10 @@ class Test
and not ENV['ghprbPullId']
diff_start_sha1 = shorten_revision ENV['GIT_PREVIOUS_COMMIT']
diff_end_sha1 = shorten_revision ENV['GIT_COMMIT']
- test "brew update" if current_branch == "master"
+ test "brew", "update" if current_branch == "master"
elsif @hash or @url
diff_start_sha1 = current_sha1
- test "brew update" if current_branch == "master"
+ test "brew", "update" if current_branch == "master"
diff_end_sha1 = current_sha1
end
@@ -206,13 +208,13 @@ class Test
@name = "#{diff_start_sha1}-#{diff_end_sha1}"
end
elsif @hash
- test "git checkout #{@hash}"
+ test "git", "checkout", @hash
diff_start_sha1 = "#{@hash}^"
diff_end_sha1 = @hash
@name = @hash
elsif @url
- test "git checkout #{current_sha1}"
- test "brew pull --clean #{@url}"
+ test "git", "checkout", current_sha1
+ test "brew", "pull", "--clean", @url
diff_end_sha1 = current_sha1
@short_url = @url.gsub('https://github.com/', '')
if @short_url.include? '/commit/'
@@ -274,18 +276,17 @@ class Test
def setup
@category = __method__
return if ARGV.include? "--skip-setup"
- test "brew doctor"
- test "brew --env"
- test "brew config"
+ test "brew", "doctor"
+ test "brew", "--env"
+ test "brew", "config"
end
def formula formula
@category = __method__.to_s + ".#{formula}"
- test "brew uses #{formula}"
+ test "brew", "uses", formula
dependencies = `brew deps #{formula}`.split("\n")
dependencies -= `brew list`.split("\n")
- dependencies = dependencies.join(' ')
formula_object = Formula.factory(formula)
return unless satisfied_requirements? formula_object
@@ -294,7 +295,7 @@ class Test
CompilerSelector.new(formula_object).compiler
rescue CompilerSelectionError => e
unless installed_gcc
- test "brew install gcc"
+ test "brew", "install", "gcc"
installed_gcc = true
retry
end
@@ -303,52 +304,54 @@ class Test
return
end
- test "brew fetch --retry #{dependencies}" unless dependencies.empty?
- formula_fetch_options = " "
- formula_fetch_options << " --build-bottle" unless ARGV.include? '--no-bottle'
- formula_fetch_options << " --force" if ARGV.include? '--cleanup'
- test "brew fetch --retry#{formula_fetch_options} #{formula}"
- test "brew uninstall --force #{formula}" if formula_object.installed?
- install_args = '--verbose'
- install_args << ' --build-bottle' unless ARGV.include? '--no-bottle'
- install_args << ' --HEAD' if ARGV.include? '--HEAD'
- test "brew install --only-dependencies #{install_args} #{formula}" unless dependencies.empty?
- test "brew install #{install_args} #{formula}"
+ test "brew", "fetch", "--retry", *dependencies unless dependencies.empty?
+ formula_fetch_options = []
+ formula_fetch_options << "--build-bottle" unless ARGV.include? "--no-bottle"
+ formula_fetch_options << "--force" if ARGV.include? "--cleanup"
+ formula_fetch_options << formula
+ test "brew", "fetch", formula, "--retry", *formula_fetch_options
+ test "brew", "uninstall", "--force", formula if formula_object.installed?
+ install_args = %w[--verbose]
+ install_args << "--build-bottle" unless ARGV.include? "--no-bottle"
+ install_args << "--HEAD" if ARGV.include? "--HEAD"
+ install_args << formula
+ test "brew", "install", "--only-dependencies", *install_args unless dependencies.empty?
+ test "brew", "install", *install_args
install_passed = steps.last.passed?
- test "brew audit #{formula}"
+ test "brew", "audit", formula
if install_passed
unless ARGV.include? '--no-bottle'
- test "brew bottle --rb #{formula}", :puts_output_on_success => true
+ test "brew", "bottle", "--rb", formula, :puts_output_on_success => true
bottle_step = steps.last
if bottle_step.passed? and bottle_step.has_output?
bottle_filename =
bottle_step.output.gsub(/.*(\.\/\S+#{bottle_native_regex}).*/m, '\1')
- test "brew uninstall --force #{formula}"
- test "brew install #{bottle_filename}"
+ test "brew", "uninstall", "--force", formula
+ test "brew", "install", bottle_filename
end
end
- test "brew test --verbose #{formula}" if formula_object.test_defined?
- test "brew uninstall --force #{formula}"
+ test "brew", "test", "--verbose", formula if formula_object.test_defined?
+ test "brew", "uninstall", "--force", formula
end
if formula_object.devel && !ARGV.include?('--HEAD') \
&& satisfied_requirements?(formula_object, :devel)
- test "brew fetch --retry --devel#{formula_fetch_options} #{formula}"
- test "brew install --devel --verbose #{formula}"
+ test "brew", "fetch", "--retry", "--devel", *formula_fetch_options
+ test "brew", "install", "--devel", "--verbose", formula
devel_install_passed = steps.last.passed?
- test "brew audit --devel #{formula}"
+ test "brew", "audit", "--devel", formula
if devel_install_passed
- test "brew test --devel --verbose #{formula}" if formula_object.test_defined?
- test "brew uninstall --devel --force #{formula}"
+ test "brew", "test", "--devel", "--verbose", formula if formula_object.test_defined?
+ test "brew", "uninstall", "--devel", "--force", formula
end
end
- test "brew uninstall --force #{dependencies}" unless dependencies.empty?
+ test "brew", "uninstall", "--force", *dependencies unless dependencies.empty?
end
def homebrew
@category = __method__
- test "brew tests"
- test "brew readall"
+ test "brew", "tests"
+ test "brew", "readall"
end
def cleanup_before
@@ -364,27 +367,30 @@ class Test
def cleanup_after
@category = __method__
- force_flag = ''
+ checkout_args = []
if ARGV.include? '--cleanup'
- test 'git clean --force -dx'
- force_flag = '-f'
+ test "git", "clean", "--force", "-dx"
+ checkout_args << "-f"
end
+ checkout_args << @start_branch
+
if ARGV.include? '--cleanup' or @url or @hash
- test "git checkout #{force_flag} #{@start_branch}"
+ test "git", "checkout", *checkout_args
end
if ARGV.include? '--cleanup'
- test 'git reset --hard'
+ test "git", "reset", "--hard"
git 'stash pop 2>/dev/null'
- test 'brew cleanup'
+ test "brew", "cleanup"
end
FileUtils.rm_rf @brewbot_root unless ARGV.include? "--keep-logs"
end
- def test cmd, options={}
- step = Step.new self, cmd, options
+ def test(*args)
+ options = Hash === args.last ? args.pop : {}
+ step = Step.new self, args, options
step.run
steps << step
step
@@ -524,7 +530,7 @@ if ARGV.include? "--junit"
system_out = testcase.add_element 'system-out'
system_out.text = output
else
- failure.attributes['message'] = "#{step.status}: #{step.command}"
+ failure.attributes["message"] = "#{step.status}: #{step.command.join(" ")}"
failure.text = output
end
end