aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike McQuaid2017-07-28 17:47:10 +0100
committerMike McQuaid2017-07-30 16:20:32 +0100
commit7ec05052003ecf6142d94aeaa62f4b4bd84a569d (patch)
tree061f2bcb21741dcfa0ae624e382b6193851742bc
parent05956781a27f754905084215ef8270d3f3d26fab (diff)
downloadbrew-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.rb8
-rw-r--r--Library/Homebrew/cmd/upgrade.rb3
-rw-r--r--Library/Homebrew/formula_installer.rb21
-rw-r--r--Library/Homebrew/test/bottle_hooks_spec.rb2
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