From a7133d2a8d0668f1912dcae59027d0b86331823b Mon Sep 17 00:00:00 2001 From: Carlo Cabrera <30379873+carlocab@users.noreply.github.com> Date: Fri, 27 Aug 2021 18:00:43 +0800 Subject: [PATCH] cleanup: allow users to specify formulae to skip cleaning This allows users to set `HOMEBREW_NO_CLEANUP_FORMULAE` to a comma-separated list of formulae that `brew` will refuse to clean with `brew cleanup`. We currently allow a less granular version of this with `HOMEBREW_NO_INSTALL_CLEANUP`. All this changes is how much control users have over what is and isn't cleaned. Fixes #11924. --- Library/Homebrew/cleanup.rb | 21 ++++++++++++++++++--- Library/Homebrew/env_config.rb | 4 ++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/cleanup.rb b/Library/Homebrew/cleanup.rb index 0b4d91b9842b5..1f220c8ad205d 100644 --- a/Library/Homebrew/cleanup.rb +++ b/Library/Homebrew/cleanup.rb @@ -160,11 +160,18 @@ def self.install_formula_clean!(f) cleanup = Cleanup.new if cleanup.periodic_clean_due? cleanup.periodic_clean! - elsif f.latest_version_installed? + elsif f.latest_version_installed? && !cleanup.skip_clean_formula?(f) cleanup.cleanup_formula(f) end end + def skip_clean_formula?(f) + return false if Homebrew::EnvConfig.no_cleanup_formulae.blank? + + skip_clean_formulae = Homebrew::EnvConfig.no_cleanup_formulae.split(",") + skip_clean_formulae.include?(f.name) || (skip_clean_formulae & f.aliases).present? + end + def periodic_clean_due? return false if Homebrew::EnvConfig.no_install_cleanup? @@ -186,7 +193,10 @@ def periodic_clean! def clean!(quiet: false, periodic: false) if args.empty? - Formula.installed.sort_by(&:name).each do |formula| + Formula.installed + .sort_by(&:name) + .reject { |f| skip_clean_formula?(f) } + .each do |formula| cleanup_formula(formula, quiet: quiet, ds_store: false, cache_db: false) end cleanup_cache @@ -223,7 +233,12 @@ def clean!(quiet: false, periodic: false) nil end - cleanup_formula(formula) if formula + if formula && skip_clean_formula?(formula) + onoe "Refusing to clean #{formula} because it is listed in " \ + "#{Tty.bold}HOMEBREW_NO_CLEANUP_FORMULAE#{Tty.reset}!" + elsif formula + cleanup_formula(formula) + end cleanup_cask(cask) if cask end end diff --git a/Library/Homebrew/env_config.rb b/Library/Homebrew/env_config.rb index 233decbdf920f..2997c73d9f970 100644 --- a/Library/Homebrew/env_config.rb +++ b/Library/Homebrew/env_config.rb @@ -229,6 +229,10 @@ module EnvConfig "formulae.", boolean: true, }, + HOMEBREW_NO_CLEANUP_FORMULAE: { + description: "A comma-separated list of formulae. Homebrew will refuse to clean up a " \ + "formula if it appears on this list.", + }, HOMEBREW_NO_COLOR: { description: "If set, do not print text with colour added.", default_text: "`$NO_COLOR`.",