diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 79e6b527ac..3dfd07d756 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -340,6 +340,7 @@ module Homebrew dependants = Upgrade.get_dependants( installed_formulae, flags: args.flags_only, + ask: args.ask?, installed_on_request: !args.as_dependency?, force_bottle: args.force_bottle?, build_from_source_formulae: args.build_from_source_formulae, @@ -353,17 +354,12 @@ module Homebrew dry_run: args.dry_run?, ) - formulae_dependencies = formulae_installer.flat_map do |f| - [f.formula, f.compute_dependencies.flatten.filter do |c| - c.is_a? Dependency - end.flat_map(&:to_formula)] - end.flatten.uniq - formulae_dependencies.concat(dependants.upgradeable) if dependants + formulae_dependencies = Install.get_hierarchy(formulae_installer, dependants) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_dependencies, args: args) end - Upgrade.upgrade_formulae(formulae_installer, + Install.install_formulae(formulae_installer, dry_run: args.dry_run?, verbose: args.verbose?) @@ -372,7 +368,7 @@ module Homebrew installed_formulae, flags: args.flags_only, dry_run: args.dry_run?, - ask: args.ask?, + installed_on_request: !args.as_dependency?, force_bottle: args.force_bottle?, build_from_source_formulae: args.build_from_source_formulae, interactive: args.interactive?, diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 2c1208e54a..4c6d2d27c6 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -130,16 +130,13 @@ module Homebrew unless formulae.empty? Install.perform_preinstall_checks_once - # If asking the user is enabled, show dependency and size information. - Install.ask_formulae(formulae, args: args) if args.ask? - - formulae.each do |formula| + formulae_keg = formulae.map do |formula| if formula.pinned? onoe "#{formula.full_name} is pinned. You must unpin it to reinstall." next end Migrator.migrate_if_needed(formula, force: args.force?) - Homebrew::Reinstall.reinstall_formula( + Homebrew::Reinstall.get_formula_to_reinstall( formula, flags: args.flags_only, force_bottle: args.force_bottle?, @@ -153,22 +150,81 @@ module Homebrew verbose: args.verbose?, git: args.git?, ) - Cleanup.install_formula_clean!(formula) end - Upgrade.check_installed_dependents( - formulae, - flags: args.flags_only, - force_bottle: args.force_bottle?, - build_from_source_formulae: args.build_from_source_formulae, - interactive: args.interactive?, - keep_tmp: args.keep_tmp?, - debug_symbols: args.debug_symbols?, - force: args.force?, - debug: args.debug?, - quiet: args.quiet?, - verbose: args.verbose?, - ) + if args.ask? + dependants = Upgrade.get_dependants( + formulae, + flags: args.flags_only, + ask: args.ask?, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + ) + + formulae_dependencies = formulae_keg.map(&:formula_installer) + + formulae_dependencies = Install.get_hierarchy(formulae_dependencies, dependants) + # Main block: if asking the user is enabled, show dependency and size information. + Install.ask_formulae(formulae_dependencies, args: args) + + end + + formulae_keg.each do |f| + Homebrew::Reinstall.reinstall_formula( + f, + flags: args.flags_only, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + git: args.git?, + ) + Cleanup.install_formula_clean!(f.formula) + end + + unless args.ask? + dependants = Upgrade.get_dependants( + formulae, + flags: args.flags_only, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + ) + end + + if dependants + Upgrade.upgrade_dependents( + dependants, formulae, + flags: args.flags_only, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose? + ) + end end if casks.any? diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index f6c6ae7e3b..80f987e905 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -253,12 +253,7 @@ module Homebrew verbose: args.verbose?, ) - formulae_dependencies = formulae_installer.flat_map do |f| - [f.formula, f.compute_dependencies.flatten.filter do |c| - c.is_a? Dependency - end.flat_map(&:to_formula)] - end.flatten.uniq - formulae_dependencies.concat(dependants.upgradeable) if dependants + formulae_dependencies = Install.get_hierarchy(formulae_installer, dependants) # Main block: if asking the user is enabled, show dependency and size information. Install.ask_formulae(formulae_dependencies, args: args) @@ -273,7 +268,6 @@ module Homebrew formulae_to_install, flags: args.flags_only, dry_run: args.dry_run?, - ask: args.ask?, force_bottle: args.force_bottle?, build_from_source_formulae: args.build_from_source_formulae, interactive: args.interactive?, diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb index bcf328c46d..2a2ecfb8ba 100644 --- a/Library/Homebrew/install.rb +++ b/Library/Homebrew/install.rb @@ -354,6 +354,16 @@ module Homebrew puts formula_names.join(" ") end + def get_hierarchy(formulae_installer, dependants) + formulae_dependencies = formulae_installer.flat_map do |f| + [f.formula, f.compute_dependencies.flatten.filter do |c| + c.is_a? Dependency + end.flat_map(&:to_formula)] + end.flatten.uniq + formulae_dependencies.concat(dependants.upgradeable) if dependants&.upgradeable + formulae_dependencies + end + # If asking the user is enabled, show dependency and size information. def ask_formulae(formulae, args:) return if formulae.empty? diff --git a/Library/Homebrew/reinstall.rb b/Library/Homebrew/reinstall.rb index b8260b1116..75e29ea0ac 100644 --- a/Library/Homebrew/reinstall.rb +++ b/Library/Homebrew/reinstall.rb @@ -7,7 +7,8 @@ require "messages" module Homebrew module Reinstall - def self.reinstall_formula( + Formula_keg = Struct.new(:formula_installer, :keg, :formula, :options) + def self.get_formula_to_reinstall( formula, flags:, force_bottle: false, @@ -61,16 +62,38 @@ module Homebrew verbose:, }.compact, ) - fi.prelude - fi.fetch + Formula_keg.new(fi, keg, formula, options) + end + + def self.reinstall_formula( + formula_keg, + flags:, + force_bottle: false, + build_from_source_formulae: [], + interactive: false, + keep_tmp: false, + debug_symbols: false, + force: false, + debug: false, + quiet: false, + verbose: false, + git: false + ) + formula_installer = formula_keg.formula_installer + keg = formula_keg.keg + formula = formula_keg.formula + options = formula_keg.options + link_keg = keg.linked? + formula_installer.prelude + formula_installer.fetch oh1 "Reinstalling #{Formatter.identifier(formula.full_name)} #{options.to_a.join " "}" - fi.install - fi.finish + formula_installer.install + formula_installer.finish rescue FormulaInstallationAlreadyAttemptedError nil - # Any other exceptions we want to restore the previous keg and report the error. + # Any other exceptions we want to restore the previous keg and report the error. rescue Exception # rubocop:disable Lint/RescueException ignore_interrupts { restore_backup(keg, link_keg, verbose:) } raise diff --git a/Library/Homebrew/upgrade.rb b/Library/Homebrew/upgrade.rb index 6bac1f4c7e..938a90522a 100644 --- a/Library/Homebrew/upgrade.rb +++ b/Library/Homebrew/upgrade.rb @@ -439,7 +439,7 @@ module Homebrew return if dry_run reinstallable_broken_dependents.each do |formula| - Reinstall.reinstall_formula( + formula_installer = Reinstall.get_formula_to_reinstall( formula, flags:, force_bottle:, @@ -452,6 +452,20 @@ module Homebrew quiet:, verbose:, ) + Reinstall.reinstall_formula( + formula_installer, + flags: args.flags_only, + force_bottle: args.force_bottle?, + build_from_source_formulae: args.build_from_source_formulae, + interactive: args.interactive?, + keep_tmp: args.keep_tmp?, + debug_symbols: args.debug_symbols?, + force: args.force?, + debug: args.debug?, + quiet: args.quiet?, + verbose: args.verbose?, + git: args.git?, + ) rescue FormulaInstallationAlreadyAttemptedError # We already attempted to reinstall f as part of the dependency tree of # another formula. In that case, don't generate an error, just move on.