diff --git a/Library/Homebrew/cmd/untap.rb b/Library/Homebrew/cmd/untap.rb index 888d768e47..b8924c1eb6 100644 --- a/Library/Homebrew/cmd/untap.rb +++ b/Library/Homebrew/cmd/untap.rb @@ -25,7 +25,7 @@ module Homebrew args = untap_args.parse args.named.to_installed_taps.each do |tap| - odie "Untapping #{tap} is not allowed" if tap.core_tap? + odie "Untapping #{tap} is not allowed" if tap.core_tap? && !ENV["HOMEBREW_UNTAP_HOMEBREW_CORE"] installed_tap_formulae = Formula.installed.select { |formula| formula.tap == tap } installed_tap_casks = Cask::Caskroom.casks.select { |cask| cask.tap == tap } diff --git a/Library/Homebrew/cmd/update-report.rb b/Library/Homebrew/cmd/update-report.rb index cc83b687b6..88321d8f29 100644 --- a/Library/Homebrew/cmd/update-report.rb +++ b/Library/Homebrew/cmd/update-report.rb @@ -207,6 +207,7 @@ module Homebrew def install_core_tap_if_necessary return if ENV["HOMEBREW_UPDATE_TEST"] + return if ENV["HOMEBREW_UNTAP_HOMEBREW_CORE"] core_tap = CoreTap.instance return if core_tap.installed? diff --git a/Library/Homebrew/dependency.rb b/Library/Homebrew/dependency.rb index 7ac088dc16..2a37fe6671 100644 --- a/Library/Homebrew/dependency.rb +++ b/Library/Homebrew/dependency.rb @@ -46,6 +46,15 @@ class Dependency formula end + def unavailable_core_formula? + to_formula + false + rescue CoreTapFormulaUnavailableError + true + rescue + false + end + def installed? to_formula.latest_version_installed? end @@ -130,6 +139,8 @@ class Dependency def action(dependent, dep, &block) catch(:action) do + prune if dep.unavailable_core_formula? + if block yield dependent, dep elsif dep.optional? || dep.recommended? diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb index 06e58d3962..09765e0068 100644 --- a/Library/Homebrew/exceptions.rb +++ b/Library/Homebrew/exceptions.rb @@ -221,6 +221,13 @@ class TapFormulaUnavailableError < FormulaUnavailableError end end +# Raised when a formula in a the core tap is unavailable. +class CoreTapFormulaUnavailableError < TapFormulaUnavailableError + def initialize(name) + super CoreTap.instance, name + end +end + # Raised when a formula in a specific tap does not contain a formula class. class TapFormulaClassUnavailableError < TapFormulaUnavailableError include FormulaClassUnavailableErrorModule diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 867d7237ee..7934ef2e59 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -361,6 +361,10 @@ module Formulary end def get_formula(*) + if !CoreTap.instance.installed? && ENV["HOMEBREW_UNTAP_HOMEBREW_CORE"] + raise CoreTapFormulaUnavailableError, name + end + raise FormulaUnavailableError, name end end diff --git a/Library/Homebrew/tap.rb b/Library/Homebrew/tap.rb index ae604f1a72..aef4973d63 100644 --- a/Library/Homebrew/tap.rb +++ b/Library/Homebrew/tap.rb @@ -734,6 +734,7 @@ class CoreTap < Tap def self.ensure_installed! return if instance.installed? + return if ENV["HOMEBREW_UNTAP_HOMEBREW_CORE"] safe_system HOMEBREW_BREW_FILE, "tap", instance.name end @@ -748,9 +749,11 @@ class CoreTap < Tap end # @private - sig { void } - def uninstall - raise "Tap#uninstall is not available for CoreTap" + sig { params(manual: T::Boolean).void } + def uninstall(manual: false) + raise "Tap#uninstall is not available for CoreTap" unless ENV["HOMEBREW_UNTAP_HOMEBREW_CORE"] + + super end # @private