| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | # Comprehensively test a formula or pull request. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Usage: brew test-bot [options...] <pull-request|formula> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Options: | 
					
						
							| 
									
										
										
										
											2015-03-20 21:31:52 +00:00
										 |  |  | # --keep-logs:     Write and keep log files under ./brewbot/ | 
					
						
							|  |  |  | # --cleanup:       Clean the Homebrew directory. Very dangerous. Use with care. | 
					
						
							|  |  |  | # --clean-cache:   Remove all cached downloads. Use with care. | 
					
						
							|  |  |  | # --skip-setup:    Don't check the local system is setup correctly. | 
					
						
							| 
									
										
										
										
											2015-03-20 21:32:01 +00:00
										 |  |  | # --skip-homebrew: Don't check Homebrew's files and tests are all valid. | 
					
						
							| 
									
										
										
										
											2015-03-20 21:31:52 +00:00
										 |  |  | # --junit:         Generate a JUnit XML test results file. | 
					
						
							|  |  |  | # --email:         Generate an email subject file. | 
					
						
							|  |  |  | # --no-bottle:     Run brew install without --build-bottle | 
					
						
							|  |  |  | # --HEAD:          Run brew install with --HEAD | 
					
						
							|  |  |  | # --local:         Ask Homebrew to write verbose logs under ./logs/ and set HOME to ./home/ | 
					
						
							|  |  |  | # --tap=<tap>:     Use the git repository of the given tap | 
					
						
							|  |  |  | # --dry-run:       Just print commands, don't run them. | 
					
						
							|  |  |  | # --fail-fast:     Immediately exit on a failing step. | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2015-02-19 11:37:07 +00:00
										 |  |  | # --ci-master:           Shortcut for Homebrew master branch CI options. | 
					
						
							|  |  |  | # --ci-pr:               Shortcut for Homebrew pull request CI options. | 
					
						
							|  |  |  | # --ci-testing:          Shortcut for Homebrew testing CI options. | 
					
						
							|  |  |  | # --ci-upload:           Homebrew CI bottle upload. | 
					
						
							|  |  |  | # --ci-reset-and-update: Homebrew CI repository and tap reset and update. | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | require "formula" | 
					
						
							|  |  |  | require "utils" | 
					
						
							|  |  |  | require "date" | 
					
						
							|  |  |  | require "rexml/document" | 
					
						
							|  |  |  | require "rexml/xmldecl" | 
					
						
							|  |  |  | require "rexml/cdata" | 
					
						
							|  |  |  | require "cmd/tap" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							|  |  |  |   EMAIL_SUBJECT_FILE = "brew-test-bot.#{MacOS.cat}.email.txt" | 
					
						
							| 
									
										
										
										
											2014-10-16 10:28:51 +01:00
										 |  |  |   BYTES_IN_1_MEGABYTE = 1024*1024
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |   def homebrew_git_repo(tap = nil) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     if tap | 
					
						
							| 
									
										
										
										
											2014-11-23 14:41:48 +00:00
										 |  |  |       user, repo = tap.split "/" | 
					
						
							|  |  |  |       HOMEBREW_LIBRARY/"Taps/#{user}/homebrew-#{repo}" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       HOMEBREW_REPOSITORY | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class Step | 
					
						
							|  |  |  |     attr_reader :command, :name, :status, :output, :time | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     def initialize(test, command, options = {}) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       @test = test | 
					
						
							|  |  |  |       @category = test.category | 
					
						
							|  |  |  |       @command = command | 
					
						
							|  |  |  |       @puts_output_on_success = options[:puts_output_on_success] | 
					
						
							|  |  |  |       @name = command[1].delete("-") | 
					
						
							|  |  |  |       @status = :running | 
					
						
							|  |  |  |       @repository = options[:repository] || HOMEBREW_REPOSITORY | 
					
						
							|  |  |  |       @time = 0
 | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def log_file_path | 
					
						
							|  |  |  |       file = "#{@category}.#{@name}.txt" | 
					
						
							|  |  |  |       root = @test.log_root | 
					
						
							|  |  |  |       root ? root + file : file | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def status_colour | 
					
						
							|  |  |  |       case @status | 
					
						
							|  |  |  |       when :passed  then "green" | 
					
						
							|  |  |  |       when :running then "orange" | 
					
						
							|  |  |  |       when :failed  then "red" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def status_upcase | 
					
						
							|  |  |  |       @status.to_s.upcase | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def command_short | 
					
						
							|  |  |  |       (@command - %w[brew --force --retry --verbose --build-bottle --rb]).join(" ") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def passed? | 
					
						
							|  |  |  |       @status == :passed | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def failed? | 
					
						
							|  |  |  |       @status == :failed | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def puts_command | 
					
						
							|  |  |  |       cmd = @command.join(" ") | 
					
						
							|  |  |  |       print "#{Tty.blue}==>#{Tty.white} #{cmd}#{Tty.reset}" | 
					
						
							|  |  |  |       tabs = (80 - "PASSED".length + 1 - cmd.length) / 8
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       tabs.times { print "\t" } | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       $stdout.flush | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def puts_result | 
					
						
							|  |  |  |       puts " #{Tty.send status_colour}#{status_upcase}#{Tty.reset}" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def has_output? | 
					
						
							|  |  |  |       @output && !@output.empty? | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def run | 
					
						
							|  |  |  |       puts_command | 
					
						
							|  |  |  |       if ARGV.include? "--dry-run" | 
					
						
							|  |  |  |         puts | 
					
						
							|  |  |  |         @status = :passed | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-27 23:42:35 +08:00
										 |  |  |       verbose = ARGV.verbose? | 
					
						
							|  |  |  |       puts if verbose | 
					
						
							|  |  |  |       @output = "" | 
					
						
							|  |  |  |       working_dir = Pathname.new(@command.first == "git" ? @repository : Dir.pwd) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       start_time = Time.now | 
					
						
							| 
									
										
										
										
											2015-04-27 23:42:35 +08:00
										 |  |  |       read, write = IO.pipe | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       begin | 
					
						
							|  |  |  |         pid = fork do | 
					
						
							|  |  |  |           read.close | 
					
						
							|  |  |  |           $stdout.reopen(write) | 
					
						
							|  |  |  |           $stderr.reopen(write) | 
					
						
							|  |  |  |           write.close | 
					
						
							|  |  |  |           working_dir.cd { exec(*@command) } | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-04-27 23:42:35 +08:00
										 |  |  |         write.close | 
					
						
							|  |  |  |         while line = read.gets | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |           puts line if verbose | 
					
						
							|  |  |  |           @output += line | 
					
						
							| 
									
										
										
										
											2015-04-27 23:42:35 +08:00
										 |  |  |         end | 
					
						
							|  |  |  |       ensure | 
					
						
							|  |  |  |         read.close | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-27 23:42:35 +08:00
										 |  |  |       Process.wait(pid) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       @time = Time.now - start_time | 
					
						
							|  |  |  |       @status = $?.success? ? :passed : :failed | 
					
						
							|  |  |  |       puts_result | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-27 23:42:35 +08:00
										 |  |  |       if has_output? | 
					
						
							| 
									
										
										
										
											2015-04-30 19:42:54 -04:00
										 |  |  |         @output = fix_encoding(@output) | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         puts @output if (failed? || @puts_output_on_success) && !verbose | 
					
						
							| 
									
										
										
										
											2015-04-27 23:42:35 +08:00
										 |  |  |         File.write(log_file_path, @output) if ARGV.include? "--keep-logs" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-10-27 13:02:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-01 00:00:55 -04:00
										 |  |  |       exit 1 if ARGV.include?("--fail-fast") && failed? | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2014-11-18 00:41:52 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if String.method_defined?(:force_encoding) | 
					
						
							|  |  |  |       def fix_encoding(str) | 
					
						
							|  |  |  |         return str if str.valid_encoding? | 
					
						
							|  |  |  |         # Assume we are starting from a "mostly" UTF-8 string | 
					
						
							|  |  |  |         str.force_encoding(Encoding::UTF_8) | 
					
						
							| 
									
										
										
										
											2014-11-18 01:21:50 -06:00
										 |  |  |         str.encode!(Encoding::UTF_16, :invalid => :replace) | 
					
						
							| 
									
										
										
										
											2014-11-18 00:41:52 -06:00
										 |  |  |         str.encode!(Encoding::UTF_8) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-11-18 01:14:52 -06:00
										 |  |  |     elsif require "iconv" | 
					
						
							|  |  |  |       def fix_encoding(str) | 
					
						
							|  |  |  |         Iconv.conv("UTF-8//IGNORE", "UTF-8", str) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-11-18 00:41:52 -06:00
										 |  |  |     else | 
					
						
							|  |  |  |       def fix_encoding(str) | 
					
						
							|  |  |  |         str | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class Test | 
					
						
							|  |  |  |     attr_reader :log_root, :category, :name, :steps | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     def initialize(argument, tap = nil) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       @hash = nil | 
					
						
							|  |  |  |       @url = nil | 
					
						
							|  |  |  |       @formulae = [] | 
					
						
							| 
									
										
										
										
											2014-12-29 07:55:01 +00:00
										 |  |  |       @added_formulae = [] | 
					
						
							|  |  |  |       @modified_formula = [] | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       @steps = [] | 
					
						
							|  |  |  |       @tap = tap | 
					
						
							|  |  |  |       @repository = Homebrew.homebrew_git_repo @tap | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       url_match = argument.match HOMEBREW_PULL_OR_COMMIT_URL_REGEX | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       begin | 
					
						
							|  |  |  |         formula = Formulary.factory(argument) | 
					
						
							| 
									
										
										
										
											2015-05-17 21:19:36 +08:00
										 |  |  |       rescue FormulaUnavailableError, TapFormulaAmbiguityError | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       git "rev-parse", "--verify", "-q", argument | 
					
						
							|  |  |  |       if $?.success? | 
					
						
							|  |  |  |         @hash = argument | 
					
						
							|  |  |  |       elsif url_match | 
					
						
							|  |  |  |         @url = url_match[0] | 
					
						
							|  |  |  |       elsif formula | 
					
						
							|  |  |  |         @formulae = [argument] | 
					
						
							|  |  |  |       else | 
					
						
							| 
									
										
										
										
											2014-10-21 15:34:20 +01:00
										 |  |  |         raise ArgumentError.new("#{argument} is not a pull request URL, commit URL or formula name.") | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @category = __method__ | 
					
						
							|  |  |  |       @brewbot_root = Pathname.pwd + "brewbot" | 
					
						
							|  |  |  |       FileUtils.mkdir_p @brewbot_root | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def no_args? | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       @hash == "HEAD" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def git(*args) | 
					
						
							|  |  |  |       rd, wr = IO.pipe | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       pid = fork do | 
					
						
							|  |  |  |         rd.close | 
					
						
							|  |  |  |         STDERR.reopen("/dev/null") | 
					
						
							|  |  |  |         STDOUT.reopen(wr) | 
					
						
							|  |  |  |         wr.close | 
					
						
							|  |  |  |         Dir.chdir @repository | 
					
						
							|  |  |  |         exec("git", *args) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       wr.close | 
					
						
							|  |  |  |       Process.wait(pid) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       rd.read | 
					
						
							|  |  |  |     ensure | 
					
						
							|  |  |  |       rd.close | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def download | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       def shorten_revision(revision) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         git("rev-parse", "--short", revision).strip | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def current_sha1 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         shorten_revision "HEAD" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def current_branch | 
					
						
							|  |  |  |         git("symbolic-ref", "HEAD").gsub("refs/heads/", "").strip | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       def single_commit?(start_revision, end_revision) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         git("rev-list", "--count", "#{start_revision}..#{end_revision}").to_i == 1
 | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       def diff_formulae(start_revision, end_revision, path, filter) | 
					
						
							| 
									
										
										
										
											2014-12-27 13:03:40 +00:00
										 |  |  |         git( | 
					
						
							|  |  |  |           "diff-tree", "-r", "--name-only", "--diff-filter=#{filter}", | 
					
						
							|  |  |  |           start_revision, end_revision, "--", path | 
					
						
							|  |  |  |         ).lines.map do |line| | 
					
						
							|  |  |  |           File.basename(line.chomp, ".rb") | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-14 09:40:53 +01:00
										 |  |  |       def brew_update | 
					
						
							|  |  |  |         return unless current_branch == "master" | 
					
						
							|  |  |  |         success = quiet_system "brew", "update" | 
					
						
							|  |  |  |         success ||= quiet_system "brew", "update" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       @category = __method__ | 
					
						
							|  |  |  |       @start_branch = current_branch | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Use Jenkins environment variables if present. | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       if no_args? && ENV["GIT_PREVIOUS_COMMIT"] && ENV["GIT_COMMIT"] \ | 
					
						
							|  |  |  |          && !ENV["ghprbPullLink"] | 
					
						
							|  |  |  |         diff_start_sha1 = shorten_revision ENV["GIT_PREVIOUS_COMMIT"] | 
					
						
							|  |  |  |         diff_end_sha1 = shorten_revision ENV["GIT_COMMIT"] | 
					
						
							| 
									
										
										
										
											2015-05-14 09:40:53 +01:00
										 |  |  |         brew_update | 
					
						
							| 
									
										
										
										
											2014-10-22 09:32:19 +01:00
										 |  |  |       elsif @hash | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         diff_start_sha1 = current_sha1 | 
					
						
							| 
									
										
										
										
											2015-05-14 09:40:53 +01:00
										 |  |  |         brew_update | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         diff_end_sha1 = current_sha1 | 
					
						
							| 
									
										
										
										
											2014-10-22 09:32:19 +01:00
										 |  |  |       elsif @url | 
					
						
							| 
									
										
										
										
											2015-05-14 09:40:53 +01:00
										 |  |  |         brew_update | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Handle Jenkins pull request builder plugin. | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       if ENV["ghprbPullLink"] | 
					
						
							|  |  |  |         @url = ENV["ghprbPullLink"] | 
					
						
							| 
									
										
										
										
											2014-10-16 22:06:46 +01:00
										 |  |  |         @hash = nil | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if no_args? | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         if diff_start_sha1 == diff_end_sha1 || \ | 
					
						
							|  |  |  |            single_commit?(diff_start_sha1, diff_end_sha1) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |           @name = diff_end_sha1 | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           @name = "#{diff_start_sha1}-#{diff_end_sha1}" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       elsif @hash | 
					
						
							|  |  |  |         test "git", "checkout", @hash | 
					
						
							|  |  |  |         diff_start_sha1 = "#{@hash}^" | 
					
						
							|  |  |  |         diff_end_sha1 = @hash | 
					
						
							|  |  |  |         @name = @hash | 
					
						
							|  |  |  |       elsif @url | 
					
						
							| 
									
										
										
										
											2014-10-26 12:33:43 +00:00
										 |  |  |         diff_start_sha1 = current_sha1 | 
					
						
							|  |  |  |         test "git", "checkout", diff_start_sha1 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         test "brew", "pull", "--clean", @url | 
					
						
							|  |  |  |         diff_end_sha1 = current_sha1 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         @short_url = @url.gsub("https://github.com/", "") | 
					
						
							|  |  |  |         if @short_url.include? "/commit/" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |           # 7 characters should be enough for a commit (not 40). | 
					
						
							|  |  |  |           @short_url.gsub!(/(commit\/\w{7}).*/, '\1') | 
					
						
							|  |  |  |           @name = @short_url | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           @name = "#{@short_url}-#{diff_end_sha1}" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         diff_start_sha1 = diff_end_sha1 = current_sha1 | 
					
						
							|  |  |  |         @name = "#{@formulae.first}-#{diff_end_sha1}" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @log_root = @brewbot_root + @name | 
					
						
							|  |  |  |       FileUtils.mkdir_p @log_root | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return unless diff_start_sha1 != diff_end_sha1 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       return if @url && !steps.last.passed? | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if @tap | 
					
						
							|  |  |  |         formula_path = %w[Formula HomebrewFormula].find { |dir| (@repository/dir).directory? } || "" | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         formula_path = "Library/Formula" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-29 07:55:01 +00:00
										 |  |  |       @added_formulae += diff_formulae(diff_start_sha1, diff_end_sha1, formula_path, "A") | 
					
						
							|  |  |  |       @modified_formula += diff_formulae(diff_start_sha1, diff_end_sha1, formula_path, "M") | 
					
						
							| 
									
										
										
										
											2014-12-27 13:03:40 +00:00
										 |  |  |       @formulae += @added_formulae + @modified_formula | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     def skip(formula_name) | 
					
						
							| 
									
										
										
										
											2014-11-10 20:40:29 -06:00
										 |  |  |       puts "#{Tty.blue}==>#{Tty.white} SKIPPING: #{formula_name}#{Tty.reset}" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     def satisfied_requirements?(formula, spec, dependency = nil) | 
					
						
							| 
									
										
										
										
											2014-11-10 20:40:29 -06:00
										 |  |  |       requirements = formula.send(spec).requirements | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       unsatisfied_requirements = requirements.reject do |requirement| | 
					
						
							| 
									
										
										
										
											2014-11-18 16:43:13 +00:00
										 |  |  |         satisfied = false | 
					
						
							| 
									
										
										
										
											2015-02-03 16:46:36 +00:00
										 |  |  |         satisfied ||= requirement.satisfied? | 
					
						
							|  |  |  |         satisfied ||= requirement.optional? | 
					
						
							| 
									
										
										
										
											2014-11-18 16:43:13 +00:00
										 |  |  |         if !satisfied && requirement.default_formula? | 
					
						
							| 
									
										
										
										
											2015-06-06 19:55:31 +08:00
										 |  |  |           default = Formula[requirement.default_formula] | 
					
						
							| 
									
										
										
										
											2015-05-27 21:19:15 +08:00
										 |  |  |           satisfied = satisfied_requirements?(default, :stable, formula.full_name) | 
					
						
							| 
									
										
										
										
											2014-11-18 16:43:13 +00:00
										 |  |  |         end | 
					
						
							|  |  |  |         satisfied | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if unsatisfied_requirements.empty? | 
					
						
							|  |  |  |         true | 
					
						
							|  |  |  |       else | 
					
						
							| 
									
										
										
										
											2015-05-27 21:19:15 +08:00
										 |  |  |         name = formula.full_name | 
					
						
							| 
									
										
										
										
											2014-11-10 20:40:29 -06:00
										 |  |  |         name += " (#{spec})" unless spec == :stable | 
					
						
							| 
									
										
										
										
											2014-11-18 16:43:13 +00:00
										 |  |  |         name += " (#{dependency} dependency)" if dependency | 
					
						
							| 
									
										
										
										
											2014-11-10 20:40:29 -06:00
										 |  |  |         skip name | 
					
						
							|  |  |  |         puts unsatisfied_requirements.map(&:message) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         false | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setup | 
					
						
							|  |  |  |       @category = __method__ | 
					
						
							|  |  |  |       return if ARGV.include? "--skip-setup" | 
					
						
							|  |  |  |       test "brew", "doctor" | 
					
						
							|  |  |  |       test "brew", "--env" | 
					
						
							|  |  |  |       test "brew", "config" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     def formula(formula_name) | 
					
						
							| 
									
										
										
										
											2014-11-10 20:40:29 -06:00
										 |  |  |       @category = "#{__method__}.#{formula_name}" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |       canonical_formula_name = if @tap | 
					
						
							|  |  |  |         "#{@tap}/#{formula_name}" | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         formula_name | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test "brew", "uses", canonical_formula_name | 
					
						
							| 
									
										
										
										
											2014-12-18 17:03:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |       formula = Formulary.factory(canonical_formula_name) | 
					
						
							| 
									
										
										
										
											2015-05-11 15:44:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       formula.conflicts.map { |c| Formulary.factory(c.name) }. | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         select(&:installed?).each do |conflict| | 
					
						
							| 
									
										
										
										
											2015-05-11 15:44:42 +08:00
										 |  |  |           test "brew", "unlink", conflict.name | 
					
						
							| 
									
										
										
										
											2015-05-18 18:44:27 +08:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-05-11 15:44:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       installed_gcc = false | 
					
						
							| 
									
										
										
										
											2015-01-17 19:12:10 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       deps = [] | 
					
						
							|  |  |  |       reqs = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if formula.stable | 
					
						
							|  |  |  |         return unless satisfied_requirements?(formula, :stable) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         deps |= formula.stable.deps.to_a | 
					
						
							|  |  |  |         reqs |= formula.stable.requirements.to_a | 
					
						
							|  |  |  |       elsif formula.devel | 
					
						
							|  |  |  |         return unless satisfied_requirements?(formula, :devel) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       if formula.devel && !ARGV.include?("--HEAD") | 
					
						
							| 
									
										
										
										
											2014-11-10 20:40:29 -06:00
										 |  |  |         deps |= formula.devel.deps.to_a | 
					
						
							|  |  |  |         reqs |= formula.devel.requirements.to_a | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       begin | 
					
						
							| 
									
										
										
										
											2014-12-29 12:20:30 +00:00
										 |  |  |         deps.each do |dep| | 
					
						
							| 
									
										
										
										
											2014-12-29 12:28:43 +00:00
										 |  |  |           if dep.is_a?(TapDependency) && dep.tap | 
					
						
							|  |  |  |             tap_dir = Homebrew.homebrew_git_repo dep.tap | 
					
						
							|  |  |  |             test "brew", "tap", dep.tap unless tap_dir.directory? | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2014-12-29 12:20:30 +00:00
										 |  |  |           CompilerSelector.select_for(dep.to_formula) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2014-11-10 20:40:29 -06:00
										 |  |  |         CompilerSelector.select_for(formula) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       rescue CompilerSelectionError => e | 
					
						
							|  |  |  |         unless installed_gcc | 
					
						
							| 
									
										
										
										
											2015-05-26 15:11:17 +01:00
										 |  |  |           run_as_not_developer { test "brew", "install", "gcc" } | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |           installed_gcc = true | 
					
						
							|  |  |  |           OS::Mac.clear_version_cache | 
					
						
							|  |  |  |           retry | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |         skip canonical_formula_name | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         puts e.message | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-11 14:41:27 -04:00
										 |  |  |       conflicts = formula.conflicts | 
					
						
							|  |  |  |       formula.recursive_dependencies.each do |dependency| | 
					
						
							|  |  |  |         conflicts += dependency.to_formula.conflicts | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       conflicts.each do |conflict| | 
					
						
							|  |  |  |         confict_formula = Formulary.factory(conflict.name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if confict_formula.installed? && confict_formula.linked_keg.exist? | 
					
						
							|  |  |  |           test "brew", "unlink", "--force", conflict.name | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 23:23:55 -07:00
										 |  |  |       installed = Utils.popen_read("brew", "list").split("\n") | 
					
						
							|  |  |  |       dependencies = Utils.popen_read("brew", "deps", "--skip-optional", | 
					
						
							|  |  |  |                                       canonical_formula_name).split("\n") | 
					
						
							| 
									
										
										
										
											2015-07-11 14:41:27 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |       (installed & dependencies).each do |installed_dependency| | 
					
						
							|  |  |  |         installed_dependency_formula = Formulary.factory(installed_dependency) | 
					
						
							|  |  |  |         if installed_dependency_formula.installed? && | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |            !installed_dependency_formula.keg_only? && | 
					
						
							|  |  |  |            !installed_dependency_formula.linked_keg.exist? | 
					
						
							| 
									
										
										
										
											2015-07-11 14:41:27 -04:00
										 |  |  |           test "brew", "link", installed_dependency | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-06 23:23:55 -07:00
										 |  |  |       dependencies -= installed | 
					
						
							|  |  |  |       unchanged_dependencies = dependencies - @formulae | 
					
						
							|  |  |  |       changed_dependences = dependencies - unchanged_dependencies | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       runtime_dependencies = Utils.popen_read("brew", "deps", | 
					
						
							|  |  |  |                                               "--skip-build", "--skip-optional", | 
					
						
							|  |  |  |                                               canonical_formula_name).split("\n") | 
					
						
							|  |  |  |       build_dependencies = dependencies - runtime_dependencies | 
					
						
							|  |  |  |       unchanged_build_dependencies = build_dependencies - @formulae | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       dependents = Utils.popen_read("brew", "uses", "--skip-build", "--skip-optional", canonical_formula_name).split("\n") | 
					
						
							|  |  |  |       dependents -= @formulae | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       dependents = dependents.map { |d| Formulary.factory(d) } | 
					
						
							| 
									
										
										
										
											2015-04-06 23:23:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       testable_dependents = dependents.select { |d| d.test_defined? && d.bottled? } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       if (deps | reqs).any? { |d| d.name == "mercurial" && d.build? } | 
					
						
							| 
									
										
										
										
											2015-05-26 15:11:17 +01:00
										 |  |  |         run_as_not_developer { test "brew", "install", "mercurial" } | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       test "brew", "fetch", "--retry", *unchanged_dependencies unless unchanged_dependencies.empty? | 
					
						
							| 
									
										
										
										
											2015-08-04 00:12:42 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       unless changed_dependences.empty? | 
					
						
							|  |  |  |         test "brew", "fetch", "--retry", "--build-bottle", *changed_dependences | 
					
						
							|  |  |  |         # Install changed dependencies as new bottles so we don't have checksum problems. | 
					
						
							|  |  |  |         test "brew", "install", "--build-bottle", *changed_dependences | 
					
						
							|  |  |  |         # Run postinstall on them because the tested formula might depend on | 
					
						
							|  |  |  |         # this step | 
					
						
							|  |  |  |         test "brew", "postinstall", *changed_dependences | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       formula_fetch_options = [] | 
					
						
							|  |  |  |       formula_fetch_options << "--build-bottle" unless ARGV.include? "--no-bottle" | 
					
						
							|  |  |  |       formula_fetch_options << "--force" if ARGV.include? "--cleanup" | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |       formula_fetch_options << canonical_formula_name | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       test "brew", "fetch", "--retry", *formula_fetch_options | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |       test "brew", "uninstall", "--force", canonical_formula_name if formula.installed? | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       install_args = %w[--verbose] | 
					
						
							|  |  |  |       install_args << "--build-bottle" unless ARGV.include? "--no-bottle" | 
					
						
							|  |  |  |       install_args << "--HEAD" if ARGV.include? "--HEAD" | 
					
						
							| 
									
										
										
										
											2015-01-19 13:39:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       # Pass --devel or --HEAD to install in the event formulae lack stable. Supports devel-only/head-only. | 
					
						
							|  |  |  |       # head-only should not have devel, but devel-only can have head. Stable can have all three. | 
					
						
							|  |  |  |       if devel_only_tap? formula | 
					
						
							|  |  |  |         install_args << "--devel" | 
					
						
							|  |  |  |       elsif head_only_tap? formula | 
					
						
							|  |  |  |         install_args << "--HEAD" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |       install_args << canonical_formula_name | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       # Don't care about e.g. bottle failures for dependencies. | 
					
						
							| 
									
										
										
										
											2015-05-18 18:44:27 +08:00
										 |  |  |       run_as_not_developer do | 
					
						
							|  |  |  |         test "brew", "install", "--only-dependencies", *install_args unless dependencies.empty? | 
					
						
							| 
									
										
										
										
											2015-07-30 10:14:44 +01:00
										 |  |  |         test "brew", "install", *install_args | 
					
						
							| 
									
										
										
										
											2015-05-18 18:44:27 +08:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       install_passed = steps.last.passed? | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |       audit_args = [canonical_formula_name] | 
					
						
							| 
									
										
										
										
											2015-07-09 12:31:17 +01:00
										 |  |  |       audit_args << "--strict" << "--online" if @added_formulae.include? formula_name | 
					
						
							| 
									
										
										
										
											2014-12-27 13:03:40 +00:00
										 |  |  |       test "brew", "audit", *audit_args | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       if install_passed | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         if formula.stable? && !ARGV.include?("--no-bottle") | 
					
						
							| 
									
										
										
										
											2015-07-21 16:41:40 +08:00
										 |  |  |           bottle_args = ["--verbose", "--rb", canonical_formula_name] | 
					
						
							| 
									
										
										
										
											2014-11-24 08:26:43 +00:00
										 |  |  |           bottle_args << { :puts_output_on_success => true } | 
					
						
							|  |  |  |           test "brew", "bottle", *bottle_args | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |           bottle_step = steps.last | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |           if bottle_step.passed? && bottle_step.has_output? | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |             bottle_filename = | 
					
						
							|  |  |  |               bottle_step.output.gsub(/.*(\.\/\S+#{bottle_native_regex}).*/m, '\1') | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |             test "brew", "uninstall", "--force", canonical_formula_name | 
					
						
							| 
									
										
										
										
											2015-03-20 21:32:22 +00:00
										 |  |  |             if unchanged_build_dependencies.any? | 
					
						
							|  |  |  |               test "brew", "uninstall", "--force", *unchanged_build_dependencies | 
					
						
							|  |  |  |               unchanged_dependencies -= unchanged_build_dependencies | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |             test "brew", "install", bottle_filename | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |         test "brew", "test", "--verbose", canonical_formula_name if formula.test_defined? | 
					
						
							| 
									
										
										
										
											2015-01-08 20:49:24 +00:00
										 |  |  |         testable_dependents.each do |dependent| | 
					
						
							|  |  |  |           unless dependent.installed? | 
					
						
							|  |  |  |             test "brew", "fetch", "--retry", dependent.name | 
					
						
							|  |  |  |             next if steps.last.failed? | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |             conflicts = dependent.conflicts.map { |c| Formulary.factory(c.name) }.select(&:installed?) | 
					
						
							| 
									
										
										
										
											2015-01-09 22:33:57 +08:00
										 |  |  |             conflicts.each do |conflict| | 
					
						
							|  |  |  |               test "brew", "unlink", conflict.name | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2015-05-26 15:11:17 +01:00
										 |  |  |             run_as_not_developer { test "brew", "install", dependent.name } | 
					
						
							| 
									
										
										
										
											2015-01-08 20:49:24 +00:00
										 |  |  |             next if steps.last.failed? | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |           if dependent.installed? | 
					
						
							|  |  |  |             test "brew", "test", "--verbose", dependent.name | 
					
						
							| 
									
										
										
										
											2014-12-28 18:16:49 +00:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2014-12-18 17:03:17 +00:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |         test "brew", "uninstall", "--force", canonical_formula_name | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       if formula.devel && formula.stable? && !ARGV.include?("--HEAD") \ | 
					
						
							| 
									
										
										
										
											2014-11-10 20:40:29 -06:00
										 |  |  |          && satisfied_requirements?(formula, :devel) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         test "brew", "fetch", "--retry", "--devel", *formula_fetch_options | 
					
						
							| 
									
										
										
										
											2015-05-27 23:32:06 -04:00
										 |  |  |         run_as_not_developer { test "brew", "install", "--devel", "--verbose", canonical_formula_name } | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         devel_install_passed = steps.last.passed? | 
					
						
							| 
									
										
										
										
											2014-12-27 13:03:40 +00:00
										 |  |  |         test "brew", "audit", "--devel", *audit_args | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         if devel_install_passed | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  |           test "brew", "test", "--devel", "--verbose", canonical_formula_name if formula.test_defined? | 
					
						
							|  |  |  |           test "brew", "uninstall", "--devel", "--force", canonical_formula_name | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2015-03-20 21:32:22 +00:00
										 |  |  |       test "brew", "uninstall", "--force", *unchanged_dependencies if unchanged_dependencies.any? | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def homebrew | 
					
						
							|  |  |  |       @category = __method__ | 
					
						
							| 
									
										
										
										
											2015-03-20 21:32:01 +00:00
										 |  |  |       return if ARGV.include? "--skip-homebrew" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       test "brew", "tests" | 
					
						
							| 
									
										
										
										
											2015-07-22 17:09:23 +08:00
										 |  |  |       test "brew", "tests", "--no-compat" | 
					
						
							| 
									
										
										
										
											2015-03-20 16:59:21 +00:00
										 |  |  |       readall_args = [] | 
					
						
							|  |  |  |       readall_args << "--syntax" if MacOS.version >= :mavericks | 
					
						
							|  |  |  |       test "brew", "readall", *readall_args | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def cleanup_before | 
					
						
							|  |  |  |       @category = __method__ | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       return unless ARGV.include? "--cleanup" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       git "stash" | 
					
						
							|  |  |  |       git "am", "--abort" | 
					
						
							|  |  |  |       git "rebase", "--abort" | 
					
						
							|  |  |  |       git "reset", "--hard" | 
					
						
							|  |  |  |       git "checkout", "-f", "master" | 
					
						
							| 
									
										
										
										
											2015-06-13 18:33:29 +01:00
										 |  |  |       git "clean", "-ffdx" | 
					
						
							| 
									
										
										
										
											2015-05-14 08:45:39 +01:00
										 |  |  |       pr_locks = "#{HOMEBREW_REPOSITORY}/.git/refs/remotes/*/pr/*/*.lock" | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       Dir.glob(pr_locks) { |lock| FileUtils.rm_rf lock } | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def cleanup_after | 
					
						
							|  |  |  |       @category = __method__ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       checkout_args = [] | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       if ARGV.include? "--cleanup" | 
					
						
							| 
									
										
										
										
											2015-06-13 18:33:29 +01:00
										 |  |  |         test "git", "clean", "-ffdx" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         checkout_args << "-f" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       checkout_args << @start_branch | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       if ARGV.include?("--cleanup") || @url || @hash | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         test "git", "checkout", *checkout_args | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       if ARGV.include? "--cleanup" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         test "git", "reset", "--hard" | 
					
						
							|  |  |  |         git "stash", "pop" | 
					
						
							| 
									
										
										
										
											2015-04-11 16:38:02 +01:00
										 |  |  |         test "brew", "cleanup", "--prune=30" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       FileUtils.rm_rf @brewbot_root unless ARGV.include? "--keep-logs" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test(*args) | 
					
						
							|  |  |  |       options = Hash === args.last ? args.pop : {} | 
					
						
							|  |  |  |       options[:repository] = @repository | 
					
						
							|  |  |  |       step = Step.new self, args, options | 
					
						
							|  |  |  |       step.run | 
					
						
							|  |  |  |       steps << step | 
					
						
							|  |  |  |       step | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def check_results | 
					
						
							| 
									
										
										
										
											2015-02-17 18:02:05 +08:00
										 |  |  |       steps.all? do |step| | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         case step.status | 
					
						
							| 
									
										
										
										
											2015-02-17 18:02:05 +08:00
										 |  |  |         when :passed  then true | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         when :running then raise | 
					
						
							| 
									
										
										
										
											2015-02-17 18:02:05 +08:00
										 |  |  |         when :failed  then false | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def formulae | 
					
						
							|  |  |  |       changed_formulae_dependents = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       @formulae.each do |formula| | 
					
						
							| 
									
										
										
										
											2015-03-05 18:05:07 +08:00
										 |  |  |         formula_dependencies = Utils.popen_read("brew", "deps", formula).split("\n") | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         unchanged_dependencies = formula_dependencies - @formulae | 
					
						
							|  |  |  |         changed_dependences = formula_dependencies - unchanged_dependencies | 
					
						
							|  |  |  |         changed_dependences.each do |changed_formula| | 
					
						
							|  |  |  |           changed_formulae_dependents[changed_formula] ||= 0
 | 
					
						
							|  |  |  |           changed_formulae_dependents[changed_formula] += 1
 | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       changed_formulae = changed_formulae_dependents.sort do |a1, a2| | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         a2[1].to_i <=> a1[1].to_i | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       changed_formulae.map!(&:first) | 
					
						
							|  |  |  |       unchanged_formulae = @formulae - changed_formulae | 
					
						
							|  |  |  |       changed_formulae + unchanged_formulae | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     def head_only_tap?(formula) | 
					
						
							| 
									
										
										
										
											2015-01-19 13:39:38 +00:00
										 |  |  |       formula.head && formula.devel.nil? && formula.stable.nil? && formula.tap == "homebrew/homebrew-head-only" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     def devel_only_tap?(formula) | 
					
						
							| 
									
										
										
										
											2015-01-19 13:39:38 +00:00
										 |  |  |       formula.devel && formula.stable.nil? && formula.tap == "homebrew/homebrew-devel-only" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     def run | 
					
						
							|  |  |  |       cleanup_before | 
					
						
							|  |  |  |       download | 
					
						
							|  |  |  |       setup | 
					
						
							|  |  |  |       homebrew | 
					
						
							|  |  |  |       formulae.each do |f| | 
					
						
							|  |  |  |         formula(f) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       cleanup_after | 
					
						
							|  |  |  |       check_results | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def test_bot | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     tap = ARGV.value("tap") | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     if !tap && ENV["UPSTREAM_BOT_PARAMS"] | 
					
						
							|  |  |  |       bot_argv = ENV["UPSTREAM_BOT_PARAMS"].split " " | 
					
						
							| 
									
										
										
										
											2014-11-24 08:26:43 +00:00
										 |  |  |       bot_argv.extend HomebrewArgvExtension | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       tap ||= bot_argv.value("tap") | 
					
						
							| 
									
										
										
										
											2014-11-24 08:26:43 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-07 15:35:43 +00:00
										 |  |  |     tap.gsub!(/homebrew\/homebrew-/i, "Homebrew/") if tap | 
					
						
							| 
									
										
										
										
											2015-02-27 17:00:34 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     git_url = ENV["UPSTREAM_GIT_URL"] || ENV["GIT_URL"] | 
					
						
							| 
									
										
										
										
											2014-11-23 14:11:46 +00:00
										 |  |  |     if !tap && git_url | 
					
						
							|  |  |  |       # Also can get tap from Jenkins GIT_URL. | 
					
						
							| 
									
										
										
										
											2014-11-23 14:38:40 +00:00
										 |  |  |       url_path = git_url.gsub(%r{^https?://github\.com/}, "").gsub(%r{/$}, "") | 
					
						
							|  |  |  |       HOMEBREW_TAP_ARGS_REGEX =~ url_path | 
					
						
							|  |  |  |       tap = "#{$1}/#{$3}" if $1 && $3 | 
					
						
							| 
									
										
										
										
											2014-11-23 14:11:46 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     if Pathname.pwd == HOMEBREW_PREFIX && ARGV.include?("--cleanup") | 
					
						
							|  |  |  |       odie "cannot use --cleanup from HOMEBREW_PREFIX as it will delete all output." | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ARGV.include? "--email" | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       File.open EMAIL_SUBJECT_FILE, "w" do |file| | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         # The file should be written at the end but in case we don't get to that | 
					
						
							|  |  |  |         # point ensure that we have something valid. | 
					
						
							|  |  |  |         file.write "#{MacOS.version}: internal error." | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     ENV["HOMEBREW_DEVELOPER"] = "1" | 
					
						
							|  |  |  |     ENV["HOMEBREW_NO_EMOJI"] = "1" | 
					
						
							|  |  |  |     if ARGV.include?("--ci-master") || ARGV.include?("--ci-pr") \ | 
					
						
							|  |  |  |        || ARGV.include?("--ci-testing") | 
					
						
							| 
									
										
										
										
											2015-01-01 09:54:19 -08:00
										 |  |  |       ARGV << "--cleanup" if ENV["JENKINS_HOME"] || ENV["TRAVIS_COMMIT"] | 
					
						
							| 
									
										
										
										
											2015-03-20 20:22:35 +00:00
										 |  |  |       ARGV << "--junit" << "--local" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     if ARGV.include? "--ci-master" | 
					
						
							|  |  |  |       ARGV << "--no-bottle" << "--email" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     if ARGV.include? "--local" | 
					
						
							|  |  |  |       ENV["HOME"] = "#{Dir.pwd}/home" | 
					
						
							|  |  |  |       mkdir_p ENV["HOME"] | 
					
						
							|  |  |  |       ENV["HOMEBREW_LOGS"] = "#{Dir.pwd}/logs" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-19 11:44:56 +00:00
										 |  |  |     if ARGV.include? "--ci-reset-and-update" | 
					
						
							| 
									
										
										
										
											2015-02-19 11:46:55 +00:00
										 |  |  |       Dir.glob("#{HOMEBREW_LIBRARY}/Taps/*/*") do |tap_dir| | 
					
						
							| 
									
										
										
										
											2015-02-19 11:49:52 +00:00
										 |  |  |         cd tap_dir do | 
					
						
							| 
									
										
										
										
											2015-02-19 11:52:04 +00:00
										 |  |  |           system "git am --abort 2>/dev/null" | 
					
						
							|  |  |  |           system "git rebase --abort 2>/dev/null" | 
					
						
							|  |  |  |           safe_system "git", "checkout", "-f", "master" | 
					
						
							|  |  |  |           safe_system "git", "reset", "--hard", "origin/master" | 
					
						
							| 
									
										
										
										
											2015-02-19 11:49:52 +00:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-02-19 11:44:56 +00:00
										 |  |  |       end | 
					
						
							|  |  |  |       safe_system "brew", "update" | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-23 16:50:19 +00:00
										 |  |  |     repository = Homebrew.homebrew_git_repo tap | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Tap repository if required, this is done before everything else | 
					
						
							|  |  |  |     # because Formula parsing and/or git commit hash lookup depends on it. | 
					
						
							| 
									
										
										
										
											2015-05-30 16:04:03 +08:00
										 |  |  |     if tap && !repository.directory? | 
					
						
							|  |  |  |       safe_system "brew", "tap", tap | 
					
						
							| 
									
										
										
										
											2014-11-23 16:50:19 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |     if ARGV.include? "--ci-upload" | 
					
						
							|  |  |  |       jenkins = ENV["JENKINS_HOME"] | 
					
						
							|  |  |  |       job = ENV["UPSTREAM_JOB_NAME"] | 
					
						
							|  |  |  |       id = ENV["UPSTREAM_BUILD_ID"] | 
					
						
							| 
									
										
										
										
											2015-02-18 12:55:55 +00:00
										 |  |  |       raise "Missing Jenkins variables!" if !jenkins || !job || !id | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-18 12:55:55 +00:00
										 |  |  |       bintray_user = ENV["BINTRAY_USER"] | 
					
						
							|  |  |  |       bintray_key = ENV["BINTRAY_KEY"] | 
					
						
							| 
									
										
										
										
											2015-02-19 10:56:47 +00:00
										 |  |  |       if !bintray_user || !bintray_key | 
					
						
							| 
									
										
										
										
											2015-02-18 12:55:55 +00:00
										 |  |  |         raise "Missing BINTRAY_USER or BINTRAY_KEY variables!" | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2015-02-17 18:57:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-30 11:40:20 +01:00
										 |  |  |       # Don't pass keys/cookies to subprocesses.. | 
					
						
							|  |  |  |       ENV["BINTRAY_KEY"] = nil | 
					
						
							|  |  |  |       ENV["HUDSON_SERVER_COOKIE"] = nil | 
					
						
							|  |  |  |       ENV["JENKINS_SERVER_COOKIE"] = nil | 
					
						
							|  |  |  |       ENV["HUDSON_COOKIE"] = nil | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       ARGV << "--verbose" | 
					
						
							| 
									
										
										
										
											2014-12-07 14:36:13 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |       bottles = Dir["#{jenkins}/jobs/#{job}/configurations/axis-version/*/builds/#{id}/archive/*.bottle*.*"] | 
					
						
							|  |  |  |       return if bottles.empty? | 
					
						
							|  |  |  |       FileUtils.cp bottles, Dir.pwd, :verbose => true | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       ENV["GIT_COMMITTER_NAME"] = "BrewTestBot" | 
					
						
							|  |  |  |       ENV["GIT_COMMITTER_EMAIL"] = "brew-test-bot@googlegroups.com" | 
					
						
							| 
									
										
										
										
											2014-11-23 16:50:19 +00:00
										 |  |  |       ENV["GIT_WORK_TREE"] = repository | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       ENV["GIT_DIR"] = "#{ENV["GIT_WORK_TREE"]}/.git" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       pr = ENV["UPSTREAM_PULL_REQUEST"] | 
					
						
							|  |  |  |       number = ENV["UPSTREAM_BUILD_NUMBER"] | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       system "git am --abort 2>/dev/null" | 
					
						
							|  |  |  |       system "git rebase --abort 2>/dev/null" | 
					
						
							|  |  |  |       safe_system "git", "checkout", "-f", "master" | 
					
						
							|  |  |  |       safe_system "git", "reset", "--hard", "origin/master" | 
					
						
							|  |  |  |       safe_system "brew", "update" | 
					
						
							| 
									
										
										
										
											2014-11-23 16:59:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if pr | 
					
						
							|  |  |  |         pull_pr = if tap | 
					
						
							|  |  |  |           user, repo = tap.split "/" | 
					
						
							|  |  |  |           "https://github.com/#{user}/homebrew-#{repo}/pull/#{pr}" | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           pr | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         safe_system "brew", "pull", "--clean", pull_pr | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       ENV["GIT_AUTHOR_NAME"] = ENV["GIT_COMMITTER_NAME"] | 
					
						
							|  |  |  |       ENV["GIT_AUTHOR_EMAIL"] = ENV["GIT_COMMITTER_EMAIL"] | 
					
						
							| 
									
										
										
										
											2015-02-23 21:29:15 +00:00
										 |  |  |       bottle_args = ["--merge", "--write", *Dir["*.bottle.rb"]] | 
					
						
							|  |  |  |       bottle_args << "--tap=#{tap}" if tap | 
					
						
							|  |  |  |       safe_system "brew", "bottle", *bottle_args | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-06 15:45:52 +08:00
										 |  |  |       remote_repo = tap ? tap.tr("/", "-") : "homebrew" | 
					
						
							| 
									
										
										
										
											2014-11-23 14:11:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       remote = "git@github.com:BrewTestBot/#{remote_repo}.git" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       tag = pr ? "pr-#{pr}" : "testing-#{number}" | 
					
						
							|  |  |  |       safe_system "git", "push", "--force", remote, "master:master", ":refs/tags/#{tag}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-19 11:12:07 +00:00
										 |  |  |       bintray_repo = Bintray.repository(tap) | 
					
						
							| 
									
										
										
										
											2015-02-19 10:56:47 +00:00
										 |  |  |       bintray_repo_url = "https://api.bintray.com/packages/homebrew/#{bintray_repo}" | 
					
						
							| 
									
										
										
										
											2015-02-18 13:19:13 +00:00
										 |  |  |       formula_packaged = {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-17 18:57:19 +00:00
										 |  |  |       Dir.glob("*.bottle*.tar.gz") do |filename| | 
					
						
							| 
									
										
										
										
											2015-05-27 23:07:42 +08:00
										 |  |  |         formula_name, canonical_formula_name = bottle_resolve_formula_names filename | 
					
						
							| 
									
										
										
										
											2015-04-15 19:31:33 +08:00
										 |  |  |         formula = Formulary.factory canonical_formula_name | 
					
						
							|  |  |  |         version = formula.pkg_version | 
					
						
							| 
									
										
										
										
											2015-02-19 12:56:57 +00:00
										 |  |  |         bintray_package = Bintray.package formula_name | 
					
						
							| 
									
										
										
										
											2015-02-17 18:57:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-02 15:30:56 +08:00
										 |  |  |         if system "curl", "-I", "--silent", "--fail", "--output", "/dev/null", | 
					
						
							|  |  |  |                   "#{BottleSpecification::DEFAULT_DOMAIN}/#{bintray_repo}/#{filename}" | 
					
						
							|  |  |  |           raise <<-EOS.undent
 | 
					
						
							|  |  |  |             #{filename} is already published. Please remove it manually from | 
					
						
							|  |  |  |             https://bintray.com/homebrew/#{bintray_repo}/#{bintray_package}/view#files | 
					
						
							|  |  |  |           EOS | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-19 12:56:57 +00:00
										 |  |  |         unless formula_packaged[formula_name] | 
					
						
							|  |  |  |           package_url = "#{bintray_repo_url}/#{bintray_package}" | 
					
						
							| 
									
										
										
										
											2015-02-18 13:19:13 +00:00
										 |  |  |           unless system "curl", "--silent", "--fail", "--output", "/dev/null", package_url | 
					
						
							| 
									
										
										
										
											2015-02-19 10:56:47 +00:00
										 |  |  |             curl "--silent", "--fail", "-u#{bintray_user}:#{bintray_key}", | 
					
						
							|  |  |  |                  "-H", "Content-Type: application/json", | 
					
						
							| 
									
										
										
										
											2015-02-19 12:56:57 +00:00
										 |  |  |                  "-d", "{\"name\":\"#{bintray_package}\"}", bintray_repo_url | 
					
						
							| 
									
										
										
										
											2015-02-18 13:19:13 +00:00
										 |  |  |             puts | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2015-02-19 12:56:57 +00:00
										 |  |  |           formula_packaged[formula_name] = true | 
					
						
							| 
									
										
										
										
											2015-02-17 18:57:19 +00:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-07 08:31:17 +01:00
										 |  |  |         content_url = "https://api.bintray.com/content/homebrew" | 
					
						
							|  |  |  |         content_url += "/#{bintray_repo}/#{bintray_package}/#{version}/#{filename}" | 
					
						
							| 
									
										
										
										
											2015-06-02 15:30:56 +08:00
										 |  |  |         content_url += "?override=1" | 
					
						
							| 
									
										
										
										
											2015-02-19 10:56:47 +00:00
										 |  |  |         curl "--silent", "--fail", "-u#{bintray_user}:#{bintray_key}", | 
					
						
							|  |  |  |              "-T", filename, content_url | 
					
						
							| 
									
										
										
										
											2015-02-17 19:42:37 +00:00
										 |  |  |         puts | 
					
						
							| 
									
										
										
										
											2015-02-17 18:57:19 +00:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       safe_system "git", "tag", "--force", tag | 
					
						
							|  |  |  |       safe_system "git", "push", "--force", remote, "refs/tags/#{tag}" | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tests = [] | 
					
						
							|  |  |  |     any_errors = false | 
					
						
							|  |  |  |     if ARGV.named.empty? | 
					
						
							|  |  |  |       # With no arguments just build the most recent commit. | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       head_test = Test.new("HEAD", tap) | 
					
						
							| 
									
										
										
										
											2015-03-07 15:36:07 +00:00
										 |  |  |       any_errors = !head_test.run | 
					
						
							|  |  |  |       tests << head_test | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |       ARGV.named.each do |argument| | 
					
						
							| 
									
										
										
										
											2014-10-21 15:34:20 +01:00
										 |  |  |         test_error = false | 
					
						
							|  |  |  |         begin | 
					
						
							|  |  |  |           test = Test.new(argument, tap) | 
					
						
							|  |  |  |         rescue ArgumentError => e | 
					
						
							|  |  |  |           test_error = true | 
					
						
							|  |  |  |           ofail e.message | 
					
						
							| 
									
										
										
										
											2014-11-10 19:24:46 -06:00
										 |  |  |         else | 
					
						
							|  |  |  |           test_error = !test.run | 
					
						
							| 
									
										
										
										
											2014-11-10 19:25:05 -06:00
										 |  |  |           tests << test | 
					
						
							| 
									
										
										
										
											2014-10-21 15:34:20 +01:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2014-10-21 12:12:24 +01:00
										 |  |  |         any_errors ||= test_error | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ARGV.include? "--junit" | 
					
						
							|  |  |  |       xml_document = REXML::Document.new | 
					
						
							|  |  |  |       xml_document << REXML::XMLDecl.new | 
					
						
							| 
									
										
										
										
											2014-12-02 21:14:53 -05:00
										 |  |  |       testsuites = xml_document.add_element "testsuites" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       tests.each do |test| | 
					
						
							| 
									
										
										
										
											2014-12-02 21:14:53 -05:00
										 |  |  |         testsuite = testsuites.add_element "testsuite" | 
					
						
							|  |  |  |         testsuite.add_attribute "name", "brew-test-bot.#{MacOS.cat}" | 
					
						
							|  |  |  |         testsuite.add_attribute "tests", test.steps.count | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         test.steps.each do |step| | 
					
						
							| 
									
										
										
										
											2014-12-02 21:14:53 -05:00
										 |  |  |           testcase = testsuite.add_element "testcase" | 
					
						
							|  |  |  |           testcase.add_attribute "name", step.command_short | 
					
						
							|  |  |  |           testcase.add_attribute "status", step.status | 
					
						
							|  |  |  |           testcase.add_attribute "time", step.time | 
					
						
							| 
									
										
										
										
											2014-12-02 21:14:52 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |           if step.has_output? | 
					
						
							| 
									
										
										
										
											2014-11-18 00:41:52 -06:00
										 |  |  |             # Remove invalid XML CData characters from step output. | 
					
						
							| 
									
										
										
										
											2015-03-16 18:39:45 +00:00
										 |  |  |             output = step.output.delete("\000\a\b\e\f\x2\x1f") | 
					
						
							| 
									
										
										
										
											2014-11-18 00:41:52 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-16 10:28:51 +01:00
										 |  |  |             if output.bytesize > BYTES_IN_1_MEGABYTE | 
					
						
							|  |  |  |               output = "truncated output to 1MB:\n" \ | 
					
						
							|  |  |  |                 + output.slice(-BYTES_IN_1_MEGABYTE, BYTES_IN_1_MEGABYTE) | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2014-12-02 21:14:53 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |             cdata = REXML::CData.new output | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |             if step.passed? | 
					
						
							| 
									
										
										
										
											2014-12-02 21:14:53 -05:00
										 |  |  |               elem = testcase.add_element "system-out" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |             else | 
					
						
							| 
									
										
										
										
											2014-12-02 21:14:53 -05:00
										 |  |  |               elem = testcase.add_element "failure" | 
					
						
							|  |  |  |               elem.add_attribute "message", "#{step.status}: #{step.command.join(" ")}" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2014-12-02 21:14:53 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |             elem << cdata | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       open("brew-test-bot.xml", "w") do |xml_file| | 
					
						
							|  |  |  |         pretty_print_indent = 2
 | 
					
						
							|  |  |  |         xml_document.write(xml_file, pretty_print_indent) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ARGV.include? "--email" | 
					
						
							|  |  |  |       failed_steps = [] | 
					
						
							|  |  |  |       tests.each do |test| | 
					
						
							|  |  |  |         test.steps.each do |step| | 
					
						
							| 
									
										
										
										
											2014-12-28 18:17:02 +00:00
										 |  |  |           next if step.passed? | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |           failed_steps << step.command_short | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if failed_steps.empty? | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         email_subject = "" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |         email_subject = "#{MacOS.version}: #{failed_steps.join ", "}." | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       File.open EMAIL_SUBJECT_FILE, "w" do |file| | 
					
						
							| 
									
										
										
										
											2014-09-20 14:24:52 +01:00
										 |  |  |         file.write email_subject | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     safe_system "rm -rf #{HOMEBREW_CACHE}/*" if ARGV.include? "--clean-cache" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Homebrew.failed = any_errors | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |