diff options
| author | Mike McQuaid | 2017-07-28 17:47:10 +0100 |
|---|---|---|
| committer | Mike McQuaid | 2017-07-30 16:20:32 +0100 |
| commit | 7ec05052003ecf6142d94aeaa62f4b4bd84a569d (patch) | |
| tree | 061f2bcb21741dcfa0ae624e382b6193851742bc | |
| parent | 05956781a27f754905084215ef8270d3f3d26fab (diff) | |
| download | brew-7ec05052003ecf6142d94aeaa62f4b4bd84a569d.tar.bz2 | |
Preserve link status on reinstall/upgrade.
This means if a user has manually `brew unlink` or `brew link --force`d
something then that status will be preserved after they `brew upgrade`
or `brew reinstall` that formula.
This generally should make things that are keg-only by default easier
to swallow.
| -rw-r--r-- | Library/Homebrew/cmd/reinstall.rb | 8 | ||||
| -rw-r--r-- | Library/Homebrew/cmd/upgrade.rb | 3 | ||||
| -rw-r--r-- | Library/Homebrew/formula_installer.rb | 21 | ||||
| -rw-r--r-- | Library/Homebrew/test/bottle_hooks_spec.rb | 2 |
4 files changed, 27 insertions, 7 deletions
diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 98160579e..4d42564c1 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -23,6 +23,7 @@ module Homebrew def reinstall_formula(f) if f.opt_prefix.directory? keg = Keg.new(f.opt_prefix.resolved_path) + keg_was_linked = keg.linked? backup keg end @@ -37,6 +38,7 @@ module Homebrew fi.build_bottle = ARGV.build_bottle? || (!f.bottled? && f.build.bottle?) fi.interactive = ARGV.interactive? fi.git = ARGV.git? + fi.keg_was_linked = keg_was_linked fi.prelude oh1 "Reinstalling #{f.full_name} #{options.to_a.join " "}" @@ -46,7 +48,7 @@ module Homebrew rescue FormulaInstallationAlreadyAttemptedError # next rescue Exception - ignore_interrupts { restore_backup(keg, f) } + ignore_interrupts { restore_backup(keg, keg_was_linked) } raise else backup_path(keg).rmtree if backup_path(keg).exist? @@ -57,7 +59,7 @@ module Homebrew keg.rename backup_path(keg) end - def restore_backup(keg, formula) + def restore_backup(keg, keg_was_linked) path = backup_path(keg) return unless path.directory? @@ -65,7 +67,7 @@ module Homebrew Pathname.new(keg).rmtree if keg.exist? path.rename keg - keg.link unless formula.keg_only? + keg.link if keg_was_linked end def backup_path(path) diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index 548c3b6ed..cb6e6a5ab 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -106,6 +106,7 @@ module Homebrew .map(&:linked_keg) .select(&:directory?) .map { |k| Keg.new(k.resolved_path) } + linked_kegs = outdated_kegs.select(&:linked?) if f.opt_prefix.directory? keg = Keg.new(f.opt_prefix.resolved_path) @@ -153,7 +154,7 @@ module Homebrew ensure # restore previous installation state if build failed begin - outdated_kegs.each(&:link) unless f.installed? + linked_kegs.each(&:link) unless f.installed? rescue nil end diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 9af8976bc..8e0b49802 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -37,10 +37,17 @@ class FormulaInstaller mode_attr_accessor :show_summary_heading, :show_header mode_attr_accessor :build_from_source, :force_bottle mode_attr_accessor :ignore_deps, :only_deps, :interactive, :git - mode_attr_accessor :verbose, :debug, :quieter + mode_attr_accessor :verbose, :debug, :quieter, :keg_was_linked def initialize(formula) @formula = formula + @rack_was_present = formula.rack.directory? + @keg_was_linked = if formula.linked_keg.directory? + keg = Keg.new(formula.linked_keg.resolved_path) + keg.linked? + else + false + end @show_header = false @ignore_deps = false @only_deps = false @@ -524,6 +531,7 @@ class FormulaInstaller if df.linked_keg.directory? linked_keg = Keg.new(df.linked_keg.resolved_path) + keg_was_linked = keg.linked? linked_keg.unlink end @@ -542,6 +550,7 @@ class FormulaInstaller fi.verbose = verbose? fi.quieter = quieter? fi.debug = debug? + fi.keg_was_linked = keg_was_linked fi.installed_as_dependency = true fi.installed_on_request = false fi.prelude @@ -551,7 +560,7 @@ class FormulaInstaller rescue Exception ignore_interrupts do tmp_keg.rename(installed_keg) if tmp_keg && !installed_keg.directory? - linked_keg.link if linked_keg + linked_keg.link if keg_was_linked end raise else @@ -712,7 +721,13 @@ class FormulaInstaller end def link(keg) - if formula.keg_only? + link_formula = if @rack_was_present + keg_was_linked? + else + !formula.keg_only? + end + + unless link_formula begin keg.optlink rescue Keg::LinkError => e diff --git a/Library/Homebrew/test/bottle_hooks_spec.rb b/Library/Homebrew/test/bottle_hooks_spec.rb index 913e3ffba..78ccfa47b 100644 --- a/Library/Homebrew/test/bottle_hooks_spec.rb +++ b/Library/Homebrew/test/bottle_hooks_spec.rb @@ -12,6 +12,8 @@ describe Homebrew::Hooks::Bottles do local_bottle_path: nil, bottle_disabled?: false, some_random_method: true, + linked_keg: Pathname("foo"), + rack: Pathname("bar"), ) end |
