Merge pull request #2961 from MikeMcQuaid/preserve-link-on-upgrade-reinstall

Preserve link status on reinstall/upgrade.
This commit is contained in:
Mike McQuaid 2017-07-30 18:42:06 +01:00 committed by GitHub
commit e1fd69de42
4 changed files with 27 additions and 7 deletions

View File

@ -23,6 +23,7 @@ module Homebrew
def reinstall_formula(f) def reinstall_formula(f)
if f.opt_prefix.directory? if f.opt_prefix.directory?
keg = Keg.new(f.opt_prefix.resolved_path) keg = Keg.new(f.opt_prefix.resolved_path)
keg_was_linked = keg.linked?
backup keg backup keg
end end
@ -37,6 +38,7 @@ module Homebrew
fi.build_bottle = ARGV.build_bottle? || (!f.bottled? && f.build.bottle?) fi.build_bottle = ARGV.build_bottle? || (!f.bottled? && f.build.bottle?)
fi.interactive = ARGV.interactive? fi.interactive = ARGV.interactive?
fi.git = ARGV.git? fi.git = ARGV.git?
fi.keg_was_linked = keg_was_linked
fi.prelude fi.prelude
oh1 "Reinstalling #{f.full_name} #{options.to_a.join " "}" oh1 "Reinstalling #{f.full_name} #{options.to_a.join " "}"
@ -46,7 +48,7 @@ module Homebrew
rescue FormulaInstallationAlreadyAttemptedError rescue FormulaInstallationAlreadyAttemptedError
# next # next
rescue Exception rescue Exception
ignore_interrupts { restore_backup(keg, f) } ignore_interrupts { restore_backup(keg, keg_was_linked) }
raise raise
else else
backup_path(keg).rmtree if backup_path(keg).exist? backup_path(keg).rmtree if backup_path(keg).exist?
@ -57,7 +59,7 @@ module Homebrew
keg.rename backup_path(keg) keg.rename backup_path(keg)
end end
def restore_backup(keg, formula) def restore_backup(keg, keg_was_linked)
path = backup_path(keg) path = backup_path(keg)
return unless path.directory? return unless path.directory?
@ -65,7 +67,7 @@ module Homebrew
Pathname.new(keg).rmtree if keg.exist? Pathname.new(keg).rmtree if keg.exist?
path.rename keg path.rename keg
keg.link unless formula.keg_only? keg.link if keg_was_linked
end end
def backup_path(path) def backup_path(path)

View File

@ -106,6 +106,7 @@ module Homebrew
.map(&:linked_keg) .map(&:linked_keg)
.select(&:directory?) .select(&:directory?)
.map { |k| Keg.new(k.resolved_path) } .map { |k| Keg.new(k.resolved_path) }
linked_kegs = outdated_kegs.select(&:linked?)
if f.opt_prefix.directory? if f.opt_prefix.directory?
keg = Keg.new(f.opt_prefix.resolved_path) keg = Keg.new(f.opt_prefix.resolved_path)
@ -153,7 +154,7 @@ module Homebrew
ensure ensure
# restore previous installation state if build failed # restore previous installation state if build failed
begin begin
outdated_kegs.each(&:link) unless f.installed? linked_kegs.each(&:link) unless f.installed?
rescue rescue
nil nil
end end

View File

@ -37,10 +37,17 @@ class FormulaInstaller
mode_attr_accessor :show_summary_heading, :show_header mode_attr_accessor :show_summary_heading, :show_header
mode_attr_accessor :build_from_source, :force_bottle mode_attr_accessor :build_from_source, :force_bottle
mode_attr_accessor :ignore_deps, :only_deps, :interactive, :git 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) def initialize(formula)
@formula = 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 @show_header = false
@ignore_deps = false @ignore_deps = false
@only_deps = false @only_deps = false
@ -525,6 +532,7 @@ class FormulaInstaller
if df.linked_keg.directory? if df.linked_keg.directory?
linked_keg = Keg.new(df.linked_keg.resolved_path) linked_keg = Keg.new(df.linked_keg.resolved_path)
keg_was_linked = keg.linked?
linked_keg.unlink linked_keg.unlink
end end
@ -543,6 +551,7 @@ class FormulaInstaller
fi.verbose = verbose? fi.verbose = verbose?
fi.quieter = quieter? fi.quieter = quieter?
fi.debug = debug? fi.debug = debug?
fi.keg_was_linked = keg_was_linked
fi.installed_as_dependency = true fi.installed_as_dependency = true
fi.installed_on_request = false fi.installed_on_request = false
fi.prelude fi.prelude
@ -552,7 +561,7 @@ class FormulaInstaller
rescue Exception rescue Exception
ignore_interrupts do ignore_interrupts do
tmp_keg.rename(installed_keg) if tmp_keg && !installed_keg.directory? 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 end
raise raise
else else
@ -713,7 +722,13 @@ class FormulaInstaller
end end
def link(keg) 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 begin
keg.optlink keg.optlink
rescue Keg::LinkError => e rescue Keg::LinkError => e

View File

@ -12,6 +12,8 @@ describe Homebrew::Hooks::Bottles do
local_bottle_path: nil, local_bottle_path: nil,
bottle_disabled?: false, bottle_disabled?: false,
some_random_method: true, some_random_method: true,
linked_keg: Pathname("foo"),
rack: Pathname("bar"),
) )
end end