From 2dce2ace2c5ffc2c5cefbfdfae5325670c188773 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 02:47:38 +0200 Subject: [PATCH 01/18] Pass `args.verbose?` to `Bintray`. --- Library/Homebrew/bintray.rb | 5 +++-- Library/Homebrew/dev-cmd/mirror.rb | 2 +- Library/Homebrew/dev-cmd/pr-upload.rb | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/bintray.rb b/Library/Homebrew/bintray.rb index d9b8512876..455419795f 100644 --- a/Library/Homebrew/bintray.rb +++ b/Library/Homebrew/bintray.rb @@ -13,8 +13,9 @@ class Bintray "#" end - def initialize(org: "homebrew") + def initialize(org: "homebrew", verbose: false) @bintray_org = org + @verbose = verbose raise UsageError, "Must set a Bintray organisation!" unless @bintray_org @@ -32,7 +33,7 @@ class Bintray end curl(*args, url, - show_output: Homebrew.args.verbose?, + show_output: @verbose, secrets: @bintray_key) end diff --git a/Library/Homebrew/dev-cmd/mirror.rb b/Library/Homebrew/dev-cmd/mirror.rb index 832707227a..3de9a3c1a2 100644 --- a/Library/Homebrew/dev-cmd/mirror.rb +++ b/Library/Homebrew/dev-cmd/mirror.rb @@ -31,7 +31,7 @@ module Homebrew bintray_org = args.bintray_org || "homebrew" bintray_repo = args.bintray_repo || "mirror" - bintray = Bintray.new(org: bintray_org) + bintray = Bintray.new(org: bintray_org, verbose: args.verbose?) args.formulae.each do |formula| mirror_url = bintray.mirror_formula(formula, repo: bintray_repo, publish_package: !args.no_publish?) diff --git a/Library/Homebrew/dev-cmd/pr-upload.rb b/Library/Homebrew/dev-cmd/pr-upload.rb index aa83627f63..40e0b9ff96 100644 --- a/Library/Homebrew/dev-cmd/pr-upload.rb +++ b/Library/Homebrew/dev-cmd/pr-upload.rb @@ -49,7 +49,7 @@ module Homebrew args = pr_upload_args.parse bintray_org = args.bintray_org || "homebrew" - bintray = Bintray.new(org: bintray_org) + bintray = Bintray.new(org: bintray_org, verbose: args.verbose?) json_files = Dir["*.json"] odie "No JSON files found in the current working directory" if json_files.empty? From 57fa48b7581ebf3c7acae959bc7ec88e83f50118 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 02:48:20 +0200 Subject: [PATCH 02/18] Remove unneeded call to `#shutup!` in spec. --- Library/Homebrew/test/download_strategies_spec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/Library/Homebrew/test/download_strategies_spec.rb b/Library/Homebrew/test/download_strategies_spec.rb index f24857652e..07a3f7bc8d 100644 --- a/Library/Homebrew/test/download_strategies_spec.rb +++ b/Library/Homebrew/test/download_strategies_spec.rb @@ -121,7 +121,6 @@ describe GitDownloadStrategy do git_commit_all end - subject.shutup! expect(subject.fetch_last_commit).to eq("f68266e") end end From 7926f7fc825a80f84a10a72e8b1db0aed99882fd Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 02:52:24 +0200 Subject: [PATCH 03/18] Pass `args.verbose?` to `BuildError#dump`. --- Library/Homebrew/brew.rb | 5 +++-- Library/Homebrew/exceptions.rb | 4 ++-- Library/Homebrew/upgrade.rb | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index ca89004014..8d4b8799b8 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -59,7 +59,8 @@ begin ARGV.delete_at(help_cmd_index) if help_cmd_index - Homebrew.args = Homebrew::CLI::Parser.new.parse(ARGV.dup.freeze, ignore_invalid_options: true) + args = Homebrew::CLI::Parser.new.parse(ARGV.dup.freeze, ignore_invalid_options: true) + Homebrew.args = args path = PATH.new(ENV["PATH"]) homebrew_path = PATH.new(ENV["HOMEBREW_PATH"]) @@ -148,7 +149,7 @@ rescue Interrupt exit 130 rescue BuildError => e Utils::Analytics.report_build_error(e) - e.dump + e.dump(verbose: args.verbose?) if e.formula.head? || e.formula.deprecated? || e.formula.disabled? $stderr.puts <<~EOS diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb index 49e05e0484..f3fb93c6f0 100644 --- a/Library/Homebrew/exceptions.rb +++ b/Library/Homebrew/exceptions.rb @@ -356,10 +356,10 @@ class BuildError < RuntimeError [] end - def dump + def dump(verbose: false) puts - if Homebrew.args.verbose? + if verbose require "system_config" require "build_environment" diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index d447331884..99a954464e 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -102,7 +102,7 @@ module Homebrew rescue CannotInstallFormulaError => e ofail e rescue BuildError => e - e.dump + e.dump(verbose: args.verbose?) puts Homebrew.failed = true rescue DownloadError => e @@ -225,7 +225,7 @@ module Homebrew rescue CannotInstallFormulaError => e ofail e rescue BuildError => e - e.dump + e.dump(verbose: args.verbose?) puts Homebrew.failed = true rescue DownloadError => e From 26688145f0f83318054b0f4ee0b10f72e26eb779 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 02:53:08 +0200 Subject: [PATCH 04/18] Don't use global `Homebrew.args` in `brew.rb`. --- Library/Homebrew/brew.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index 8d4b8799b8..22d959459a 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -141,8 +141,8 @@ rescue UsageError => e require "help" Homebrew::Help.help cmd, usage_error: e.message rescue SystemExit => e - onoe "Kernel.exit" if Homebrew.args.debug? && !e.success? - $stderr.puts e.backtrace if Homebrew.args.debug? + onoe "Kernel.exit" if args.debug? && !e.success? + $stderr.puts e.backtrace if args.debug? raise rescue Interrupt $stderr.puts # seemingly a newline is typical @@ -163,7 +163,7 @@ rescue RuntimeError, SystemCallError => e raise if e.message.empty? onoe e - $stderr.puts e.backtrace if Homebrew.args.debug? + $stderr.puts e.backtrace if args.debug? exit 1 rescue MethodDeprecatedError => e @@ -172,7 +172,7 @@ rescue MethodDeprecatedError => e $stderr.puts "If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):" $stderr.puts " #{Formatter.url(e.issues_url)}" end - $stderr.puts e.backtrace if Homebrew.args.debug? + $stderr.puts e.backtrace if args.debug? exit 1 rescue Exception => e # rubocop:disable Lint/RescueException onoe e From add10377b893d8e970bc4122a32f0dfcd1091481 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 03:01:42 +0200 Subject: [PATCH 05/18] Pass `debug?` and `verbose?` to `Cleaner`. --- Library/Homebrew/cleaner.rb | 12 +++++++++--- Library/Homebrew/formula_installer.rb | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/cleaner.rb b/Library/Homebrew/cleaner.rb index cf962341f7..e011af9094 100644 --- a/Library/Homebrew/cleaner.rb +++ b/Library/Homebrew/cleaner.rb @@ -10,9 +10,15 @@ # * sets permissions on executables # * removes unresolved symlinks class Cleaner + extend Predicable + + attr_predicate :verbose?, :debug? + # Create a cleaner for the given formula - def initialize(f) + def initialize(f, verbose: false, debug: false) @f = f + @verbose = verbose + @debug = debug end # Clean the keg of formula @f @@ -58,7 +64,7 @@ class Cleaner # actual files gets removed correctly. dirs.reverse_each do |d| if d.children.empty? - puts "rmdir: #{d} (empty)" if Homebrew.args.verbose? + puts "rmdir: #{d} (empty)" if verbose? d.rmdir end end @@ -109,7 +115,7 @@ class Cleaner else 0444 end - if Homebrew.args.debug? + if debug? old_perms = path.stat.mode & 0777 odebug "Fixing #{path} permissions from #{old_perms.to_s(8)} to #{perms.to_s(8)}" if perms != old_perms end diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index e70d60089e..8911a2b5a1 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -956,7 +956,7 @@ class FormulaInstaller def clean ohai "Cleaning" if verbose? - Cleaner.new(formula).clean + Cleaner.new(formula, verbose: verbose?, debug: debug?).clean rescue Exception => e # rubocop:disable Lint/RescueException opoo "The cleaning step did not complete successfully" puts "Still, the installation was successful, so we will link it into your prefix" From 75a692d08b459138e1204fcd6a66f126f95437a3 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 03:22:22 +0200 Subject: [PATCH 06/18] Make `ohai`, `oh1` and `odebug` use `#debug?` and `verbose?` of the current object when possible. --- Library/Homebrew/formula_installer.rb | 8 ++++---- Library/Homebrew/utils.rb | 28 ++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 8911a2b5a1..30d7d2c292 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -939,7 +939,7 @@ class FormulaInstaller log.mkpath if formula.plist.include? log.to_s rescue Exception => e # rubocop:disable Lint/RescueException onoe "Failed to install plist file" - ohai e, e.backtrace if debug? + odebug e, e.backtrace Homebrew.failed = true end @@ -949,7 +949,7 @@ class FormulaInstaller onoe "Failed to fix install linkage" puts "The formula built, but you may encounter issues using it or linking other" puts "formulae against it." - ohai e, e.backtrace if debug? + odebug e, e.backtrace Homebrew.failed = true @show_summary_heading = true end @@ -960,7 +960,7 @@ class FormulaInstaller rescue Exception => e # rubocop:disable Lint/RescueException opoo "The cleaning step did not complete successfully" puts "Still, the installation was successful, so we will link it into your prefix" - ohai e, e.backtrace if debug? + odebug e, e.backtrace Homebrew.failed = true @show_summary_heading = true end @@ -996,7 +996,7 @@ class FormulaInstaller rescue Exception => e # rubocop:disable Lint/RescueException opoo "The post-install step did not complete successfully" puts "You can try again using `brew postinstall #{formula.full_name}`" - ohai e, e.backtrace if debug? || Homebrew::EnvConfig.developer? + odebug e, e.backtrace, always_display: Homebrew::EnvConfig.developer? Homebrew.failed = true @show_summary_heading = true end diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index 254ac11ea1..fce6709031 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -86,7 +86,13 @@ module Kernel end def ohai_title(title) - title = Tty.truncate(title) if $stdout.tty? && !Homebrew.args.verbose? + verbose = if respond_to?(:verbose?) + verbose? + else + Homebrew.args.verbose? + end + + title = Tty.truncate(title) if $stdout.tty? && !verbose Formatter.headline(title, color: :blue) end @@ -95,15 +101,27 @@ module Kernel puts sput end - def odebug(title, *sput) - return unless Homebrew.args.debug? + def odebug(title, *sput, always_display: false) + debug = if respond_to?(:debug?) + debug? + else + Homebrew.args.debug? + end + + return unless debug || always_display puts Formatter.headline(title, color: :magenta) puts sput unless sput.empty? end - def oh1(title, options = {}) - title = Tty.truncate(title) if $stdout.tty? && !Homebrew.args.verbose? && options.fetch(:truncate, :auto) == :auto + def oh1(title, truncate: :auto) + verbose = if respond_to?(:verbose?) + verbose? + else + Homebrew.args.verbose? + end + + title = Tty.truncate(title) if $stdout.tty? && !verbose && truncate == :auto puts Formatter.headline(title, color: :green) end From 5caafe413eefc89eaa72c1bb97efd5ce2201bfa0 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 03:32:05 +0200 Subject: [PATCH 07/18] Pass `debug?` to `Formula#brew` and `Formula#run_test`. --- Library/Homebrew/build.rb | 2 +- Library/Homebrew/dev-cmd/unpack.rb | 2 +- Library/Homebrew/formula.rb | 8 ++++---- Library/Homebrew/test.rb | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Library/Homebrew/build.rb b/Library/Homebrew/build.rb index d0ec6dacf7..af4e312518 100644 --- a/Library/Homebrew/build.rb +++ b/Library/Homebrew/build.rb @@ -139,7 +139,7 @@ class Build formula.update_head_version - formula.brew(fetch: false, keep_tmp: args.keep_tmp?, interactive: args.interactive?) do |_formula, _staging| + formula.brew(fetch: false, keep_tmp: args.keep_tmp?, interactive: args.interactive?, debug: args.debug?) do # For head builds, HOMEBREW_FORMULA_PREFIX should include the commit, # which is not known until after the formula has been staged. ENV["HOMEBREW_FORMULA_PREFIX"] = formula.prefix diff --git a/Library/Homebrew/dev-cmd/unpack.rb b/Library/Homebrew/dev-cmd/unpack.rb index fbdd7c459e..b72aa312bb 100644 --- a/Library/Homebrew/dev-cmd/unpack.rb +++ b/Library/Homebrew/dev-cmd/unpack.rb @@ -57,7 +57,7 @@ module Homebrew # show messages about tar with_env VERBOSE: "1" do - f.brew do + f.brew(debug: args.debug?) do f.patch if args.patch? cp_r getwd, stage_dir, preserve: true end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 10ab763470..c2d75a9aaf 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1170,7 +1170,7 @@ class Formula # yields |self,staging| with current working directory set to the uncompressed tarball # where staging is a Mktemp staging context # @private - def brew(fetch: true, keep_tmp: false, interactive: false) + def brew(fetch: true, keep_tmp: false, interactive: false, debug: false) @prefix_returns_versioned_prefix = true active_spec.fetch if fetch stage(interactive: interactive) do |staging| @@ -1182,7 +1182,7 @@ class Formula begin yield self, staging rescue - staging.retain! if interactive || Homebrew.args.debug? + staging.retain! if interactive || debug raise ensure cp Dir["config.log", "CMakeCache.txt"], logs @@ -1803,7 +1803,7 @@ class Formula end # @private - def run_test(keep_tmp: false) + def run_test(keep_tmp: false, debug: false) @prefix_returns_versioned_prefix = true test_env = { @@ -1831,7 +1831,7 @@ class Formula end end rescue Exception # rubocop:disable Lint/RescueException - staging.retain! if Homebrew.args.debug? + staging.retain! if debug raise end end diff --git a/Library/Homebrew/test.rb b/Library/Homebrew/test.rb index 2936c20715..dfc73862ef 100644 --- a/Library/Homebrew/test.rb +++ b/Library/Homebrew/test.rb @@ -34,7 +34,7 @@ begin # tests can also return false to indicate failure Timeout.timeout TEST_TIMEOUT_SECONDS do - raise "test returned false" if formula.run_test(keep_tmp: args.keep_tmp?) == false + raise "test returned false" if formula.run_test(keep_tmp: args.keep_tmp?, debug: args.debug?) == false end rescue Exception => e # rubocop:disable Lint/RescueException error_pipe.puts e.to_json From 5db764f3cb3d8b3e356cc8f209ff4c52c126362e Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 03:36:09 +0200 Subject: [PATCH 08/18] Pass `debug?` and `verbose?` in `brew style`. --- Library/Homebrew/dev-cmd/audit.rb | 2 +- Library/Homebrew/dev-cmd/style.rb | 4 +++- Library/Homebrew/style.rb | 13 +++++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 45b24c293d..599c770802 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -103,7 +103,7 @@ module Homebrew only_cops = args.only_cops except_cops = args.except_cops - options = { fix: args.fix? } + options = { fix: args.fix?, debug: args.debug?, verbose: args.verbose? } if only_cops options[:only_cops] = only_cops diff --git a/Library/Homebrew/dev-cmd/style.rb b/Library/Homebrew/dev-cmd/style.rb index 7bb6fe8e75..3c05b73778 100644 --- a/Library/Homebrew/dev-cmd/style.rb +++ b/Library/Homebrew/dev-cmd/style.rb @@ -50,7 +50,9 @@ module Homebrew only_cops = args.only_cops except_cops = args.except_cops - options = { fix: args.fix?, display_cop_names: args.display_cop_names? } + options = { + fix: args.fix?, display_cop_names: args.display_cop_names?, debug: args.debug?, verbose: args.verbose? + } if only_cops options[:only_cops] = only_cops elsif except_cops diff --git a/Library/Homebrew/style.rb b/Library/Homebrew/style.rb index c7a94df76b..be40a4dd41 100644 --- a/Library/Homebrew/style.rb +++ b/Library/Homebrew/style.rb @@ -16,7 +16,9 @@ module Homebrew check_style_impl(files, :json, **options) end - def check_style_impl(files, output_type, fix: false, except_cops: nil, only_cops: nil, display_cop_names: false) + def check_style_impl(files, output_type, + fix: false, except_cops: nil, only_cops: nil, display_cop_names: false, + debug: false, verbose: false) Homebrew.install_bundler_gems! require "rubocop" require "rubocops" @@ -30,7 +32,8 @@ module Homebrew "--parallel" end - args += ["--extra-details", "--display-cop-names"] if Homebrew.args.verbose? + args += ["--extra-details"] if verbose + args += ["--display-cop-names"] if display_cop_names || verbose if except_cops except_cops.map! { |cop| RuboCop::Cop::Cop.registry.qualified_cop_name(cop.to_s, "") } @@ -77,15 +80,13 @@ module Homebrew case output_type when :print - args << "--debug" if Homebrew.args.debug? - args << "--display-cop-names" if display_cop_names + args << "--debug" if debug args << "--format" << "simple" if files.present? system(cache_env, "rubocop", *args) rubocop_success = $CHILD_STATUS.success? when :json json, err, status = - Open3.capture3(cache_env, "rubocop", - "--format", "json", *args) + Open3.capture3(cache_env, "rubocop", "--format", "json", *args) # exit status of 1 just means violations were found; other numbers mean # execution errors. # exitstatus can also be nil if RuboCop process crashes, e.g. due to From e9d8f09da1f84ed57d534cbed3f935a6ae641cb1 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 03:53:30 +0200 Subject: [PATCH 09/18] Pass `debug?`, `quiet?` and `verbose?` to `FormulaInstaller`. --- Library/Homebrew/cask/installer.rb | 3 +-- Library/Homebrew/cmd/install.rb | 3 ++- Library/Homebrew/cmd/postinstall.rb | 2 +- Library/Homebrew/formula_installer.rb | 25 +++++++++++-------------- Library/Homebrew/reinstall.rb | 3 ++- Library/Homebrew/upgrade.rb | 5 ++--- 6 files changed, 19 insertions(+), 22 deletions(-) diff --git a/Library/Homebrew/cask/installer.rb b/Library/Homebrew/cask/installer.rb index cbf5dc389b..5ad75d01ce 100644 --- a/Library/Homebrew/cask/installer.rb +++ b/Library/Homebrew/cask/installer.rb @@ -367,11 +367,10 @@ module Cask force: false, ).install else - FormulaInstaller.new(cask_or_formula).yield_self do |fi| + FormulaInstaller.new(cask_or_formula, verbose: verbose?).yield_self do |fi| fi.installed_as_dependency = true fi.installed_on_request = false fi.show_header = true - fi.verbose = verbose? fi.prelude fi.fetch fi.install diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 607e69ec92..efb73358d6 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -325,7 +325,8 @@ module Homebrew fi = FormulaInstaller.new(f, force_bottle: args.force_bottle?, include_test_formulae: args.include_test_formulae, - build_from_source_formulae: args.build_from_source_formulae) + build_from_source_formulae: args.build_from_source_formulae, + debug: args.debug?, quiet: args.quiet?, verbose: args.verbose?) fi.options = build_options.used_options fi.env = args.env fi.force = args.force? diff --git a/Library/Homebrew/cmd/postinstall.rb b/Library/Homebrew/cmd/postinstall.rb index e0ac1d548c..a9da23695f 100644 --- a/Library/Homebrew/cmd/postinstall.rb +++ b/Library/Homebrew/cmd/postinstall.rb @@ -24,7 +24,7 @@ module Homebrew args.resolved_formulae.each do |f| ohai "Postinstalling #{f}" - fi = FormulaInstaller.new(f) + fi = FormulaInstaller.new(f, debug: args.debug?, quiet: args.quiet?, verbose: args.verbose?) fi.post_install end end diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 30d7d2c292..0b8d015fe8 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -51,7 +51,8 @@ class FormulaInstaller force_bottle: false, include_test_formulae: [], build_from_source_formulae: [], - cc: nil) + cc: nil, + debug: false, quiet: false, verbose: false) @formula = formula @env = nil @force = false @@ -68,9 +69,9 @@ class FormulaInstaller @interactive = false @git = false @cc = cc - @verbose = Homebrew.args.verbose? - @quiet = Homebrew.args.quiet? - @debug = Homebrew.args.debug? + @verbose = verbose + @quiet = quiet + @debug = debug @installed_as_dependency = false @installed_on_request = true @options = Options.new @@ -601,15 +602,13 @@ class FormulaInstaller def fetch_dependency(dep) df = dep.to_formula - fi = FormulaInstaller.new(df, force_bottle: false, + fi = FormulaInstaller.new(df, force_bottle: false, include_test_formulae: include_test_formulae, - build_from_source_formulae: build_from_source_formulae) + build_from_source_formulae: build_from_source_formulae, + debug: debug?, quiet: quiet?, verbose: verbose?) fi.force = force? fi.keep_tmp = keep_tmp? - fi.verbose = verbose? - fi.quiet = quiet? - fi.debug = debug? # When fetching we don't need to recurse the dependency tree as it's already # been done for us in `compute_dependencies` and there's no requirement to # fetch in a particular order. @@ -642,9 +641,10 @@ class FormulaInstaller EOS end - fi = FormulaInstaller.new(df, force_bottle: false, + fi = FormulaInstaller.new(df, force_bottle: false, include_test_formulae: include_test_formulae, - build_from_source_formulae: build_from_source_formulae) + build_from_source_formulae: build_from_source_formulae, + debug: debug?, quiet: quiet?, verbose: verbose?) fi.options |= tab.used_options fi.options |= Tab.remap_deprecated_options(df.deprecated_options, dep.options) @@ -652,9 +652,6 @@ class FormulaInstaller fi.options &= df.options fi.force = force? fi.keep_tmp = keep_tmp? - fi.verbose = verbose? - fi.quiet = quiet? - fi.debug = debug? fi.link_keg ||= keg_was_linked if keg_had_linked_keg fi.installed_as_dependency = true fi.installed_on_request = df.any_version_installed? && tab.installed_on_request diff --git a/Library/Homebrew/reinstall.rb b/Library/Homebrew/reinstall.rb index 77645bf7c0..27301429fa 100644 --- a/Library/Homebrew/reinstall.rb +++ b/Library/Homebrew/reinstall.rb @@ -24,7 +24,8 @@ module Homebrew options &= f.options fi = FormulaInstaller.new(f, force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae) + build_from_source_formulae: args.build_from_source_formulae, + debug: args.debug?, quiet: args.quiet?, verbose: args.verbose?) fi.options = options fi.force = args.force? fi.keep_tmp = args.keep_tmp? diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index 99a954464e..06e314380f 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -63,9 +63,8 @@ module Homebrew options |= f.build.used_options options &= f.options - fi = FormulaInstaller.new(f, force_bottle: args.force_bottle?, - include_test_formulae: args.include_test_formulae, - build_from_source_formulae: args.build_from_source_formulae) + fi = FormulaInstaller.new(f, force_bottle: args.force_bottle?, + debug: args.debug?, quiet: args.quiet?, verbose: args.verbose?) fi.options = options fi.force = args.force? fi.keep_tmp = args.keep_tmp? From 6c964d4a780a1a2669e18fd66b6b7fc911cbd9df Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 04:46:32 +0200 Subject: [PATCH 10/18] Pass `verbose?` to `Keg#link`, `Keg#unlink` and `Keg#optlink`. --- Library/Homebrew/build.rb | 2 +- Library/Homebrew/cmd/install.rb | 2 +- Library/Homebrew/cmd/link.rb | 17 ++++--- Library/Homebrew/cmd/migrate.rb | 2 +- Library/Homebrew/cmd/reinstall.rb | 2 +- Library/Homebrew/cmd/switch.rb | 2 +- Library/Homebrew/cmd/unlink.rb | 9 ++-- Library/Homebrew/cmd/update-report.rb | 6 +-- Library/Homebrew/formula_installer.rb | 9 ++-- Library/Homebrew/keg.rb | 70 +++++++++++++-------------- Library/Homebrew/migrator.rb | 36 ++++++++------ Library/Homebrew/reinstall.rb | 4 +- Library/Homebrew/test/keg_spec.rb | 21 ++++---- Library/Homebrew/upgrade.rb | 2 +- 14 files changed, 92 insertions(+), 92 deletions(-) diff --git a/Library/Homebrew/build.rb b/Library/Homebrew/build.rb index af4e312518..1db5f8b290 100644 --- a/Library/Homebrew/build.rb +++ b/Library/Homebrew/build.rb @@ -201,7 +201,7 @@ class Build else raise end - Keg.new(path).optlink + Keg.new(path).optlink(verbose: args.verbose?) rescue raise "#{f.opt_prefix} not present or broken\nPlease reinstall #{f.full_name}. Sorry :(" end diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index efb73358d6..8541406e35 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -258,7 +258,7 @@ module Homebrew Install.perform_preinstall_checks(cc: args.cc) formulae.each do |f| - Migrator.migrate_if_needed(f, force: args.force?) + Migrator.migrate_if_needed(f, force: args.force?, verbose: args.verbose?) install_formula(f, args: args) Cleanup.install_formula_clean!(f) end diff --git a/Library/Homebrew/cmd/link.rb b/Library/Homebrew/cmd/link.rb index 25719e29a8..412135f55e 100644 --- a/Library/Homebrew/cmd/link.rb +++ b/Library/Homebrew/cmd/link.rb @@ -31,10 +31,11 @@ module Homebrew def link args = link_args.parse - mode = OpenStruct.new - - mode.overwrite = true if args.overwrite? - mode.dry_run = true if args.dry_run? + options = { + overwrite: args.overwrite?, + dry_run: args.dry_run?, + verbose: args.verbose?, + } args.kegs.each do |keg| keg_only = Formulary.keg_only?(keg.rack) @@ -53,13 +54,13 @@ module Homebrew next end - if mode.dry_run - if mode.overwrite + if args.dry_run? + if args.overwrite? puts "Would remove:" else puts "Would link:" end - keg.link(mode) + keg.link(**options) puts_keg_only_path_message(keg) if keg_only next end @@ -89,7 +90,7 @@ module Homebrew puts if args.verbose? begin - n = keg.link(mode) + n = keg.link(**options) rescue Keg::LinkError puts raise diff --git a/Library/Homebrew/cmd/migrate.rb b/Library/Homebrew/cmd/migrate.rb index c6f12d7831..158404a48c 100644 --- a/Library/Homebrew/cmd/migrate.rb +++ b/Library/Homebrew/cmd/migrate.rb @@ -33,7 +33,7 @@ module Homebrew raise "#{rack} is a symlink" if rack.symlink? end - migrator = Migrator.new(f, force: args.force?) + migrator = Migrator.new(f, force: args.force?, verbose: args.verbose?) migrator.migrate end end diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index cd57578a13..2de30916ce 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -67,7 +67,7 @@ module Homebrew onoe "#{f.full_name} is pinned. You must unpin it to reinstall." next end - Migrator.migrate_if_needed(f, force: args.force?) + Migrator.migrate_if_needed(f, force: args.force?, verbose: args.verbose?) reinstall_formula(f, args: args) Cleanup.install_formula_clean!(f) end diff --git a/Library/Homebrew/cmd/switch.rb b/Library/Homebrew/cmd/switch.rb index 06feb4badc..33a15d1c1f 100644 --- a/Library/Homebrew/cmd/switch.rb +++ b/Library/Homebrew/cmd/switch.rb @@ -49,7 +49,7 @@ module Homebrew # Link new version, if not keg-only if Formulary.keg_only?(rack) - keg.optlink + keg.optlink(verbose: args.verbose?) puts "Opt link created for #{keg}" else puts "#{keg.link} links created for #{keg}" diff --git a/Library/Homebrew/cmd/unlink.rb b/Library/Homebrew/cmd/unlink.rb index e31bde919a..7dfb9d7f7b 100644 --- a/Library/Homebrew/cmd/unlink.rb +++ b/Library/Homebrew/cmd/unlink.rb @@ -26,20 +26,19 @@ module Homebrew def unlink args = unlink_args.parse - mode = OpenStruct.new - mode.dry_run = true if args.dry_run? + options = { dry_run: args.dry_run?, verbose: args.verbose? } args.kegs.each do |keg| - if mode.dry_run + if args.dry_run? puts "Would remove:" - keg.unlink(mode) + keg.unlink(**options) next end keg.lock do print "Unlinking #{keg}... " puts if args.verbose? - puts "#{keg.unlink(mode)} symlinks removed" + puts "#{keg.unlink(**options)} symlinks removed" end end end diff --git a/Library/Homebrew/cmd/update-report.rb b/Library/Homebrew/cmd/update-report.rb index b35f1462d3..94d6b6cb89 100644 --- a/Library/Homebrew/cmd/update-report.rb +++ b/Library/Homebrew/cmd/update-report.rb @@ -120,7 +120,7 @@ module Homebrew else hub.dump(updated_formula_report: !args.preinstall?) hub.reporters.each(&:migrate_tap_migration) - hub.reporters.each { |r| r.migrate_formula_rename(force: args.force?) } + hub.reporters.each { |r| r.migrate_formula_rename(force: args.force?, verbose: args.verbose?) } CacheStoreDatabase.use(:descriptions) do |db| DescriptionCacheStore.new(db) .update_from_report!(hub) @@ -371,7 +371,7 @@ class Reporter end end - def migrate_formula_rename(force:) + def migrate_formula_rename(force:, verbose:) Formula.installed.each do |formula| next unless Migrator.needs_migration?(formula) @@ -395,7 +395,7 @@ class Reporter next end - Migrator.migrate_if_needed(f, force: force) + Migrator.migrate_if_needed(f, force: force, verbose: verbose) end end diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 0b8d015fe8..8603dbfb89 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -662,7 +662,7 @@ class FormulaInstaller rescue Exception => e # rubocop:disable Lint/RescueException ignore_interrupts do tmp_keg.rename(installed_keg) if tmp_keg && !installed_keg.directory? - linked_keg.link if keg_was_linked + linked_keg.link(verbose: verbose?) if keg_was_linked end raise unless e.is_a? FormulaInstallationAlreadyAttemptedError @@ -842,7 +842,7 @@ class FormulaInstaller def link(keg) unless link_keg begin - keg.optlink + keg.optlink(verbose: verbose?) Formula.clear_cache rescue Keg::LinkError => e onoe "Failed to create #{formula.opt_prefix}" @@ -873,7 +873,7 @@ class FormulaInstaller backup_dir = HOMEBREW_CACHE/"Backup" begin - keg.link + keg.link(verbose: verbose?) rescue Keg::ConflictError => e conflict_file = e.dst if formula.link_overwrite?(conflict_file) && !link_overwrite_backup.key?(conflict_file) @@ -888,8 +888,7 @@ class FormulaInstaller puts e puts puts "Possible conflicting files are:" - mode = OpenStruct.new(dry_run: true, overwrite: true) - keg.link(mode) + keg.link(dry_run: true, overwrite: true, verbose: verbose?) @show_summary_heading = true Homebrew.failed = true rescue Keg::LinkError => e diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index ccf250e6df..fc15f00546 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -323,7 +323,7 @@ class Keg EOS end - def unlink(mode = OpenStruct.new) + def unlink(**options) ObserverPathnameExtension.reset_counts! dirs = [] @@ -341,7 +341,7 @@ class Keg next unless dst.symlink? next if src != dst.resolved_path - if mode.dry_run + if options[:dry_run] puts dst Find.prune if src.directory? next @@ -354,7 +354,7 @@ class Keg end end - unless mode.dry_run + unless options[:dry_run] remove_linked_keg_record if linked? dirs.reverse_each(&:rmdir_if_possible) end @@ -436,21 +436,21 @@ class Keg end end - def link(mode = OpenStruct.new) + def link(**options) raise AlreadyLinkedError, self if linked_keg_record.directory? ObserverPathnameExtension.reset_counts! - optlink(mode) unless mode.dry_run + optlink(**options) unless options[:dry_run] # yeah indeed, you have to force anything you need in the main tree into # these dirs REMEMBER that *NOT* everything needs to be in the main tree - link_dir("etc", mode) { :mkpath } - link_dir("bin", mode) { :skip_dir } - link_dir("sbin", mode) { :skip_dir } - link_dir("include", mode) { :link } + link_dir("etc", **options) { :mkpath } + link_dir("bin", **options) { :skip_dir } + link_dir("sbin", **options) { :skip_dir } + link_dir("include", **options) { :link } - link_dir("share", mode) do |relative_path| + link_dir("share", **options) do |relative_path| case relative_path.to_s when "locale/locale.alias" then :skip_file when INFOFILE_RX then :info @@ -468,7 +468,7 @@ class Keg end end - link_dir("lib", mode) do |relative_path| + link_dir("lib", **options) do |relative_path| case relative_path.to_s when "charset.alias" then :skip_file # pkg-config database gets explicitly created @@ -494,7 +494,7 @@ class Keg end end - link_dir("Frameworks", mode) do |relative_path| + link_dir("Frameworks", **options) do |relative_path| # Frameworks contain symlinks pointing into a subdir, so we have to use # the :link strategy. However, for Foo.framework and # Foo.framework/Versions we have to use :mkpath so that multiple formulae @@ -506,9 +506,9 @@ class Keg end end - make_relative_symlink(linked_keg_record, path, mode) unless mode.dry_run + make_relative_symlink(linked_keg_record, path, **options) unless options[:dry_run] rescue LinkError - unlink + unlink(verbose: options[:verbose]) raise else ObserverPathnameExtension.n @@ -536,19 +536,19 @@ class Keg tab.aliases || [] end - def optlink(mode = OpenStruct.new) + def optlink(**options) opt_record.delete if opt_record.symlink? || opt_record.exist? - make_relative_symlink(opt_record, path, mode) + make_relative_symlink(opt_record, path, **options) aliases.each do |a| alias_opt_record = opt_record.parent/a alias_opt_record.delete if alias_opt_record.symlink? || alias_opt_record.exist? - make_relative_symlink(alias_opt_record, path, mode) + make_relative_symlink(alias_opt_record, path, **options) end return unless oldname_opt_record oldname_opt_record.delete - make_relative_symlink(oldname_opt_record, path, mode) + make_relative_symlink(oldname_opt_record, path, **options) end def delete_pyc_files! @@ -558,7 +558,7 @@ class Keg private - def resolve_any_conflicts(dst, mode) + def resolve_any_conflicts(dst, **options) return unless dst.symlink? src = dst.resolved_path @@ -571,7 +571,7 @@ class Keg stat = src.lstat rescue Errno::ENOENT # dst is a broken symlink, so remove it. - dst.unlink unless mode.dry_run + dst.unlink unless options[:dry_run] return end @@ -580,25 +580,23 @@ class Keg begin keg = Keg.for(src) rescue NotAKegError - if Homebrew.args.verbose? - puts "Won't resolve conflicts for symlink #{dst} as it doesn't resolve into the Cellar" - end + puts "Won't resolve conflicts for symlink #{dst} as it doesn't resolve into the Cellar" if options[:verbose] return end - dst.unlink unless mode.dry_run - keg.link_dir(src, mode) { :mkpath } + dst.unlink unless options[:dry_run] + keg.link_dir(src, **options) { :mkpath } true end - def make_relative_symlink(dst, src, mode) + def make_relative_symlink(dst, src, **options) if dst.symlink? && src == dst.resolved_path - puts "Skipping; link already exists: #{dst}" if Homebrew.args.verbose? + puts "Skipping; link already exists: #{dst}" if options[:verbose] return end # cf. git-clean -n: list files to delete, don't really link or delete - if mode.dry_run && mode.overwrite + if options[:dry_run] && options[:overwrite] if dst.symlink? puts "#{dst} -> #{dst.resolved_path}" elsif dst.exist? @@ -608,12 +606,12 @@ class Keg end # list all link targets - if mode.dry_run + if options[:dry_run] puts dst return end - dst.delete if mode.overwrite && (dst.exist? || dst.symlink?) + dst.delete if options[:overwrite] && (dst.exist? || dst.symlink?) dst.make_relative_symlink(src) rescue Errno::EEXIST => e raise ConflictError.new(self, src.relative_path_from(path), dst, e) if dst.exist? @@ -631,7 +629,7 @@ class Keg protected # symlinks the contents of path+relative_dir recursively into #{HOMEBREW_PREFIX}/relative_dir - def link_dir(relative_dir, mode) + def link_dir(relative_dir, **options) root = path/relative_dir return unless root.exist? @@ -655,10 +653,10 @@ class Keg when :info next if File.basename(src) == "dir" # skip historical local 'dir' files - make_relative_symlink dst, src, mode + make_relative_symlink dst, src, **options dst.install_info else - make_relative_symlink dst, src, mode + make_relative_symlink dst, src, **options end elsif src.directory? # if the dst dir already exists, then great! walk the rest of the tree tho @@ -672,10 +670,10 @@ class Keg when :skip_dir Find.prune when :mkpath - dst.mkpath unless resolve_any_conflicts(dst, mode) + dst.mkpath unless resolve_any_conflicts(dst, **options) else - unless resolve_any_conflicts(dst, mode) - make_relative_symlink dst, src, mode + unless resolve_any_conflicts(dst, **options) + make_relative_symlink dst, src, **options Find.prune end end diff --git a/Library/Homebrew/migrator.rb b/Library/Homebrew/migrator.rb index 30d0603b0e..9309e8a084 100644 --- a/Library/Homebrew/migrator.rb +++ b/Library/Homebrew/migrator.rb @@ -5,6 +5,8 @@ require "keg" require "tab" class Migrator + extend Predicable + class MigrationNeededError < RuntimeError def initialize(formula) super <<~EOS @@ -86,6 +88,8 @@ class Migrator # path to newname keg that will be linked if old_linked_keg isn't nil attr_reader :new_linked_keg_record + attr_predicate :verbose? + def self.needs_migration?(formula) oldname = formula.oldname return false unless oldname @@ -97,18 +101,20 @@ class Migrator true end - def self.migrate_if_needed(formula, force:) + def self.migrate_if_needed(formula, force:, verbose:) return unless Migrator.needs_migration?(formula) begin - migrator = Migrator.new(formula, force: force) + migrator = Migrator.new(formula, force: force, verbose: verbose) migrator.migrate rescue => e onoe e end end - def initialize(formula, force: false) + def initialize(formula, force: false, verbose: false) + @verbose = verbose + @oldname = formula.oldname @newname = formula.name raise MigratorNoOldnameError, formula unless oldname @@ -267,7 +273,7 @@ class Migrator oh1 "Unlinking #{Formatter.identifier(oldname)}" old_cellar.subdirs.each do |d| keg = Keg.new(d) - keg.unlink + keg.unlink(verbose: verbose?) end end @@ -275,7 +281,7 @@ class Migrator oh1 "Temporarily unlinking #{Formatter.identifier(newname)}" new_cellar.subdirs.each do |d| keg = Keg.new(d) - keg.unlink + keg.unlink(verbose: verbose?) end end @@ -288,7 +294,7 @@ class Migrator # If formula is keg-only we also optlink it. if formula.keg_only? || !old_linked_keg_record begin - new_keg.optlink + new_keg.optlink(verbose: verbose?) rescue Keg::LinkError => e onoe "Failed to create #{formula.opt_prefix}" raise @@ -299,15 +305,13 @@ class Migrator new_keg.remove_linked_keg_record if new_keg.linked? begin - mode = OpenStruct.new(overwrite: true) - new_keg.link(mode) + new_keg.link(overwrite: true, verbose: verbose?) rescue Keg::ConflictError => e onoe "Error while executing `brew link` step on #{newname}" puts e puts puts "Possible conflicting files are:" - mode = OpenStruct.new(dry_run: true, overwrite: true) - new_keg.link(mode) + new_keg.link(dry_run: true, overwrite: true, verbose: verbose?) raise rescue Keg::LinkError => e onoe "Error while linking" @@ -319,7 +323,7 @@ class Migrator onoe "An unexpected error occurred during linking" puts e puts e.backtrace if Homebrew.args.debug? - ignore_interrupts { new_keg.unlink } + ignore_interrupts { new_keg.unlink(verbose: verbose?) } raise end end @@ -384,7 +388,7 @@ class Migrator if new_cellar.exist? new_cellar.subdirs.each do |d| newname_keg = Keg.new(d) - newname_keg.unlink + newname_keg.unlink(verbose: verbose?) newname_keg.uninstall if new_cellar_existed end end @@ -396,16 +400,16 @@ class Migrator # create a keg using its old path if old_linked_keg_record begin - old_linked_keg.link + old_linked_keg.link(verbose: verbose?) rescue Keg::LinkError - old_linked_keg.unlink + old_linked_keg.unlink(verbose: verbose?) raise rescue Keg::AlreadyLinkedError - old_linked_keg.unlink + old_linked_keg.unlink(verbose: verbose?) retry end else - old_linked_keg.optlink + old_linked_keg.optlink(verbose: verbose?) end end diff --git a/Library/Homebrew/reinstall.rb b/Library/Homebrew/reinstall.rb index 27301429fa..96234cb04f 100644 --- a/Library/Homebrew/reinstall.rb +++ b/Library/Homebrew/reinstall.rb @@ -49,7 +49,7 @@ module Homebrew rescue FormulaInstallationAlreadyAttemptedError nil rescue Exception # rubocop:disable Lint/RescueException - ignore_interrupts { restore_backup(keg, keg_was_linked) } + ignore_interrupts { restore_backup(keg, keg_was_linked, verbose: args.verbose?) } raise else begin @@ -82,7 +82,7 @@ module Homebrew Pathname.new(keg).rmtree if keg.exist? path.rename keg - keg.link if keg_was_linked + keg.link(verbose: verbose) if keg_was_linked end def backup_path(path) diff --git a/Library/Homebrew/test/keg_spec.rb b/Library/Homebrew/test/keg_spec.rb index 2df44f9b1e..060ceb2d42 100644 --- a/Library/Homebrew/test/keg_spec.rb +++ b/Library/Homebrew/test/keg_spec.rb @@ -21,7 +21,6 @@ describe Keg do let(:dst) { HOMEBREW_PREFIX/"bin"/"helloworld" } let(:nonexistent) { Pathname.new("/some/nonexistent/path") } - let(:mode) { OpenStruct.new } let!(:keg) { setup_test_keg("foo", "1.0") } let(:kegs) { [] } @@ -84,11 +83,11 @@ describe Keg do end context "with dry run set to true" do - it "only prints what would be done" do - mode.dry_run = true + let(:options) { { dry_run: true } } + it "only prints what would be done" do expect { - expect(keg.link(mode)).to eq(0) + expect(keg.link(**options)).to eq(0) }.to output(<<~EOF).to_stdout #{HOMEBREW_PREFIX}/bin/goodbye_cruel_world #{HOMEBREW_PREFIX}/bin/helloworld @@ -119,27 +118,27 @@ describe Keg do end context "with overwrite set to true" do + let(:options) { { overwrite: true } } + it "overwrite existing files" do touch dst - mode.overwrite = true - expect(keg.link(mode)).to eq(3) + expect(keg.link(**options)).to eq(3) expect(keg).to be_linked end it "overwrites broken symlinks" do dst.make_symlink "nowhere" - mode.overwrite = true - expect(keg.link(mode)).to eq(3) + expect(keg.link(**options)).to eq(3) expect(keg).to be_linked end it "still supports dryrun" do touch dst - mode.overwrite = true - mode.dry_run = true + + options[:dry_run] = true expect { - expect(keg.link(mode)).to eq(0) + expect(keg.link(**options)).to eq(0) }.to output(<<~EOF).to_stdout #{dst} EOF diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index 06e314380f..e7e8f70d60 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -26,7 +26,7 @@ module Homebrew end formulae_to_install.each do |f| - Migrator.migrate_if_needed(f, force: args.force?) + Migrator.migrate_if_needed(f, force: args.force?, verbose: args.verbose?) begin upgrade_formula(f, args: args) Cleanup.install_formula_clean!(f) From bace9ecc34777ad393822b00d405d14bf6c04dbf Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 06:05:53 +0200 Subject: [PATCH 11/18] Pass `verbose?` to `Formula#verify_download_integrity`. --- Library/Homebrew/build.rb | 8 +++++- Library/Homebrew/cmd/fetch.rb | 4 +-- Library/Homebrew/formula.rb | 41 ++++++++++++++++++--------- Library/Homebrew/formula_installer.rb | 6 ++-- Library/Homebrew/patch.rb | 4 +-- Library/Homebrew/resource.rb | 21 ++++++++------ Library/Homebrew/software_spec.rb | 4 +-- Library/Homebrew/test.rb | 4 ++- 8 files changed, 59 insertions(+), 33 deletions(-) diff --git a/Library/Homebrew/build.rb b/Library/Homebrew/build.rb index 1db5f8b290..303fd943a3 100644 --- a/Library/Homebrew/build.rb +++ b/Library/Homebrew/build.rb @@ -139,7 +139,13 @@ class Build formula.update_head_version - formula.brew(fetch: false, keep_tmp: args.keep_tmp?, interactive: args.interactive?, debug: args.debug?) do + formula.brew( + fetch: false, + keep_tmp: args.keep_tmp?, + interactive: args.interactive?, + debug: args.debug?, + verbose: args.verbose?, + ) do # For head builds, HOMEBREW_FORMULA_PREFIX should include the commit, # which is not known until after the formula has been staged. ENV["HOMEBREW_FORMULA_PREFIX"] = formula.prefix diff --git a/Library/Homebrew/cmd/fetch.rb b/Library/Homebrew/cmd/fetch.rb index 93fb6ff6b9..2b14a2a0f7 100644 --- a/Library/Homebrew/cmd/fetch.rb +++ b/Library/Homebrew/cmd/fetch.rb @@ -133,7 +133,7 @@ module Homebrew already_fetched = f.cached_download.exist? begin - download = f.fetch(verify_download_integrity: false) + download = f.fetch(verify_download_integrity: false, verbose: args.verbose?) rescue DownloadError retry if retry_fetch?(f, args: args) raise @@ -144,6 +144,6 @@ module Homebrew puts "Downloaded to: #{download}" unless already_fetched puts Checksum::TYPES.map { |t| "#{t.to_s.upcase}: #{download.send(t)}" } - f.verify_download_integrity(download) + f.verify_download_integrity(download, verbose: args.verbose?) end end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index c2d75a9aaf..03b7a5ec5c 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -57,6 +57,7 @@ class Formula extend Enumerable extend Forwardable extend Cachable + extend Predicable # @!method inreplace(paths, before = nil, after = nil) # Actually implemented in {Utils::Inreplace.inreplace}. @@ -1167,17 +1168,22 @@ class Formula patchlist.each(&:apply) end + # @private + attr_predicate :debug?, :verbose? + # yields |self,staging| with current working directory set to the uncompressed tarball # where staging is a Mktemp staging context # @private - def brew(fetch: true, keep_tmp: false, interactive: false, debug: false) + def brew(fetch: true, keep_tmp: false, interactive: false, debug: false, verbose: false) + @debug = debug + @verbose = verbose @prefix_returns_versioned_prefix = true active_spec.fetch if fetch stage(interactive: interactive) do |staging| staging.retain! if keep_tmp prepare_patches - fetch_patches if fetch + fetch_patches(verbose: verbose) if fetch begin yield self, staging @@ -1189,6 +1195,8 @@ class Formula end end ensure + @debug = nil + @verbose = nil @prefix_returns_versioned_prefix = false end @@ -1793,17 +1801,19 @@ class Formula end # @private - def fetch(verify_download_integrity: true) - active_spec.fetch(verify_download_integrity: verify_download_integrity) + def fetch(verify_download_integrity: true, verbose: false) + active_spec.fetch(verify_download_integrity: verify_download_integrity, verbose: verbose) end # @private - def verify_download_integrity(fn) - active_spec.verify_download_integrity(fn) + def verify_download_integrity(fn, verbose: false) + active_spec.verify_download_integrity(fn, verbose: verbose) end # @private - def run_test(keep_tmp: false, debug: false) + def run_test(keep_tmp: false, debug: false, verbose: false) + @debug = debug + @verbose = verbose @prefix_returns_versioned_prefix = true test_env = { @@ -1836,8 +1846,10 @@ class Formula end end ensure - @testpath = nil + @debug = nil + @verbose = nil @prefix_returns_versioned_prefix = false + @testpath = nil end # @private @@ -1927,13 +1939,12 @@ class Formula # # If there is a "make", "install" available, please use it! # system "make", "install" def system(cmd, *args) - verbose = Homebrew.args.verbose? verbose_using_dots = Homebrew::EnvConfig.verbose_using_dots? # remove "boring" arguments so that the important ones are more likely to # be shown considering that we trim long ohai lines to the terminal width pretty_args = args.dup - unless verbose + unless verbose? case cmd when "./configure" pretty_args -= %w[--disable-dependency-tracking --disable-debug --disable-silent-rules] @@ -1961,7 +1972,7 @@ class Formula log.puts Time.now, "", cmd, args, "" log.flush - if verbose + if verbose? rd, wr = IO.pipe begin pid = fork do @@ -2004,7 +2015,7 @@ class Formula log_lines = Homebrew::EnvConfig.fail_log_lines log.flush - if !verbose || verbose_using_dots + if !verbose? || verbose_using_dots puts "Last #{log_lines} lines from #{logfn}:" Kernel.system "/usr/bin/tail", "-n", log_lines, logfn end @@ -2092,8 +2103,10 @@ class Formula ENV.update(removed) end - def fetch_patches - patchlist.select(&:external?).each(&:fetch) + def fetch_patches(verbose: false) + patchlist.select(&:external?).each do |p| + p.fetch(verbose: verbose) + end end private diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 8603dbfb89..b0a2c61888 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -1027,8 +1027,10 @@ class FormulaInstaller end return if pour_bottle? - formula.fetch_patches - formula.resources.each(&:fetch) + formula.fetch_patches(verbose: verbose?) + formula.resources.each do |r| + r.fetch(verbose: verbose?) + end downloader.fetch end diff --git a/Library/Homebrew/patch.rb b/Library/Homebrew/patch.rb index f2a92a0616..009b34c672 100644 --- a/Library/Homebrew/patch.rb +++ b/Library/Homebrew/patch.rb @@ -179,12 +179,12 @@ class LegacyPatch < ExternalPatch resource.download_strategy = CurlDownloadStrategy end - def fetch + def fetch(verbose: false) clear_cache super end - def verify_download_integrity(_fn) + def verify_download_integrity(_fn, verbose: false) # no-op end diff --git a/Library/Homebrew/resource.rb b/Library/Homebrew/resource.rb index 4b00e4ea3a..8d15dfb0c6 100644 --- a/Library/Homebrew/resource.rb +++ b/Library/Homebrew/resource.rb @@ -74,9 +74,10 @@ class Resource def stage(target = nil, &block) raise ArgumentError, "target directory or block is required" if !target && block.blank? + verbose = owner.owner.verbose? prepare_patches - fetch_patches(skip_downloaded: true) - fetch unless downloaded? + fetch_patches(skip_downloaded: true, verbose: verbose) + fetch(verbose: owner.owner.verbose?) unless downloaded? unpack(target, &block) end @@ -85,10 +86,12 @@ class Resource patches.grep(DATAPatch) { |p| p.path = owner.owner.path } end - def fetch_patches(skip_downloaded: false) + def fetch_patches(skip_downloaded: false, verbose: false) external_patches = patches.select(&:external?) external_patches.reject!(&:downloaded?) if skip_downloaded - external_patches.each(&:fetch) + external_patches.each do |p| + p.fetch(verbose: verbose) + end end def apply_patches @@ -122,10 +125,10 @@ class Resource Partial.new(self, files) end - def fetch(verify_download_integrity: true) + def fetch(verify_download_integrity: true, verbose: false) HOMEBREW_CACHE.mkpath - fetch_patches + fetch_patches(verbose: verbose) begin downloader.fetch @@ -134,13 +137,13 @@ class Resource end download = cached_download - verify_download_integrity(download) if verify_download_integrity + verify_download_integrity(download, verbose: verbose) if verify_download_integrity download end - def verify_download_integrity(fn) + def verify_download_integrity(fn, verbose: false) if fn.file? - ohai "Verifying #{fn.basename} checksum" if Homebrew.args.verbose? + ohai "Verifying #{fn.basename} checksum" if verbose fn.verify_checksum(checksum) end rescue ChecksumMissingError diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb index 170b4e5d8f..f9a80f1e3e 100644 --- a/Library/Homebrew/software_spec.rb +++ b/Library/Homebrew/software_spec.rb @@ -239,8 +239,8 @@ class HeadSoftwareSpec < SoftwareSpec @resource.version = Version.create("HEAD") end - def verify_download_integrity(_fn) - nil + def verify_download_integrity(_fn, verbose: false) + # no-op end end diff --git a/Library/Homebrew/test.rb b/Library/Homebrew/test.rb index dfc73862ef..9a3d4107b7 100644 --- a/Library/Homebrew/test.rb +++ b/Library/Homebrew/test.rb @@ -34,7 +34,9 @@ begin # tests can also return false to indicate failure Timeout.timeout TEST_TIMEOUT_SECONDS do - raise "test returned false" if formula.run_test(keep_tmp: args.keep_tmp?, debug: args.debug?) == false + if formula.run_test(keep_tmp: args.keep_tmp?, debug: args.debug?, verbose: args.verbose?) == false + raise "test returned false" + end end rescue Exception => e # rubocop:disable Lint/RescueException error_pipe.puts e.to_json From 62671b1703c8fb8fd17d5548ff2f21df43678fd7 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 13:46:52 +0200 Subject: [PATCH 12/18] Remove wrong test. --- Library/Homebrew/test/rubocops/lines_spec.rb | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/Library/Homebrew/test/rubocops/lines_spec.rb b/Library/Homebrew/test/rubocops/lines_spec.rb index 46d24fab94..404617524b 100644 --- a/Library/Homebrew/test/rubocops/lines_spec.rb +++ b/Library/Homebrew/test/rubocops/lines_spec.rb @@ -821,18 +821,6 @@ describe RuboCop::Cop::FormulaAudit::Miscellaneous do RUBY end - it "Using ARGV to check options" do - expect_no_offenses(<<~RUBY) - class Foo < Formula - desc "foo" - url 'https://brew.sh/foo-1.0.tgz' - def install - verbose = Homebrew.args.verbose? - end - end - RUBY - end - it 'man+"man8" usage' do expect_offense(<<~RUBY) class Foo < Formula From 9d6350037f52989e880f62fa116fd4c73b04f1f4 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 14:07:49 +0200 Subject: [PATCH 13/18] Use `try` instead of `send`. --- Library/Homebrew/cli/parser.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Library/Homebrew/cli/parser.rb b/Library/Homebrew/cli/parser.rb index 7d414e07d0..c034f63024 100644 --- a/Library/Homebrew/cli/parser.rb +++ b/Library/Homebrew/cli/parser.rb @@ -88,9 +88,7 @@ module Homebrew def env?(env) return false if env.blank? - Homebrew::EnvConfig.send("#{env}?") - rescue NoMethodError - false + Homebrew::EnvConfig.try(:"#{env}?") end def usage_banner(text) From 490e503b1b6977cfd9d7580058e12a2d4d3c964a Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 14:32:31 +0200 Subject: [PATCH 14/18] Replace `Homebrew.args` with `Context`. --- Library/Homebrew/bintray.rb | 9 +-- Library/Homebrew/brew.rb | 1 + Library/Homebrew/build.rb | 5 +- Library/Homebrew/cask/cmd.rb | 4 +- Library/Homebrew/cleaner.rb | 8 +-- Library/Homebrew/cli/args.rb | 4 ++ Library/Homebrew/cmd/fetch.rb | 4 +- Library/Homebrew/cmd/install.rb | 2 +- Library/Homebrew/cmd/migrate.rb | 2 +- Library/Homebrew/cmd/outdated.rb | 10 +-- Library/Homebrew/cmd/reinstall.rb | 2 +- Library/Homebrew/cmd/update-report.rb | 2 +- Library/Homebrew/context.rb | 71 +++++++++++++++++++ Library/Homebrew/dev-cmd/mirror.rb | 2 +- Library/Homebrew/dev-cmd/pr-pull.rb | 2 +- Library/Homebrew/dev-cmd/pr-upload.rb | 2 +- Library/Homebrew/dev-cmd/unpack.rb | 2 +- Library/Homebrew/download_strategy.rb | 29 ++++---- Library/Homebrew/extend/pathname.rb | 6 +- Library/Homebrew/formula.rb | 42 +++++------ Library/Homebrew/formula_assertions.rb | 6 +- Library/Homebrew/formula_installer.rb | 8 +-- Library/Homebrew/formula_versions.rb | 4 +- Library/Homebrew/formulary.rb | 6 +- Library/Homebrew/global.rb | 3 +- Library/Homebrew/migrator.rb | 16 ++--- Library/Homebrew/os/mac/keg.rb | 4 +- Library/Homebrew/patch.rb | 4 +- Library/Homebrew/postinstall.rb | 2 +- Library/Homebrew/resource.rb | 22 +++--- Library/Homebrew/software_spec.rb | 2 +- Library/Homebrew/system_command.rb | 16 +++-- Library/Homebrew/test.rb | 8 +-- .../test/system_command_result_spec.rb | 4 +- Library/Homebrew/upgrade.rb | 2 +- Library/Homebrew/utils.rb | 16 +++-- Library/Homebrew/utils/analytics.rb | 4 +- Library/Homebrew/utils/curl.rb | 2 +- 38 files changed, 203 insertions(+), 135 deletions(-) create mode 100644 Library/Homebrew/context.rb diff --git a/Library/Homebrew/bintray.rb b/Library/Homebrew/bintray.rb index 455419795f..5d4b05f36a 100644 --- a/Library/Homebrew/bintray.rb +++ b/Library/Homebrew/bintray.rb @@ -4,6 +4,8 @@ require "utils/curl" require "json" class Bintray + include Context + API_URL = "https://api.bintray.com" class Error < RuntimeError @@ -13,9 +15,8 @@ class Bintray "#" end - def initialize(org: "homebrew", verbose: false) + def initialize(org: "homebrew") @bintray_org = org - @verbose = verbose raise UsageError, "Must set a Bintray organisation!" unless @bintray_org @@ -33,8 +34,8 @@ class Bintray end curl(*args, url, - show_output: @verbose, - secrets: @bintray_key) + show_output: verbose?, + secrets: key) end def upload(local_file, repo:, package:, version:, remote_file:, sha256: nil) diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index 22d959459a..719b39f18e 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -61,6 +61,7 @@ begin args = Homebrew::CLI::Parser.new.parse(ARGV.dup.freeze, ignore_invalid_options: true) Homebrew.args = args + Context.current = args.context path = PATH.new(ENV["PATH"]) homebrew_path = PATH.new(ENV["HOMEBREW_PATH"]) diff --git a/Library/Homebrew/build.rb b/Library/Homebrew/build.rb index 303fd943a3..51b20093da 100644 --- a/Library/Homebrew/build.rb +++ b/Library/Homebrew/build.rb @@ -143,8 +143,6 @@ class Build fetch: false, keep_tmp: args.keep_tmp?, interactive: args.interactive?, - debug: args.debug?, - verbose: args.verbose?, ) do # For head builds, HOMEBREW_FORMULA_PREFIX should include the commit, # which is not known until after the formula has been staged. @@ -214,9 +212,8 @@ class Build end begin - Homebrew.args = Homebrew::CLI::Parser.new.parse(ARGV.dup.freeze, ignore_invalid_options: true) - args = Homebrew.install_args.parse + Context.current = args.context error_pipe = UNIXSocket.open(ENV["HOMEBREW_ERROR_PIPE"], &:recv_io) error_pipe.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) diff --git a/Library/Homebrew/cask/cmd.rb b/Library/Homebrew/cask/cmd.rb index 63ae4c5fa1..b3d4b5e33a 100644 --- a/Library/Homebrew/cask/cmd.rb +++ b/Library/Homebrew/cask/cmd.rb @@ -35,6 +35,8 @@ require "cask/cmd/internal_stanza" module Cask class Cmd + include Context + ALIASES = { "ls" => "list", "homepage" => "home", @@ -154,7 +156,7 @@ module Cask end rescue CaskError, MethodDeprecatedError, ArgumentError, OptionParser::InvalidOption => e onoe e.message - $stderr.puts e.backtrace if Homebrew.args.debug? + $stderr.puts e.backtrace if debug? exit 1 rescue StandardError, ScriptError, NoMemoryError => e onoe e.message diff --git a/Library/Homebrew/cleaner.rb b/Library/Homebrew/cleaner.rb index e011af9094..651662a7c9 100644 --- a/Library/Homebrew/cleaner.rb +++ b/Library/Homebrew/cleaner.rb @@ -10,15 +10,11 @@ # * sets permissions on executables # * removes unresolved symlinks class Cleaner - extend Predicable - - attr_predicate :verbose?, :debug? + include Context # Create a cleaner for the given formula - def initialize(f, verbose: false, debug: false) + def initialize(f) @f = f - @verbose = verbose - @debug = debug end # Clean the keg of formula @f diff --git a/Library/Homebrew/cli/args.rb b/Library/Homebrew/cli/args.rb index f9d7adef1f..a67d0e7d10 100644 --- a/Library/Homebrew/cli/args.rb +++ b/Library/Homebrew/cli/args.rb @@ -188,6 +188,10 @@ module Homebrew flag_with_value.delete_prefix(arg_prefix) end + def context + Context::ContextStruct.new(debug: debug?, quiet: quiet?, verbose: verbose?) + end + private def option_to_name(option) diff --git a/Library/Homebrew/cmd/fetch.rb b/Library/Homebrew/cmd/fetch.rb index 2b14a2a0f7..93fb6ff6b9 100644 --- a/Library/Homebrew/cmd/fetch.rb +++ b/Library/Homebrew/cmd/fetch.rb @@ -133,7 +133,7 @@ module Homebrew already_fetched = f.cached_download.exist? begin - download = f.fetch(verify_download_integrity: false, verbose: args.verbose?) + download = f.fetch(verify_download_integrity: false) rescue DownloadError retry if retry_fetch?(f, args: args) raise @@ -144,6 +144,6 @@ module Homebrew puts "Downloaded to: #{download}" unless already_fetched puts Checksum::TYPES.map { |t| "#{t.to_s.upcase}: #{download.send(t)}" } - f.verify_download_integrity(download, verbose: args.verbose?) + f.verify_download_integrity(download) end end diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 8541406e35..efb73358d6 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -258,7 +258,7 @@ module Homebrew Install.perform_preinstall_checks(cc: args.cc) formulae.each do |f| - Migrator.migrate_if_needed(f, force: args.force?, verbose: args.verbose?) + Migrator.migrate_if_needed(f, force: args.force?) install_formula(f, args: args) Cleanup.install_formula_clean!(f) end diff --git a/Library/Homebrew/cmd/migrate.rb b/Library/Homebrew/cmd/migrate.rb index 158404a48c..c6f12d7831 100644 --- a/Library/Homebrew/cmd/migrate.rb +++ b/Library/Homebrew/cmd/migrate.rb @@ -33,7 +33,7 @@ module Homebrew raise "#{rack} is a symlink" if rack.symlink? end - migrator = Migrator.new(f, force: args.force?, verbose: args.verbose?) + migrator = Migrator.new(f, force: args.force?) migrator.migrate end end diff --git a/Library/Homebrew/cmd/outdated.rb b/Library/Homebrew/cmd/outdated.rb index a3366b7564..c6fe50c200 100644 --- a/Library/Homebrew/cmd/outdated.rb +++ b/Library/Homebrew/cmd/outdated.rb @@ -94,7 +94,7 @@ module Homebrew if formula_or_cask.is_a?(Formula) f = formula_or_cask - if verbose? args: args + if verbose? outdated_kegs = f.outdated_kegs(fetch_head: args.fetch_HEAD?) current_version = if f.alias_changed? @@ -122,7 +122,7 @@ module Homebrew else c = formula_or_cask - puts c.outdated_info(args.greedy?, verbose?(args: args), false) + puts c.outdated_info(args.greedy?, verbose?, false) end end end @@ -147,13 +147,13 @@ module Homebrew else c = formula_or_cask - c.outdated_info(args.greedy?, verbose?(args: args), true) + c.outdated_info(args.greedy?, verbose?, true) end end end - def verbose?(args:) - ($stdout.tty? || args.verbose?) && !args.quiet? + def verbose? + ($stdout.tty? || super) && !quiet? end def json_version(version) diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 2de30916ce..cd57578a13 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -67,7 +67,7 @@ module Homebrew onoe "#{f.full_name} is pinned. You must unpin it to reinstall." next end - Migrator.migrate_if_needed(f, force: args.force?, verbose: args.verbose?) + Migrator.migrate_if_needed(f, force: args.force?) reinstall_formula(f, args: args) Cleanup.install_formula_clean!(f) end diff --git a/Library/Homebrew/cmd/update-report.rb b/Library/Homebrew/cmd/update-report.rb index 94d6b6cb89..6760897cc1 100644 --- a/Library/Homebrew/cmd/update-report.rb +++ b/Library/Homebrew/cmd/update-report.rb @@ -395,7 +395,7 @@ class Reporter next end - Migrator.migrate_if_needed(f, force: force, verbose: verbose) + Migrator.migrate_if_needed(f, force: force) end end diff --git a/Library/Homebrew/context.rb b/Library/Homebrew/context.rb new file mode 100644 index 0000000000..c8c70ac7b8 --- /dev/null +++ b/Library/Homebrew/context.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +require "monitor" + +module Context + extend MonitorMixin + + def self.current=(context) + synchronize do + @current = context + end + end + + def self.current + if current_context = Thread.current[:context] + return current_context + end + + synchronize do + @current ||= ContextStruct.new + end + end + + class ContextStruct + def initialize(debug: nil, quiet: nil, verbose: nil) + @debug = debug + @quiet = quiet + @verbose = verbose + end + + def debug? + @debug + end + + def quiet? + @quiet + end + + def verbose? + @verbose + end + end + + def debug? + Context.current.debug? + end + + def quiet? + Context.current.quiet? + end + + def verbose? + Context.current.verbose? + end + + def with_context(**options) + old_context = Thread.current[:context] + + new_context = ContextStruct.new( + debug: options.fetch(:debug, old_context&.debug?), + quiet: options.fetch(:quiet, old_context&.quiet?), + verbose: options.fetch(:verbose, old_context&.verbose?), + ) + + Thread.current[:context] = new_context + + yield + ensure + Thread.current[:context] = old_context + end +end diff --git a/Library/Homebrew/dev-cmd/mirror.rb b/Library/Homebrew/dev-cmd/mirror.rb index 3de9a3c1a2..832707227a 100644 --- a/Library/Homebrew/dev-cmd/mirror.rb +++ b/Library/Homebrew/dev-cmd/mirror.rb @@ -31,7 +31,7 @@ module Homebrew bintray_org = args.bintray_org || "homebrew" bintray_repo = args.bintray_repo || "mirror" - bintray = Bintray.new(org: bintray_org, verbose: args.verbose?) + bintray = Bintray.new(org: bintray_org) args.formulae.each do |formula| mirror_url = bintray.mirror_formula(formula, repo: bintray_repo, publish_package: !args.no_publish?) diff --git a/Library/Homebrew/dev-cmd/pr-pull.rb b/Library/Homebrew/dev-cmd/pr-pull.rb index 28ae197fac..052e5dbdbc 100644 --- a/Library/Homebrew/dev-cmd/pr-pull.rb +++ b/Library/Homebrew/dev-cmd/pr-pull.rb @@ -116,7 +116,7 @@ module Homebrew # git cherry-pick unfortunately has no quiet option ohai "Cherry-picking #{commit_count} commit#{"s" unless commit_count == 1} from ##{pr}" cherry_pick_args = "git", "-C", path, "cherry-pick", "--ff", "--allow-empty", "#{merge_base}..FETCH_HEAD" - result = Homebrew.args.verbose? ? system(*cherry_pick_args) : quiet_system(*cherry_pick_args) + result = args.verbose? ? system(*cherry_pick_args) : quiet_system(*cherry_pick_args) unless result if args.resolve? diff --git a/Library/Homebrew/dev-cmd/pr-upload.rb b/Library/Homebrew/dev-cmd/pr-upload.rb index 40e0b9ff96..aa83627f63 100644 --- a/Library/Homebrew/dev-cmd/pr-upload.rb +++ b/Library/Homebrew/dev-cmd/pr-upload.rb @@ -49,7 +49,7 @@ module Homebrew args = pr_upload_args.parse bintray_org = args.bintray_org || "homebrew" - bintray = Bintray.new(org: bintray_org, verbose: args.verbose?) + bintray = Bintray.new(org: bintray_org) json_files = Dir["*.json"] odie "No JSON files found in the current working directory" if json_files.empty? diff --git a/Library/Homebrew/dev-cmd/unpack.rb b/Library/Homebrew/dev-cmd/unpack.rb index b72aa312bb..fbdd7c459e 100644 --- a/Library/Homebrew/dev-cmd/unpack.rb +++ b/Library/Homebrew/dev-cmd/unpack.rb @@ -57,7 +57,7 @@ module Homebrew # show messages about tar with_env VERBOSE: "1" do - f.brew(debug: args.debug?) do + f.brew do f.patch if args.patch? cp_r getwd, stage_dir, preserve: true end diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb index ce99d2845c..7afadb9c85 100644 --- a/Library/Homebrew/download_strategy.rb +++ b/Library/Homebrew/download_strategy.rb @@ -13,6 +13,7 @@ require "mechanize/http/content_disposition_parser" class AbstractDownloadStrategy extend Forwardable include FileUtils + include Context module Pourable def stage @@ -21,9 +22,9 @@ class AbstractDownloadStrategy end end - attr_reader :cache, :cached_location, :url, :meta, :name, :version, :shutup + attr_reader :cache, :cached_location, :url, :meta, :name, :version - private :meta, :name, :version, :shutup + private :meta, :name, :version def initialize(url, name, version, **meta) @url = url @@ -31,24 +32,18 @@ class AbstractDownloadStrategy @version = version @cache = meta.fetch(:cache, HOMEBREW_CACHE) @meta = meta - @shutup = false extend Pourable if meta[:bottle] end # Download and cache the resource as {#cached_location}. def fetch; end - # Suppress output - def shutup! - @shutup = true - end - def puts(*args) - super(*args) unless shutup + super(*args) unless quiet? end def ohai(*args) - super(*args) unless shutup + super(*args) unless quiet? end # Unpack {#cached_location} into the current working directory, and possibly @@ -60,7 +55,7 @@ class AbstractDownloadStrategy ref_type: @ref_type, ref: @ref) .extract_nestedly(basename: basename, prioritise_extension: true, - verbose: Homebrew.args.verbose? && !shutup) + verbose: verbose? && !quiet?) chdir end @@ -102,9 +97,9 @@ class AbstractDownloadStrategy def system_command!(*args, **options) super( *args, - print_stdout: !shutup, - print_stderr: !shutup, - verbose: Homebrew.args.verbose? && !shutup, + print_stdout: !quiet?, + print_stderr: !quiet?, + verbose: verbose? && !quiet?, env: env, **options, ) @@ -498,7 +493,7 @@ class NoUnzipCurlDownloadStrategy < CurlDownloadStrategy def stage UnpackStrategy::Uncompressed.new(cached_location) .extract(basename: basename, - verbose: Homebrew.args.verbose? && !shutup) + verbose: verbose? && !quiet?) end end @@ -553,7 +548,7 @@ class SubversionDownloadStrategy < VCSDownloadStrategy # This saves on bandwidth and will have a similar effect to verifying the # cache as it will make any changes to get the right revision. args = [] - args << "--quiet" unless Homebrew.args.verbose? + args << "--quiet" unless verbose? if revision ohai "Checking out #{@ref}" @@ -897,7 +892,7 @@ class CVSDownloadStrategy < VCSDownloadStrategy end def quiet_flag - "-Q" unless Homebrew.args.verbose? + "-Q" unless verbose? end def clone_repo diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb index 63023593ca..fb3ddd9659 100644 --- a/Library/Homebrew/extend/pathname.rb +++ b/Library/Homebrew/extend/pathname.rb @@ -419,6 +419,8 @@ require "extend/os/pathname" # @private module ObserverPathnameExtension class << self + include Context + attr_accessor :n, :d def reset_counts! @@ -437,8 +439,8 @@ module ObserverPathnameExtension MAXIMUM_VERBOSE_OUTPUT = 100 def verbose? - return Homebrew.args.verbose? unless ENV["CI"] - return false unless Homebrew.args.verbose? + return super unless ENV["CI"] + return false unless super if total < MAXIMUM_VERBOSE_OUTPUT true diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 03b7a5ec5c..5849baaa20 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -54,6 +54,7 @@ class Formula include Utils::Inreplace include Utils::Shebang include Utils::Shell + include Context extend Enumerable extend Forwardable extend Cachable @@ -537,8 +538,10 @@ class Formula return false unless head&.downloader.is_a?(VCSDownloadStrategy) downloader = head.downloader - downloader.shutup! unless Homebrew.args.verbose? - downloader.commit_outdated?(version.version.commit) + + with_context quiet: true do + downloader.commit_outdated?(version.version.commit) + end end # The latest prefix for this formula. Checks for {#head}, then {#devel} @@ -1168,35 +1171,28 @@ class Formula patchlist.each(&:apply) end - # @private - attr_predicate :debug?, :verbose? - # yields |self,staging| with current working directory set to the uncompressed tarball # where staging is a Mktemp staging context # @private - def brew(fetch: true, keep_tmp: false, interactive: false, debug: false, verbose: false) - @debug = debug - @verbose = verbose + def brew(fetch: true, keep_tmp: false, interactive: false) @prefix_returns_versioned_prefix = true active_spec.fetch if fetch stage(interactive: interactive) do |staging| staging.retain! if keep_tmp prepare_patches - fetch_patches(verbose: verbose) if fetch + fetch_patches if fetch begin yield self, staging rescue - staging.retain! if interactive || debug + staging.retain! if interactive || debug? raise ensure cp Dir["config.log", "CMakeCache.txt"], logs end end ensure - @debug = nil - @verbose = nil @prefix_returns_versioned_prefix = false end @@ -1801,19 +1797,17 @@ class Formula end # @private - def fetch(verify_download_integrity: true, verbose: false) - active_spec.fetch(verify_download_integrity: verify_download_integrity, verbose: verbose) + def fetch(verify_download_integrity: true) + active_spec.fetch(verify_download_integrity: verify_download_integrity) end # @private - def verify_download_integrity(fn, verbose: false) - active_spec.verify_download_integrity(fn, verbose: verbose) + def verify_download_integrity(fn) + active_spec.verify_download_integrity(fn) end # @private - def run_test(keep_tmp: false, debug: false, verbose: false) - @debug = debug - @verbose = verbose + def run_test(keep_tmp: false) @prefix_returns_versioned_prefix = true test_env = { @@ -1841,13 +1835,11 @@ class Formula end end rescue Exception # rubocop:disable Lint/RescueException - staging.retain! if debug + staging.retain! if debug? raise end end ensure - @debug = nil - @verbose = nil @prefix_returns_versioned_prefix = false @testpath = nil end @@ -2103,10 +2095,8 @@ class Formula ENV.update(removed) end - def fetch_patches(verbose: false) - patchlist.select(&:external?).each do |p| - p.fetch(verbose: verbose) - end + def fetch_patches + patchlist.select(&:external?).each(&:fetch) end private diff --git a/Library/Homebrew/formula_assertions.rb b/Library/Homebrew/formula_assertions.rb index acb428ae98..55592f2214 100644 --- a/Library/Homebrew/formula_assertions.rb +++ b/Library/Homebrew/formula_assertions.rb @@ -2,6 +2,8 @@ module Homebrew module Assertions + include Context + require "test/unit/assertions" include ::Test::Unit::Assertions @@ -12,7 +14,7 @@ module Homebrew assert_equal result, $CHILD_STATUS.exitstatus output rescue Test::Unit::AssertionFailedError - puts output if Homebrew.args.verbose? + puts output if verbose? raise end @@ -28,7 +30,7 @@ module Homebrew assert_equal result, $CHILD_STATUS.exitstatus unless result.nil? output rescue Test::Unit::AssertionFailedError - puts output if Homebrew.args.verbose? + puts output if verbose? raise end end diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index b0a2c61888..06d5db08b8 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -952,7 +952,7 @@ class FormulaInstaller def clean ohai "Cleaning" if verbose? - Cleaner.new(formula, verbose: verbose?, debug: debug?).clean + Cleaner.new(formula).clean rescue Exception => e # rubocop:disable Lint/RescueException opoo "The cleaning step did not complete successfully" puts "Still, the installation was successful, so we will link it into your prefix" @@ -1027,10 +1027,8 @@ class FormulaInstaller end return if pour_bottle? - formula.fetch_patches(verbose: verbose?) - formula.resources.each do |r| - r.fetch(verbose: verbose?) - end + formula.fetch_patches + formula.resources.each(&:fetch) downloader.fetch end diff --git a/Library/Homebrew/formula_versions.rb b/Library/Homebrew/formula_versions.rb index 5805213c8b..d6503bd22b 100644 --- a/Library/Homebrew/formula_versions.rb +++ b/Library/Homebrew/formula_versions.rb @@ -3,6 +3,8 @@ require "formula" class FormulaVersions + include Context + IGNORED_EXCEPTIONS = [ ArgumentError, NameError, SyntaxError, TypeError, FormulaSpecificationError, FormulaValidationError, @@ -44,7 +46,7 @@ class FormulaVersions rescue *IGNORED_EXCEPTIONS => e # We rescue these so that we can skip bad versions and # continue walking the history - odebug "#{e} in #{name} at revision #{rev}", e.backtrace if Homebrew.args.debug? + odebug "#{e} in #{name} at revision #{rev}", e.backtrace if debug? rescue FormulaUnavailableError nil ensure diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 80600d7e34..ce3d098cf9 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -109,6 +109,8 @@ module Formulary # A FormulaLoader returns instances of formulae. # Subclasses implement loaders for particular sources of formulae. class FormulaLoader + include Context + # The formula's name attr_reader :name # The formula's ruby file's path or filename @@ -138,7 +140,7 @@ module Formulary private def load_file(flags:) - $stderr.puts "#{$PROGRAM_NAME} (#{self.class.name}): loading #{path}" if Homebrew.args.debug? + $stderr.puts "#{$PROGRAM_NAME} (#{self.class.name}): loading #{path}" if debug? raise FormulaUnavailableError, name unless path.file? Formulary.load_formula_from_path(name, path, flags: flags) @@ -314,7 +316,7 @@ module Formulary end def klass(flags:) - $stderr.puts "#{$PROGRAM_NAME} (#{self.class.name}): loading #{path}" if Homebrew.args.debug? + $stderr.puts "#{$PROGRAM_NAME} (#{self.class.name}): loading #{path}" if debug? namespace = "FormulaNamespace#{Digest::MD5.hexdigest(contents.to_s)}" Formulary.load_formula(name, path, contents, namespace, flags: flags) end diff --git a/Library/Homebrew/global.rb b/Library/Homebrew/global.rb index b100822fc0..9276582221 100644 --- a/Library/Homebrew/global.rb +++ b/Library/Homebrew/global.rb @@ -37,7 +37,6 @@ require "config" require "os" require "cli/args" require "messages" -require "system_command" HOMEBREW_PRODUCT = ENV["HOMEBREW_PRODUCT"] HOMEBREW_VERSION = ENV["HOMEBREW_VERSION"] @@ -116,6 +115,7 @@ end.compact.freeze require "set" +require "context" require "extend/pathname" require "extend/module" @@ -125,6 +125,7 @@ require "active_support/core_ext/object/blank" require "active_support/core_ext/hash/deep_merge" require "active_support/core_ext/file/atomic" +require "system_command" require "exceptions" require "utils" diff --git a/Library/Homebrew/migrator.rb b/Library/Homebrew/migrator.rb index 9309e8a084..e0903aa48f 100644 --- a/Library/Homebrew/migrator.rb +++ b/Library/Homebrew/migrator.rb @@ -5,7 +5,7 @@ require "keg" require "tab" class Migrator - extend Predicable + include Context class MigrationNeededError < RuntimeError def initialize(formula) @@ -88,8 +88,6 @@ class Migrator # path to newname keg that will be linked if old_linked_keg isn't nil attr_reader :new_linked_keg_record - attr_predicate :verbose? - def self.needs_migration?(formula) oldname = formula.oldname return false unless oldname @@ -101,20 +99,18 @@ class Migrator true end - def self.migrate_if_needed(formula, force:, verbose:) + def self.migrate_if_needed(formula, force:) return unless Migrator.needs_migration?(formula) begin - migrator = Migrator.new(formula, force: force, verbose: verbose) + migrator = Migrator.new(formula, force: force) migrator.migrate rescue => e onoe e end end - def initialize(formula, force: false, verbose: false) - @verbose = verbose - + def initialize(formula, force: false) @oldname = formula.oldname @newname = formula.name raise MigratorNoOldnameError, formula unless oldname @@ -215,7 +211,7 @@ class Migrator rescue Exception => e # rubocop:disable Lint/RescueException onoe "Error occurred while migrating." puts e - puts e.backtrace if Homebrew.args.debug? + puts e.backtrace if debug? puts "Backing up..." ignore_interrupts { backup_oldname } ensure @@ -322,7 +318,7 @@ class Migrator rescue Exception => e # rubocop:disable Lint/RescueException onoe "An unexpected error occurred during linking" puts e - puts e.backtrace if Homebrew.args.debug? + puts e.backtrace if debug? ignore_interrupts { new_keg.unlink(verbose: verbose?) } raise end diff --git a/Library/Homebrew/os/mac/keg.rb b/Library/Homebrew/os/mac/keg.rb index 90593712ff..0782226c00 100644 --- a/Library/Homebrew/os/mac/keg.rb +++ b/Library/Homebrew/os/mac/keg.rb @@ -5,7 +5,7 @@ class Keg return if file.dylib_id == id @require_relocation = true - odebug "Changing dylib ID of #{file}\n from #{file.dylib_id}\n to #{id}" if Homebrew.args.debug? + odebug "Changing dylib ID of #{file}\n from #{file.dylib_id}\n to #{id}" MachO::Tools.change_dylib_id(file, id, strict: false) rescue MachO::MachOError onoe <<~EOS @@ -20,7 +20,7 @@ class Keg return if old == new @require_relocation = true - odebug "Changing install name in #{file}\n from #{old}\n to #{new}" if Homebrew.args.debug? + odebug "Changing install name in #{file}\n from #{old}\n to #{new}" MachO::Tools.change_install_name(file, old, new, strict: false) rescue MachO::MachOError onoe <<~EOS diff --git a/Library/Homebrew/patch.rb b/Library/Homebrew/patch.rb index 009b34c672..f2a92a0616 100644 --- a/Library/Homebrew/patch.rb +++ b/Library/Homebrew/patch.rb @@ -179,12 +179,12 @@ class LegacyPatch < ExternalPatch resource.download_strategy = CurlDownloadStrategy end - def fetch(verbose: false) + def fetch clear_cache super end - def verify_download_integrity(_fn, verbose: false) + def verify_download_integrity(_fn) # no-op end diff --git a/Library/Homebrew/postinstall.rb b/Library/Homebrew/postinstall.rb index 557fd3387a..d6ae171797 100644 --- a/Library/Homebrew/postinstall.rb +++ b/Library/Homebrew/postinstall.rb @@ -17,7 +17,7 @@ begin trap("INT", old_trap) formula = args.resolved_formulae.first - formula.extend(Debrew::Formula) if Homebrew.args.debug? + formula.extend(Debrew::Formula) if args.debug? formula.run_post_install rescue Exception => e # rubocop:disable Lint/RescueException error_pipe.puts e.to_json diff --git a/Library/Homebrew/resource.rb b/Library/Homebrew/resource.rb index 8d15dfb0c6..b76bd703fa 100644 --- a/Library/Homebrew/resource.rb +++ b/Library/Homebrew/resource.rb @@ -9,6 +9,7 @@ require "mktemp" # primary formula download, along with other declared resources, are instances # of this class. class Resource + include Context include FileUtils attr_reader :mirrors, :specs, :using, :source_modified_time, :patches, :owner @@ -74,10 +75,9 @@ class Resource def stage(target = nil, &block) raise ArgumentError, "target directory or block is required" if !target && block.blank? - verbose = owner.owner.verbose? prepare_patches - fetch_patches(skip_downloaded: true, verbose: verbose) - fetch(verbose: owner.owner.verbose?) unless downloaded? + fetch_patches(skip_downloaded: true) + fetch unless downloaded? unpack(target, &block) end @@ -86,12 +86,10 @@ class Resource patches.grep(DATAPatch) { |p| p.path = owner.owner.path } end - def fetch_patches(skip_downloaded: false, verbose: false) + def fetch_patches(skip_downloaded: false) external_patches = patches.select(&:external?) external_patches.reject!(&:downloaded?) if skip_downloaded - external_patches.each do |p| - p.fetch(verbose: verbose) - end + external_patches.each(&:fetch) end def apply_patches @@ -125,10 +123,10 @@ class Resource Partial.new(self, files) end - def fetch(verify_download_integrity: true, verbose: false) + def fetch(verify_download_integrity: true) HOMEBREW_CACHE.mkpath - fetch_patches(verbose: verbose) + fetch_patches begin downloader.fetch @@ -137,13 +135,13 @@ class Resource end download = cached_download - verify_download_integrity(download, verbose: verbose) if verify_download_integrity + verify_download_integrity(download) if verify_download_integrity download end - def verify_download_integrity(fn, verbose: false) + def verify_download_integrity(fn) if fn.file? - ohai "Verifying #{fn.basename} checksum" if verbose + ohai "Verifying #{fn.basename} checksum" if verbose? fn.verify_checksum(checksum) end rescue ChecksumMissingError diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb index f9a80f1e3e..91ff124c09 100644 --- a/Library/Homebrew/software_spec.rb +++ b/Library/Homebrew/software_spec.rb @@ -239,7 +239,7 @@ class HeadSoftwareSpec < SoftwareSpec @resource.version = Version.create("HEAD") end - def verify_download_integrity(_fn, verbose: false) + def verify_download_integrity(_fn) # no-op end end diff --git a/Library/Homebrew/system_command.rb b/Library/Homebrew/system_command.rb index 3db2429ab0..c0e91059a1 100644 --- a/Library/Homebrew/system_command.rb +++ b/Library/Homebrew/system_command.rb @@ -8,7 +8,6 @@ require "shellwords" require "extend/io" require "extend/hash_validator" using HashValidator -require "extend/predicable" module Kernel def system_command(*args) @@ -21,6 +20,7 @@ module Kernel end class SystemCommand + include Context extend Predicable attr_reader :pid @@ -34,7 +34,7 @@ class SystemCommand end def run! - puts redact_secrets(command.shelljoin.gsub('\=', "="), @secrets) if verbose? || Homebrew.args.debug? + puts redact_secrets(command.shelljoin.gsub('\=', "="), @secrets) if verbose? || debug? @output = [] @@ -84,7 +84,13 @@ class SystemCommand attr_reader :executable, :args, :input, :options, :env - attr_predicate :sudo?, :print_stdout?, :print_stderr?, :verbose?, :must_succeed? + attr_predicate :sudo?, :print_stdout?, :print_stderr?, :must_succeed? + + def verbose? + return super if @verbose.nil? + + @verbose + end def env_args set_variables = env.reject { |_, value| value.nil? } @@ -160,6 +166,8 @@ class SystemCommand end class Result + include Context + attr_accessor :command, :status, :exit_status def initialize(command, output, status, secrets:) @@ -222,7 +230,7 @@ class SystemCommand end def warn_plist_garbage(garbage) - return unless Homebrew.args.verbose? + return unless verbose? return unless garbage.match?(/\S/) opoo "Received non-XML output from #{Formatter.identifier(command.first)}:" diff --git a/Library/Homebrew/test.rb b/Library/Homebrew/test.rb index 9a3d4107b7..a175ca0637 100644 --- a/Library/Homebrew/test.rb +++ b/Library/Homebrew/test.rb @@ -16,9 +16,9 @@ require "dev-cmd/test" TEST_TIMEOUT_SECONDS = 5 * 60 begin - Homebrew.args = Homebrew::CLI::Parser.new.parse(ARGV.dup.freeze, ignore_invalid_options: true) - args = Homebrew.test_args.parse + Context.current = args.context + error_pipe = UNIXSocket.open(ENV["HOMEBREW_ERROR_PIPE"], &:recv_io) error_pipe.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) @@ -34,9 +34,7 @@ begin # tests can also return false to indicate failure Timeout.timeout TEST_TIMEOUT_SECONDS do - if formula.run_test(keep_tmp: args.keep_tmp?, debug: args.debug?, verbose: args.verbose?) == false - raise "test returned false" - end + raise "test returned false" if formula.run_test(keep_tmp: args.keep_tmp?) == false end rescue Exception => e # rubocop:disable Lint/RescueException error_pipe.puts e.to_json diff --git a/Library/Homebrew/test/system_command_result_spec.rb b/Library/Homebrew/test/system_command_result_spec.rb index a424661c39..bc48fcdd75 100644 --- a/Library/Homebrew/test/system_command_result_spec.rb +++ b/Library/Homebrew/test/system_command_result_spec.rb @@ -120,7 +120,7 @@ describe SystemCommand::Result do context "when verbose" do before do - allow(Homebrew).to receive(:args).and_return(OpenStruct.new("verbose?" => true)) + allow(Context).to receive(:current).and_return(Context::ContextStruct.new(verbose: true)) end it "warns about garbage" do @@ -144,7 +144,7 @@ describe SystemCommand::Result do context "when verbose" do before do - allow(Homebrew).to receive(:args).and_return(OpenStruct.new("verbose?" => true)) + allow(Context).to receive(:current).and_return(Context::ContextStruct.new(verbose: true)) end it "warns about garbage" do diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index e7e8f70d60..06e314380f 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -26,7 +26,7 @@ module Homebrew end formulae_to_install.each do |f| - Migrator.migrate_if_needed(f, force: args.force?, verbose: args.verbose?) + Migrator.migrate_if_needed(f, force: args.force?) begin upgrade_formula(f, args: args) Cleanup.install_formula_clean!(f) diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index fce6709031..0c4068c89e 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -16,6 +16,8 @@ require "tap_constants" require "time" module Homebrew + extend Context + module_function def _system(cmd, *args, **options) @@ -34,7 +36,7 @@ module Homebrew end def system(cmd, *args, **options) - if Homebrew.args.verbose? + if verbose? puts "#{cmd} #{args * " "}".gsub(RUBY_PATH, "ruby") .gsub($LOAD_PATH.join(File::PATH_SEPARATOR).to_s, "$LOAD_PATH") end @@ -89,7 +91,7 @@ module Kernel verbose = if respond_to?(:verbose?) verbose? else - Homebrew.args.verbose? + Context.current.verbose? end title = Tty.truncate(title) if $stdout.tty? && !verbose @@ -102,10 +104,10 @@ module Kernel end def odebug(title, *sput, always_display: false) - debug = if respond_to?(:debug?) + debug = if respond_to?(:debug) debug? else - Homebrew.args.debug? + Context.current.debug? end return unless debug || always_display @@ -118,7 +120,7 @@ module Kernel verbose = if respond_to?(:verbose?) verbose? else - Homebrew.args.verbose? + Context.current.verbose? end title = Tty.truncate(title) if $stdout.tty? && !verbose && truncate == :auto @@ -387,12 +389,12 @@ module Kernel end def nostdout - if Homebrew.args.verbose? + if verbose? yield else begin out = $stdout.dup - $stdout.reopen("/dev/null") + $stdout.reopen(File::NULL) yield ensure $stdout.reopen(out) diff --git a/Library/Homebrew/utils/analytics.rb b/Library/Homebrew/utils/analytics.rb index 7921136a5c..8f0e7e0e4d 100644 --- a/Library/Homebrew/utils/analytics.rb +++ b/Library/Homebrew/utils/analytics.rb @@ -5,6 +5,8 @@ require "erb" module Utils module Analytics class << self + include Context + def report(type, metadata = {}) return if not_this_run? return if disabled? @@ -148,7 +150,7 @@ module Utils end def get_analytics(json, args:) - full_analytics = args.analytics? || Homebrew.args.verbose? + full_analytics = args.analytics? || verbose? ohai "Analytics" json["analytics"].each do |category, value| diff --git a/Library/Homebrew/utils/curl.rb b/Library/Homebrew/utils/curl.rb index e28265867e..2318579ee0 100644 --- a/Library/Homebrew/utils/curl.rb +++ b/Library/Homebrew/utils/curl.rb @@ -34,7 +34,7 @@ def curl_args(*extra_args, show_output: false, user_agent: :default) unless show_output args << "--fail" - args << "--progress-bar" unless Homebrew.args.verbose? + args << "--progress-bar" unless Context.current.verbose? args << "--verbose" if Homebrew::EnvConfig.curl_verbose? args << "--silent" unless $stdout.tty? end From 652480207979026e9db9ab5e19e69cbe636d6964 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Sun, 2 Aug 2020 15:36:05 +0200 Subject: [PATCH 15/18] Pass remaining args to `Help`. --- Library/Homebrew/brew.rb | 6 +++--- Library/Homebrew/cmd/help.rb | 4 ++-- Library/Homebrew/help.rb | 14 +++++++------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index 719b39f18e..d33b6948ab 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -104,8 +104,8 @@ begin # - if cmd is Cask, let Cask handle the help command instead if (empty_argv || help_flag) && cmd != "cask" require "help" - Homebrew::Help.help cmd, empty_argv: empty_argv - # `Homebrew.help` never returns, except for unknown commands. + Homebrew::Help.help cmd, remaining_args: args.remaining, empty_argv: empty_argv + # `Homebrew::Help.help` never returns, except for unknown commands. end if internal_cmd || Commands.external_ruby_v2_cmd_path(cmd) @@ -140,7 +140,7 @@ begin end rescue UsageError => e require "help" - Homebrew::Help.help cmd, usage_error: e.message + Homebrew::Help.help cmd, remaining_args: args.remaining, usage_error: e.message rescue SystemExit => e onoe "Kernel.exit" if args.debug? && !e.success? $stderr.puts e.backtrace if args.debug? diff --git a/Library/Homebrew/cmd/help.rb b/Library/Homebrew/cmd/help.rb index d75c424e1c..acd6849ca5 100644 --- a/Library/Homebrew/cmd/help.rb +++ b/Library/Homebrew/cmd/help.rb @@ -3,7 +3,7 @@ require "help" module Homebrew - def help(cmd = nil, flags = {}) - Help.help(cmd, flags) + def help + Help.help end end diff --git a/Library/Homebrew/help.rb b/Library/Homebrew/help.rb index 53c3e46d56..12283523d8 100644 --- a/Library/Homebrew/help.rb +++ b/Library/Homebrew/help.rb @@ -40,7 +40,7 @@ module Homebrew module Help module_function - def help(cmd = nil, empty_argv: false, usage_error: nil) + def help(cmd = nil, empty_argv: false, usage_error: nil, remaining_args: []) if cmd.nil? # Handle `brew` (no arguments). if empty_argv @@ -58,7 +58,7 @@ module Homebrew # Display command-specific (or generic) help in response to `UsageError`. if usage_error - $stderr.puts path ? command_help(cmd, path) : HOMEBREW_HELP + $stderr.puts path ? command_help(cmd, path, remaining_args: remaining_args) : HOMEBREW_HELP $stderr.puts onoe usage_error exit 1 @@ -68,16 +68,16 @@ module Homebrew return if path.nil? # Display help for internal command (or generic help if undocumented). - puts command_help(cmd, path) + puts command_help(cmd, path, remaining_args: remaining_args) exit 0 end - def command_help(cmd, path) + def command_help(cmd, path, remaining_args:) # Only some types of commands can have a parser. output = if Commands.valid_internal_cmd?(cmd) || Commands.valid_internal_dev_cmd?(cmd) || Commands.external_ruby_v2_cmd_path(cmd) - parser_help(path) + parser_help(path, remaining_args: remaining_args) end output ||= comment_help(path) @@ -90,13 +90,13 @@ module Homebrew output end - def parser_help(path) + def parser_help(path, remaining_args:) # Let OptionParser generate help text for commands which have a parser. cmd_parser = CLI::Parser.from_cmd_path(path) return unless cmd_parser # Try parsing arguments here in order to show formula options in help output. - cmd_parser.parse(Homebrew.args.remaining, ignore_invalid_options: true) + cmd_parser.parse(remaining_args, ignore_invalid_options: true) cmd_parser.generate_help_text end From 536c963274b73e5542aecad1ef40e12765597004 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Thu, 6 Aug 2020 16:14:07 +0200 Subject: [PATCH 16/18] Deprecate global `Homebrew.args`. --- Library/Homebrew/compat.rb | 2 ++ Library/Homebrew/compat/cli/parser.rb | 32 +++++++++++++++++++ .../Homebrew/compat/dependencies_helpers.rb | 17 ++++++++++ 3 files changed, 51 insertions(+) create mode 100644 Library/Homebrew/compat/cli/parser.rb create mode 100644 Library/Homebrew/compat/dependencies_helpers.rb diff --git a/Library/Homebrew/compat.rb b/Library/Homebrew/compat.rb index bc254d9e1c..d14810694a 100644 --- a/Library/Homebrew/compat.rb +++ b/Library/Homebrew/compat.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "compat/dependencies_helpers" +require "compat/cli/parser" require "compat/extend/nil" require "compat/extend/string" require "compat/formula" diff --git a/Library/Homebrew/compat/cli/parser.rb b/Library/Homebrew/compat/cli/parser.rb new file mode 100644 index 0000000000..fccec61a62 --- /dev/null +++ b/Library/Homebrew/compat/cli/parser.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Homebrew + module CLI + class Parser + module Compat + module DeprecatedArgs + def respond_to_missing?(*) + super + end + + def method_missing(method, *) + if ![:debug?, :quiet?, :verbose?].include?(method) && !@printed_args_warning + odeprecated "Homebrew.args", "`args = _args.parse` and pass `args` along the call chain" + @printed_args_warning = true + end + + super + end + end + + def parse(*) + args = super + Homebrew.args = args.dup.extend(DeprecatedArgs) + args + end + end + + prepend Compat + end + end +end diff --git a/Library/Homebrew/compat/dependencies_helpers.rb b/Library/Homebrew/compat/dependencies_helpers.rb new file mode 100644 index 0000000000..095c891011 --- /dev/null +++ b/Library/Homebrew/compat/dependencies_helpers.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require "cli/args" + +module DependenciesHelpers + module Compat + def argv_includes_ignores(argv = nil) + unless @printed_includes_ignores_warning + odeprecated "Homebrew.argv_includes_ignores", "Homebrew.args_includes_ignores" + @printed_includes_ignores_warning = true + end + args_includes_ignores(argv ? Homebrew::CLI::Args.new : Homebrew.args) + end + end + + prepend Compat +end From 5d3881e1ab7b539925188b1a49f01ba33bbb02fb Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Thu, 6 Aug 2020 16:17:38 +0200 Subject: [PATCH 17/18] Don't skip RuboCop on non-existent `ARGV` methods. --- Library/Homebrew/rubocops/lines.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Library/Homebrew/rubocops/lines.rb b/Library/Homebrew/rubocops/lines.rb index 552225fb5b..7996601dea 100644 --- a/Library/Homebrew/rubocops/lines.rb +++ b/Library/Homebrew/rubocops/lines.rb @@ -284,9 +284,7 @@ module RuboCop end end - find_instance_call(body_node, "ARGV") do |method_node| - next if [:debug?, :verbose?, :value].index(method_node.method_name) - + find_instance_call(body_node, "ARGV") do |_method_node| problem "Use build instead of ARGV to check options" end From 15358928187b2d041abf8a241b4fc851d3c68921 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Thu, 6 Aug 2020 16:18:28 +0200 Subject: [PATCH 18/18] Don't deprecate `Homebrew.args.value` yet. --- Library/Homebrew/compat/cli/parser.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/Homebrew/compat/cli/parser.rb b/Library/Homebrew/compat/cli/parser.rb index fccec61a62..ec330bb23c 100644 --- a/Library/Homebrew/compat/cli/parser.rb +++ b/Library/Homebrew/compat/cli/parser.rb @@ -10,7 +10,7 @@ module Homebrew end def method_missing(method, *) - if ![:debug?, :quiet?, :verbose?].include?(method) && !@printed_args_warning + if ![:debug?, :quiet?, :verbose?, :value].include?(method) && !@printed_args_warning odeprecated "Homebrew.args", "`args = _args.parse` and pass `args` along the call chain" @printed_args_warning = true end