| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  | require "net/http" | 
					
						
							|  |  |  | require "net/https" | 
					
						
							| 
									
										
										
										
											2016-11-20 13:00:01 -05:00
										 |  |  | require "json" | 
					
						
							| 
									
										
										
										
											2019-04-17 18:25:08 +09:00
										 |  |  | require "cli/parser" | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | require "formula" | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  | require "formulary" | 
					
						
							|  |  |  | require "version" | 
					
						
							|  |  |  | require "pkg_version" | 
					
						
							| 
									
										
										
										
											2019-04-27 00:17:48 +02:00
										 |  |  | require "formula_info" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2016-09-26 01:44:51 +02:00
										 |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-30 18:25:38 +05:30
										 |  |  |   def pull_args | 
					
						
							|  |  |  |     Homebrew::CLI::Parser.new do | 
					
						
							| 
									
										
										
										
											2020-06-05 08:53:03 +01:00
										 |  |  |       hide_from_man_page! | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       usage_banner <<~EOS | 
					
						
							| 
									
										
										
										
											2019-01-30 21:33:03 +00:00
										 |  |  |         `pull` [<options>] <patch> | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-08 22:49:03 -04:00
										 |  |  |         Get a patch from a GitHub commit or pull request and apply it to Homebrew. | 
					
						
							| 
									
										
										
										
											2018-10-02 19:54:22 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-18 12:13:43 -04:00
										 |  |  |         Each <patch> may be the number of a pull request in `homebrew/core` | 
					
						
							|  |  |  |         or the URL of any pull request or commit on GitHub. | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       EOS | 
					
						
							|  |  |  |       switch "--bump", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "For one-formula PRs, automatically reword commit message to our preferred format." | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       switch "--clean", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Do not rewrite or otherwise modify the commits found in the pulled PR." | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       switch "--ignore-whitespace", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Silently ignore whitespace discrepancies when applying diffs." | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       switch "--resolve", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "When a patch fails to apply, leave in progress and allow user to resolve, instead "\ | 
					
						
							|  |  |  |                           "of aborting." | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       switch "--branch-okay", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Do not warn if pulling to a branch besides master (useful for testing)." | 
					
						
							| 
									
										
										
										
											2018-09-28 21:39:52 +05:30
										 |  |  |       switch "--no-pbcopy", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Do not copy anything to the system clipboard." | 
					
						
							| 
									
										
										
										
											2018-04-01 16:47:30 +05:30
										 |  |  |       switch :verbose | 
					
						
							|  |  |  |       switch :debug | 
					
						
							| 
									
										
										
										
											2020-03-04 17:28:24 +00:00
										 |  |  |       min_named 1
 | 
					
						
							| 
									
										
										
										
											2018-03-25 19:08:17 +05:30
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-07-30 18:25:38 +05:30
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def pull | 
					
						
							| 
									
										
										
										
											2020-06-05 08:53:03 +01:00
										 |  |  |     odeprecated "brew pull", "hub checkout" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-30 18:25:38 +05:30
										 |  |  |     odie "You meant `git pull --rebase`." if ARGV[0] == "--rebase" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pull_args.parse | 
					
						
							| 
									
										
										
										
											2018-03-25 19:08:17 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-27 10:48:03 +00:00
										 |  |  |     # Passthrough Git environment variables for e.g. git am | 
					
						
							| 
									
										
										
										
											2020-04-05 15:44:50 +01:00
										 |  |  |     Utils.set_git_name_email!(author: false, committer: true) | 
					
						
							| 
									
										
										
										
											2017-11-27 10:48:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-12 21:13:17 +01:00
										 |  |  |     # Depending on user configuration, git may try to invoke gpg. | 
					
						
							| 
									
										
										
										
											2018-05-22 23:35:50 +02:00
										 |  |  |     if Utils.popen_read("git config --get --bool commit.gpgsign").chomp == "true" | 
					
						
							|  |  |  |       begin | 
					
						
							|  |  |  |         gnupg = Formula["gnupg"] | 
					
						
							| 
									
										
										
										
											2019-11-28 15:10:50 +00:00
										 |  |  |       rescue FormulaUnavailableError # rubocop:disable Lint/SuppressedException | 
					
						
							| 
									
										
										
										
											2018-05-22 23:35:50 +02:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2020-05-18 13:50:43 +01:00
										 |  |  |         if gnupg.any_version_installed? | 
					
						
							| 
									
										
										
										
											2018-05-22 23:35:50 +02:00
										 |  |  |           path = PATH.new(ENV.fetch("PATH")) | 
					
						
							|  |  |  |           path.prepend(gnupg.installed_prefix/"bin") | 
					
						
							|  |  |  |           ENV["PATH"] = path | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2018-05-12 21:13:17 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |     do_bump = args.bump? && !args.clean? | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 15:11:34 +08:00
										 |  |  |     tap = nil | 
					
						
							| 
									
										
										
										
											2015-08-24 12:24:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-04 17:28:24 +00:00
										 |  |  |     args.named.each do |arg| | 
					
						
							| 
									
										
										
										
											2017-10-18 23:32:06 -07:00
										 |  |  |       arg = "#{CoreTap.instance.default_remote}/pull/#{arg}" if arg.to_i.positive? | 
					
						
							| 
									
										
										
										
											2020-04-19 14:53:18 +01:00
										 |  |  |       if (api_match = arg.match HOMEBREW_PULL_API_REGEX) | 
					
						
							| 
									
										
										
										
											2015-12-13 01:25:58 +08:00
										 |  |  |         _, user, repo, issue = *api_match | 
					
						
							| 
									
										
										
										
											2016-03-06 15:11:34 +08:00
										 |  |  |         url = "https://github.com/#{user}/#{repo}/pull/#{issue}" | 
					
						
							| 
									
										
										
										
											2019-02-25 22:56:29 +01:00
										 |  |  |         tap = Tap.fetch(user, repo) if repo.match?(HOMEBREW_OFFICIAL_REPO_PREFIXES_REGEX) | 
					
						
							| 
									
										
										
										
											2015-12-13 01:25:58 +08:00
										 |  |  |       elsif (url_match = arg.match HOMEBREW_PULL_OR_COMMIT_URL_REGEX) | 
					
						
							|  |  |  |         url, user, repo, issue = *url_match | 
					
						
							| 
									
										
										
										
											2019-02-25 22:56:29 +01:00
										 |  |  |         tap = Tap.fetch(user, repo) if repo.match?(HOMEBREW_OFFICIAL_REPO_PREFIXES_REGEX) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2015-12-13 01:25:58 +08:00
										 |  |  |         odie "Not a GitHub pull request or commit: #{arg}" | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-19 14:53:18 +01:00
										 |  |  |       odie "No pull request detected!" if issue.blank? | 
					
						
							| 
									
										
										
										
											2016-03-11 22:07:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 15:11:34 +08:00
										 |  |  |       if tap | 
					
						
							|  |  |  |         tap.install unless tap.installed? | 
					
						
							|  |  |  |         Dir.chdir tap.path | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         Dir.chdir HOMEBREW_REPOSITORY | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       # The cache directory seems like a good place to put patches. | 
					
						
							|  |  |  |       HOMEBREW_CACHE.mkpath | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-15 11:11:24 +00:00
										 |  |  |       # Store current revision and branch | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  |       orig_revision = `git rev-parse --short HEAD`.strip | 
					
						
							| 
									
										
										
										
											2015-01-15 11:11:24 +00:00
										 |  |  |       branch = `git symbolic-ref --short HEAD`.strip | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-05 14:21:45 +01:00
										 |  |  |       if branch != "master" && !args.clean? && !args.branch_okay? | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |         opoo "Current branch is #{branch}: do you need to pull inside master?" | 
					
						
							| 
									
										
										
										
											2015-05-13 18:32:37 +08:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:09:22 +01:00
										 |  |  |       patch_puller = PatchPuller.new(url, args) | 
					
						
							|  |  |  |       patch_puller.fetch_patch | 
					
						
							|  |  |  |       patch_changes = files_changed_in_patch(patch_puller.patchpath, tap) | 
					
						
							| 
									
										
										
										
											2016-03-11 22:07:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-20 10:09:22 +01:00
										 |  |  |       is_bumpable = patch_changes[:formulae].length == 1 && patch_changes[:others].empty? | 
					
						
							|  |  |  |       check_bumps(patch_changes) if do_bump | 
					
						
							|  |  |  |       old_versions = current_versions_from_info_external(patch_changes[:formulae].first) if is_bumpable | 
					
						
							|  |  |  |       patch_puller.apply_patch | 
					
						
							| 
									
										
										
										
											2019-02-20 19:37:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-20 19:54:38 +01:00
										 |  |  |       end_revision = `git rev-parse --short HEAD`.strip | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-28 15:54:05 +01:00
										 |  |  |       changed_formulae_names = [] | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 15:11:34 +08:00
										 |  |  |       if tap | 
					
						
							|  |  |  |         Utils.popen_read( | 
					
						
							|  |  |  |           "git", "diff-tree", "-r", "--name-only", | 
					
						
							| 
									
										
										
										
											2019-02-20 19:37:06 +01:00
										 |  |  |           "--diff-filter=AM", orig_revision, end_revision, "--", tap.formula_dir.to_s | 
					
						
							| 
									
										
										
										
											2016-03-06 15:11:34 +08:00
										 |  |  |         ).each_line do |line| | 
					
						
							| 
									
										
										
										
											2016-06-17 21:42:43 +02:00
										 |  |  |           next unless line.end_with? ".rb\n" | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 15:11:34 +08:00
										 |  |  |           name = "#{tap.name}/#{File.basename(line.chomp, ".rb")}" | 
					
						
							| 
									
										
										
										
											2016-06-17 21:42:43 +02:00
										 |  |  |           changed_formulae_names << name | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-28 15:54:05 +01:00
										 |  |  |       changed_formulae_names.each do |name| | 
					
						
							| 
									
										
										
										
											2020-04-05 15:44:50 +01:00
										 |  |  |         next if Homebrew::EnvConfig.disable_load_formula? | 
					
						
							| 
									
										
										
										
											2016-05-28 15:54:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-17 21:42:43 +02:00
										 |  |  |         begin | 
					
						
							|  |  |  |           f = Formula[name] | 
					
						
							| 
									
										
										
										
											2017-10-07 00:31:28 +02:00
										 |  |  |         rescue Exception # rubocop:disable Lint/RescueException | 
					
						
							|  |  |  |           # Make sure we catch syntax errors. | 
					
						
							| 
									
										
										
										
											2016-06-17 21:42:43 +02:00
										 |  |  |           next | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-11 13:41:59 +01:00
										 |  |  |         next unless f.stable | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-11 13:41:59 +01:00
										 |  |  |         stable_urls = [f.stable.url] + f.stable.mirrors | 
					
						
							|  |  |  |         stable_urls.grep(%r{^https://dl.bintray.com/homebrew/mirror/}) do |mirror_url| | 
					
						
							|  |  |  |           check_bintray_mirror(f.full_name, mirror_url) | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |       orig_message = message = `git log HEAD^.. --format=%B` | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |       if issue && !args.clean? | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  |         ohai "Patch closes issue ##{issue}" | 
					
						
							| 
									
										
										
										
											2016-05-28 19:35:05 +01:00
										 |  |  |         close_message = "Closes ##{issue}." | 
					
						
							| 
									
										
										
										
											2016-03-11 22:07:15 +08:00
										 |  |  |         # If this is a pull request, append a close message. | 
					
						
							|  |  |  |         message += "\n#{close_message}" unless message.include? close_message | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-28 15:54:05 +01:00
										 |  |  |       if changed_formulae_names.empty? | 
					
						
							| 
									
										
										
										
											2019-04-08 12:47:15 -04:00
										 |  |  |         odie "Cannot bump: no changed formulae found after applying patch" if do_bump | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |         is_bumpable = false | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-05-28 15:54:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |       is_bumpable = false if args.clean? | 
					
						
							| 
									
										
										
										
											2020-04-05 15:44:50 +01:00
										 |  |  |       is_bumpable = false if Homebrew::EnvConfig.disable_load_formula? | 
					
						
							| 
									
										
										
										
											2016-05-28 15:54:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if is_bumpable | 
					
						
							|  |  |  |         formula = Formula[changed_formulae_names.first] | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  |         new_versions = current_versions_from_info_external(patch_changes[:formulae].first) | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |         orig_subject = message.empty? ? "" : message.lines.first.chomp | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  |         bump_subject = subject_for_bump(formula, old_versions, new_versions) | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |         if do_bump | 
					
						
							| 
									
										
										
										
											2016-05-04 02:46:21 +02:00
										 |  |  |           odie "No version changes found for #{formula.name}" if bump_subject.nil? | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  |           unless orig_subject == bump_subject | 
					
						
							| 
									
										
										
										
											2016-05-04 02:46:21 +02:00
										 |  |  |             ohai "New bump commit subject: #{bump_subject}" | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |             pbcopy bump_subject unless args.no_pbcopy? | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  |             message = "#{bump_subject}\n\n#{message}" | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  |         elsif bump_subject != orig_subject && !bump_subject.nil? | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |           opoo "Nonstandard bump subject: #{orig_subject}" | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  |           opoo "Subject should be: #{bump_subject}" | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-05 18:40:01 +05:30
										 |  |  |       if message != orig_message && !args.clean? | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |         safe_system "git", "commit", "--amend", "--signoff", "--allow-empty", "-q", "-m", message | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  |       ohai "Patch changed:" | 
					
						
							| 
									
										
										
										
											2019-02-20 19:37:06 +01:00
										 |  |  |       safe_system "git", "diff-tree", "-r", "--stat", orig_revision, end_revision | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def check_bumps(patch_changes) | 
					
						
							|  |  |  |     if patch_changes[:formulae].empty? | 
					
						
							|  |  |  |       odie "No changed formulae found to bump" | 
					
						
							|  |  |  |     elsif patch_changes[:formulae].length > 1
 | 
					
						
							|  |  |  |       odie "Can only bump one changed formula; bumped #{patch_changes[:formulae]}" | 
					
						
							|  |  |  |     elsif !patch_changes[:others].empty? | 
					
						
							| 
									
										
										
										
											2019-12-13 15:39:55 -05:00
										 |  |  |       odie "Cannot bump if non-formula files are changed" | 
					
						
							| 
									
										
										
										
											2019-02-20 19:37:06 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |   class PatchPuller | 
					
						
							| 
									
										
										
										
											2020-07-07 11:29:33 +01:00
										 |  |  |     attr_reader :base_url, :patch_url, :patchpath | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 19:08:17 +05:30
										 |  |  |     def initialize(url, args, description = nil) | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |       @base_url = url | 
					
						
							|  |  |  |       # GitHub provides commits/pull-requests raw patches using this URL. | 
					
						
							|  |  |  |       @patch_url = url + ".patch" | 
					
						
							|  |  |  |       @patchpath = HOMEBREW_CACHE + File.basename(patch_url) | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  |       @description = description | 
					
						
							| 
									
										
										
										
											2018-03-25 19:08:17 +05:30
										 |  |  |       @args = args | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2019-02-20 19:37:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |     def fetch_patch | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  |       extra_msg = @description ? "(#{@description})" : nil | 
					
						
							|  |  |  |       ohai "Fetching patch #{extra_msg}" | 
					
						
							|  |  |  |       puts "Patch: #{patch_url}" | 
					
						
							| 
									
										
										
										
											2017-08-08 18:10:13 +02:00
										 |  |  |       curl_download patch_url, to: patchpath | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def apply_patch | 
					
						
							|  |  |  |       # Applies a patch previously downloaded with fetch_patch() | 
					
						
							|  |  |  |       # Deletes the patch file as a side effect, regardless of success | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ohai "Applying patch" | 
					
						
							|  |  |  |       patch_args = [] | 
					
						
							|  |  |  |       # Normally we don't want whitespace errors, but squashing them can break | 
					
						
							|  |  |  |       # patches so an option is provided to skip this step. | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |       patch_args << if @args.ignore_whitespace? || @args.clean? | 
					
						
							|  |  |  |         "--whitespace=nowarn" | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |         "--whitespace=fix" | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Fall back to three-way merge if patch does not apply cleanly | 
					
						
							|  |  |  |       patch_args << "-3" | 
					
						
							|  |  |  |       patch_args << patchpath | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       begin | 
					
						
							|  |  |  |         safe_system "git", "am", *patch_args | 
					
						
							|  |  |  |       rescue ErrorDuringExecution | 
					
						
							| 
									
										
										
										
											2018-03-25 19:08:17 +05:30
										 |  |  |         if @args.resolve? | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |           odie "Patch failed to apply: try to resolve it." | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           system "git", "am", "--abort" | 
					
						
							|  |  |  |           odie "Patch failed to apply: aborted." | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       ensure | 
					
						
							|  |  |  |         patchpath.unlink | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # List files changed by a patch, partitioned in to those that are (probably) | 
					
						
							|  |  |  |   # formula definitions, and those which aren't. Only applies to patches on | 
					
						
							|  |  |  |   # Homebrew core or taps, based simply on relative pathnames of affected files. | 
					
						
							|  |  |  |   def files_changed_in_patch(patchfile, tap) | 
					
						
							|  |  |  |     files = [] | 
					
						
							|  |  |  |     formulae = [] | 
					
						
							|  |  |  |     others = [] | 
					
						
							|  |  |  |     File.foreach(patchfile) do |line| | 
					
						
							| 
									
										
										
										
											2017-06-10 20:23:20 +03:00
										 |  |  |       files << Regexp.last_match(1) if line =~ %r{^\+\+\+ b/(.*)} | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |     end | 
					
						
							|  |  |  |     files.each do |file| | 
					
						
							| 
									
										
										
										
											2017-09-24 19:24:46 +01:00
										 |  |  |       if tap&.formula_file?(file) | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |         formula_name = File.basename(file, ".rb") | 
					
						
							|  |  |  |         formulae << formula_name unless formulae.include?(formula_name) | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         others << file | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-09-17 15:32:44 +01:00
										 |  |  |     { files: files, formulae: formulae, others: others } | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # Get current formula versions without loading formula definition in this process. | 
					
						
							|  |  |  |   # Returns info as a hash (type => version), for pull.rb's internal use. | 
					
						
							|  |  |  |   # Uses special key `:nonexistent => true` for nonexistent formulae. | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |   def current_versions_from_info_external(formula_name) | 
					
						
							| 
									
										
										
										
											2019-04-27 00:17:48 +02:00
										 |  |  |     info = FormulaInfo.lookup(formula_name) | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |     versions = {} | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  |     if info | 
					
						
							|  |  |  |       [:stable, :devel, :head].each do |spec_type| | 
					
						
							|  |  |  |         versions[spec_type] = info.version(spec_type) | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |       end | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       versions[:nonexistent] = true | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     versions | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def subject_for_bump(formula, old, new) | 
					
						
							|  |  |  |     if old[:nonexistent] | 
					
						
							|  |  |  |       # New formula | 
					
						
							| 
									
										
										
										
											2016-09-11 17:41:51 +01:00
										 |  |  |       headline_ver = if new[:stable] | 
					
						
							|  |  |  |         new[:stable] | 
					
						
							|  |  |  |       elsif new[:devel] | 
					
						
							|  |  |  |         new[:devel] | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         new[:head] | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |       subject = "#{formula.name} #{headline_ver} (new formula)" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       # Update to existing formula | 
					
						
							|  |  |  |       subject_strs = [] | 
					
						
							|  |  |  |       formula_name_str = formula.name | 
					
						
							|  |  |  |       if old[:stable] != new[:stable] | 
					
						
							|  |  |  |         if new[:stable].nil? | 
					
						
							|  |  |  |           subject_strs << "remove stable" | 
					
						
							|  |  |  |           formula_name_str += ":" # just for cosmetics | 
					
						
							|  |  |  |         else | 
					
						
							| 
									
										
										
										
											2017-02-08 00:58:20 -08:00
										 |  |  |           subject_strs << new[:stable] | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       if old[:devel] != new[:devel] | 
					
						
							|  |  |  |         if new[:devel].nil? | 
					
						
							|  |  |  |           # Only bother mentioning if there's no accompanying stable change | 
					
						
							|  |  |  |           if !new[:stable].nil? && old[:stable] == new[:stable] | 
					
						
							|  |  |  |             subject_strs << "remove devel" | 
					
						
							|  |  |  |             formula_name_str += ":" # just for cosmetics | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         else | 
					
						
							| 
									
										
										
										
											2017-02-08 00:58:20 -08:00
										 |  |  |           subject_strs << "#{new[:devel]} (devel)" | 
					
						
							| 
									
										
										
										
											2016-01-26 00:25:22 -05:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       subject = subject_strs.empty? ? nil : "#{formula_name_str} #{subject_strs.join(", ")}" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     subject | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def pbcopy(text) | 
					
						
							|  |  |  |     Utils.popen_write("pbcopy") { |io| io.write text } | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-05-03 08:22:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 15:01:28 -05:00
										 |  |  |   def check_bintray_mirror(name, url) | 
					
						
							| 
									
										
										
										
											2017-08-08 18:10:13 +02:00
										 |  |  |     headers, = curl_output("--connect-timeout", "15", "--location", "--head", url) | 
					
						
							| 
									
										
										
										
											2020-06-02 09:49:23 +01:00
										 |  |  |     status_code = headers.scan(%r{^HTTP/.* (\d+)}).last.first | 
					
						
							| 
									
										
										
										
											2017-04-29 19:30:19 -04:00
										 |  |  |     return if status_code.start_with?("2") | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 15:01:28 -05:00
										 |  |  |     opoo "The Bintray mirror #{url} is not reachable (HTTP status code #{status_code})." | 
					
						
							|  |  |  |     opoo "Do you need to upload it with `brew mirror #{name}`?" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-09-20 14:27:54 +01:00
										 |  |  | end |