Pass verbose? to Keg#link, Keg#unlink and Keg#optlink.
This commit is contained in:
parent
e9d8f09da1
commit
6c964d4a78
@ -201,7 +201,7 @@ class Build
|
||||
else
|
||||
raise
|
||||
end
|
||||
Keg.new(path).optlink
|
||||
Keg.new(path).optlink(verbose: args.verbose?)
|
||||
rescue
|
||||
raise "#{f.opt_prefix} not present or broken\nPlease reinstall #{f.full_name}. Sorry :("
|
||||
end
|
||||
|
||||
@ -258,7 +258,7 @@ module Homebrew
|
||||
Install.perform_preinstall_checks(cc: args.cc)
|
||||
|
||||
formulae.each do |f|
|
||||
Migrator.migrate_if_needed(f, force: args.force?)
|
||||
Migrator.migrate_if_needed(f, force: args.force?, verbose: args.verbose?)
|
||||
install_formula(f, args: args)
|
||||
Cleanup.install_formula_clean!(f)
|
||||
end
|
||||
|
||||
@ -31,10 +31,11 @@ module Homebrew
|
||||
def link
|
||||
args = link_args.parse
|
||||
|
||||
mode = OpenStruct.new
|
||||
|
||||
mode.overwrite = true if args.overwrite?
|
||||
mode.dry_run = true if args.dry_run?
|
||||
options = {
|
||||
overwrite: args.overwrite?,
|
||||
dry_run: args.dry_run?,
|
||||
verbose: args.verbose?,
|
||||
}
|
||||
|
||||
args.kegs.each do |keg|
|
||||
keg_only = Formulary.keg_only?(keg.rack)
|
||||
@ -53,13 +54,13 @@ module Homebrew
|
||||
next
|
||||
end
|
||||
|
||||
if mode.dry_run
|
||||
if mode.overwrite
|
||||
if args.dry_run?
|
||||
if args.overwrite?
|
||||
puts "Would remove:"
|
||||
else
|
||||
puts "Would link:"
|
||||
end
|
||||
keg.link(mode)
|
||||
keg.link(**options)
|
||||
puts_keg_only_path_message(keg) if keg_only
|
||||
next
|
||||
end
|
||||
@ -89,7 +90,7 @@ module Homebrew
|
||||
puts if args.verbose?
|
||||
|
||||
begin
|
||||
n = keg.link(mode)
|
||||
n = keg.link(**options)
|
||||
rescue Keg::LinkError
|
||||
puts
|
||||
raise
|
||||
|
||||
@ -33,7 +33,7 @@ module Homebrew
|
||||
raise "#{rack} is a symlink" if rack.symlink?
|
||||
end
|
||||
|
||||
migrator = Migrator.new(f, force: args.force?)
|
||||
migrator = Migrator.new(f, force: args.force?, verbose: args.verbose?)
|
||||
migrator.migrate
|
||||
end
|
||||
end
|
||||
|
||||
@ -67,7 +67,7 @@ module Homebrew
|
||||
onoe "#{f.full_name} is pinned. You must unpin it to reinstall."
|
||||
next
|
||||
end
|
||||
Migrator.migrate_if_needed(f, force: args.force?)
|
||||
Migrator.migrate_if_needed(f, force: args.force?, verbose: args.verbose?)
|
||||
reinstall_formula(f, args: args)
|
||||
Cleanup.install_formula_clean!(f)
|
||||
end
|
||||
|
||||
@ -49,7 +49,7 @@ module Homebrew
|
||||
|
||||
# Link new version, if not keg-only
|
||||
if Formulary.keg_only?(rack)
|
||||
keg.optlink
|
||||
keg.optlink(verbose: args.verbose?)
|
||||
puts "Opt link created for #{keg}"
|
||||
else
|
||||
puts "#{keg.link} links created for #{keg}"
|
||||
|
||||
@ -26,20 +26,19 @@ module Homebrew
|
||||
def unlink
|
||||
args = unlink_args.parse
|
||||
|
||||
mode = OpenStruct.new
|
||||
mode.dry_run = true if args.dry_run?
|
||||
options = { dry_run: args.dry_run?, verbose: args.verbose? }
|
||||
|
||||
args.kegs.each do |keg|
|
||||
if mode.dry_run
|
||||
if args.dry_run?
|
||||
puts "Would remove:"
|
||||
keg.unlink(mode)
|
||||
keg.unlink(**options)
|
||||
next
|
||||
end
|
||||
|
||||
keg.lock do
|
||||
print "Unlinking #{keg}... "
|
||||
puts if args.verbose?
|
||||
puts "#{keg.unlink(mode)} symlinks removed"
|
||||
puts "#{keg.unlink(**options)} symlinks removed"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -120,7 +120,7 @@ module Homebrew
|
||||
else
|
||||
hub.dump(updated_formula_report: !args.preinstall?)
|
||||
hub.reporters.each(&:migrate_tap_migration)
|
||||
hub.reporters.each { |r| r.migrate_formula_rename(force: args.force?) }
|
||||
hub.reporters.each { |r| r.migrate_formula_rename(force: args.force?, verbose: args.verbose?) }
|
||||
CacheStoreDatabase.use(:descriptions) do |db|
|
||||
DescriptionCacheStore.new(db)
|
||||
.update_from_report!(hub)
|
||||
@ -371,7 +371,7 @@ class Reporter
|
||||
end
|
||||
end
|
||||
|
||||
def migrate_formula_rename(force:)
|
||||
def migrate_formula_rename(force:, verbose:)
|
||||
Formula.installed.each do |formula|
|
||||
next unless Migrator.needs_migration?(formula)
|
||||
|
||||
@ -395,7 +395,7 @@ class Reporter
|
||||
next
|
||||
end
|
||||
|
||||
Migrator.migrate_if_needed(f, force: force)
|
||||
Migrator.migrate_if_needed(f, force: force, verbose: verbose)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -662,7 +662,7 @@ class FormulaInstaller
|
||||
rescue Exception => e # rubocop:disable Lint/RescueException
|
||||
ignore_interrupts do
|
||||
tmp_keg.rename(installed_keg) if tmp_keg && !installed_keg.directory?
|
||||
linked_keg.link if keg_was_linked
|
||||
linked_keg.link(verbose: verbose?) if keg_was_linked
|
||||
end
|
||||
raise unless e.is_a? FormulaInstallationAlreadyAttemptedError
|
||||
|
||||
@ -842,7 +842,7 @@ class FormulaInstaller
|
||||
def link(keg)
|
||||
unless link_keg
|
||||
begin
|
||||
keg.optlink
|
||||
keg.optlink(verbose: verbose?)
|
||||
Formula.clear_cache
|
||||
rescue Keg::LinkError => e
|
||||
onoe "Failed to create #{formula.opt_prefix}"
|
||||
@ -873,7 +873,7 @@ class FormulaInstaller
|
||||
backup_dir = HOMEBREW_CACHE/"Backup"
|
||||
|
||||
begin
|
||||
keg.link
|
||||
keg.link(verbose: verbose?)
|
||||
rescue Keg::ConflictError => e
|
||||
conflict_file = e.dst
|
||||
if formula.link_overwrite?(conflict_file) && !link_overwrite_backup.key?(conflict_file)
|
||||
@ -888,8 +888,7 @@ class FormulaInstaller
|
||||
puts e
|
||||
puts
|
||||
puts "Possible conflicting files are:"
|
||||
mode = OpenStruct.new(dry_run: true, overwrite: true)
|
||||
keg.link(mode)
|
||||
keg.link(dry_run: true, overwrite: true, verbose: verbose?)
|
||||
@show_summary_heading = true
|
||||
Homebrew.failed = true
|
||||
rescue Keg::LinkError => e
|
||||
|
||||
@ -323,7 +323,7 @@ class Keg
|
||||
EOS
|
||||
end
|
||||
|
||||
def unlink(mode = OpenStruct.new)
|
||||
def unlink(**options)
|
||||
ObserverPathnameExtension.reset_counts!
|
||||
|
||||
dirs = []
|
||||
@ -341,7 +341,7 @@ class Keg
|
||||
next unless dst.symlink?
|
||||
next if src != dst.resolved_path
|
||||
|
||||
if mode.dry_run
|
||||
if options[:dry_run]
|
||||
puts dst
|
||||
Find.prune if src.directory?
|
||||
next
|
||||
@ -354,7 +354,7 @@ class Keg
|
||||
end
|
||||
end
|
||||
|
||||
unless mode.dry_run
|
||||
unless options[:dry_run]
|
||||
remove_linked_keg_record if linked?
|
||||
dirs.reverse_each(&:rmdir_if_possible)
|
||||
end
|
||||
@ -436,21 +436,21 @@ class Keg
|
||||
end
|
||||
end
|
||||
|
||||
def link(mode = OpenStruct.new)
|
||||
def link(**options)
|
||||
raise AlreadyLinkedError, self if linked_keg_record.directory?
|
||||
|
||||
ObserverPathnameExtension.reset_counts!
|
||||
|
||||
optlink(mode) unless mode.dry_run
|
||||
optlink(**options) unless options[:dry_run]
|
||||
|
||||
# yeah indeed, you have to force anything you need in the main tree into
|
||||
# these dirs REMEMBER that *NOT* everything needs to be in the main tree
|
||||
link_dir("etc", mode) { :mkpath }
|
||||
link_dir("bin", mode) { :skip_dir }
|
||||
link_dir("sbin", mode) { :skip_dir }
|
||||
link_dir("include", mode) { :link }
|
||||
link_dir("etc", **options) { :mkpath }
|
||||
link_dir("bin", **options) { :skip_dir }
|
||||
link_dir("sbin", **options) { :skip_dir }
|
||||
link_dir("include", **options) { :link }
|
||||
|
||||
link_dir("share", mode) do |relative_path|
|
||||
link_dir("share", **options) do |relative_path|
|
||||
case relative_path.to_s
|
||||
when "locale/locale.alias" then :skip_file
|
||||
when INFOFILE_RX then :info
|
||||
@ -468,7 +468,7 @@ class Keg
|
||||
end
|
||||
end
|
||||
|
||||
link_dir("lib", mode) do |relative_path|
|
||||
link_dir("lib", **options) do |relative_path|
|
||||
case relative_path.to_s
|
||||
when "charset.alias" then :skip_file
|
||||
# pkg-config database gets explicitly created
|
||||
@ -494,7 +494,7 @@ class Keg
|
||||
end
|
||||
end
|
||||
|
||||
link_dir("Frameworks", mode) do |relative_path|
|
||||
link_dir("Frameworks", **options) do |relative_path|
|
||||
# Frameworks contain symlinks pointing into a subdir, so we have to use
|
||||
# the :link strategy. However, for Foo.framework and
|
||||
# Foo.framework/Versions we have to use :mkpath so that multiple formulae
|
||||
@ -506,9 +506,9 @@ class Keg
|
||||
end
|
||||
end
|
||||
|
||||
make_relative_symlink(linked_keg_record, path, mode) unless mode.dry_run
|
||||
make_relative_symlink(linked_keg_record, path, **options) unless options[:dry_run]
|
||||
rescue LinkError
|
||||
unlink
|
||||
unlink(verbose: options[:verbose])
|
||||
raise
|
||||
else
|
||||
ObserverPathnameExtension.n
|
||||
@ -536,19 +536,19 @@ class Keg
|
||||
tab.aliases || []
|
||||
end
|
||||
|
||||
def optlink(mode = OpenStruct.new)
|
||||
def optlink(**options)
|
||||
opt_record.delete if opt_record.symlink? || opt_record.exist?
|
||||
make_relative_symlink(opt_record, path, mode)
|
||||
make_relative_symlink(opt_record, path, **options)
|
||||
aliases.each do |a|
|
||||
alias_opt_record = opt_record.parent/a
|
||||
alias_opt_record.delete if alias_opt_record.symlink? || alias_opt_record.exist?
|
||||
make_relative_symlink(alias_opt_record, path, mode)
|
||||
make_relative_symlink(alias_opt_record, path, **options)
|
||||
end
|
||||
|
||||
return unless oldname_opt_record
|
||||
|
||||
oldname_opt_record.delete
|
||||
make_relative_symlink(oldname_opt_record, path, mode)
|
||||
make_relative_symlink(oldname_opt_record, path, **options)
|
||||
end
|
||||
|
||||
def delete_pyc_files!
|
||||
@ -558,7 +558,7 @@ class Keg
|
||||
|
||||
private
|
||||
|
||||
def resolve_any_conflicts(dst, mode)
|
||||
def resolve_any_conflicts(dst, **options)
|
||||
return unless dst.symlink?
|
||||
|
||||
src = dst.resolved_path
|
||||
@ -571,7 +571,7 @@ class Keg
|
||||
stat = src.lstat
|
||||
rescue Errno::ENOENT
|
||||
# dst is a broken symlink, so remove it.
|
||||
dst.unlink unless mode.dry_run
|
||||
dst.unlink unless options[:dry_run]
|
||||
return
|
||||
end
|
||||
|
||||
@ -580,25 +580,23 @@ class Keg
|
||||
begin
|
||||
keg = Keg.for(src)
|
||||
rescue NotAKegError
|
||||
if Homebrew.args.verbose?
|
||||
puts "Won't resolve conflicts for symlink #{dst} as it doesn't resolve into the Cellar"
|
||||
end
|
||||
puts "Won't resolve conflicts for symlink #{dst} as it doesn't resolve into the Cellar" if options[:verbose]
|
||||
return
|
||||
end
|
||||
|
||||
dst.unlink unless mode.dry_run
|
||||
keg.link_dir(src, mode) { :mkpath }
|
||||
dst.unlink unless options[:dry_run]
|
||||
keg.link_dir(src, **options) { :mkpath }
|
||||
true
|
||||
end
|
||||
|
||||
def make_relative_symlink(dst, src, mode)
|
||||
def make_relative_symlink(dst, src, **options)
|
||||
if dst.symlink? && src == dst.resolved_path
|
||||
puts "Skipping; link already exists: #{dst}" if Homebrew.args.verbose?
|
||||
puts "Skipping; link already exists: #{dst}" if options[:verbose]
|
||||
return
|
||||
end
|
||||
|
||||
# cf. git-clean -n: list files to delete, don't really link or delete
|
||||
if mode.dry_run && mode.overwrite
|
||||
if options[:dry_run] && options[:overwrite]
|
||||
if dst.symlink?
|
||||
puts "#{dst} -> #{dst.resolved_path}"
|
||||
elsif dst.exist?
|
||||
@ -608,12 +606,12 @@ class Keg
|
||||
end
|
||||
|
||||
# list all link targets
|
||||
if mode.dry_run
|
||||
if options[:dry_run]
|
||||
puts dst
|
||||
return
|
||||
end
|
||||
|
||||
dst.delete if mode.overwrite && (dst.exist? || dst.symlink?)
|
||||
dst.delete if options[:overwrite] && (dst.exist? || dst.symlink?)
|
||||
dst.make_relative_symlink(src)
|
||||
rescue Errno::EEXIST => e
|
||||
raise ConflictError.new(self, src.relative_path_from(path), dst, e) if dst.exist?
|
||||
@ -631,7 +629,7 @@ class Keg
|
||||
protected
|
||||
|
||||
# symlinks the contents of path+relative_dir recursively into #{HOMEBREW_PREFIX}/relative_dir
|
||||
def link_dir(relative_dir, mode)
|
||||
def link_dir(relative_dir, **options)
|
||||
root = path/relative_dir
|
||||
return unless root.exist?
|
||||
|
||||
@ -655,10 +653,10 @@ class Keg
|
||||
when :info
|
||||
next if File.basename(src) == "dir" # skip historical local 'dir' files
|
||||
|
||||
make_relative_symlink dst, src, mode
|
||||
make_relative_symlink dst, src, **options
|
||||
dst.install_info
|
||||
else
|
||||
make_relative_symlink dst, src, mode
|
||||
make_relative_symlink dst, src, **options
|
||||
end
|
||||
elsif src.directory?
|
||||
# if the dst dir already exists, then great! walk the rest of the tree tho
|
||||
@ -672,10 +670,10 @@ class Keg
|
||||
when :skip_dir
|
||||
Find.prune
|
||||
when :mkpath
|
||||
dst.mkpath unless resolve_any_conflicts(dst, mode)
|
||||
dst.mkpath unless resolve_any_conflicts(dst, **options)
|
||||
else
|
||||
unless resolve_any_conflicts(dst, mode)
|
||||
make_relative_symlink dst, src, mode
|
||||
unless resolve_any_conflicts(dst, **options)
|
||||
make_relative_symlink dst, src, **options
|
||||
Find.prune
|
||||
end
|
||||
end
|
||||
|
||||
@ -5,6 +5,8 @@ require "keg"
|
||||
require "tab"
|
||||
|
||||
class Migrator
|
||||
extend Predicable
|
||||
|
||||
class MigrationNeededError < RuntimeError
|
||||
def initialize(formula)
|
||||
super <<~EOS
|
||||
@ -86,6 +88,8 @@ class Migrator
|
||||
# path to newname keg that will be linked if old_linked_keg isn't nil
|
||||
attr_reader :new_linked_keg_record
|
||||
|
||||
attr_predicate :verbose?
|
||||
|
||||
def self.needs_migration?(formula)
|
||||
oldname = formula.oldname
|
||||
return false unless oldname
|
||||
@ -97,18 +101,20 @@ class Migrator
|
||||
true
|
||||
end
|
||||
|
||||
def self.migrate_if_needed(formula, force:)
|
||||
def self.migrate_if_needed(formula, force:, verbose:)
|
||||
return unless Migrator.needs_migration?(formula)
|
||||
|
||||
begin
|
||||
migrator = Migrator.new(formula, force: force)
|
||||
migrator = Migrator.new(formula, force: force, verbose: verbose)
|
||||
migrator.migrate
|
||||
rescue => e
|
||||
onoe e
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(formula, force: false)
|
||||
def initialize(formula, force: false, verbose: false)
|
||||
@verbose = verbose
|
||||
|
||||
@oldname = formula.oldname
|
||||
@newname = formula.name
|
||||
raise MigratorNoOldnameError, formula unless oldname
|
||||
@ -267,7 +273,7 @@ class Migrator
|
||||
oh1 "Unlinking #{Formatter.identifier(oldname)}"
|
||||
old_cellar.subdirs.each do |d|
|
||||
keg = Keg.new(d)
|
||||
keg.unlink
|
||||
keg.unlink(verbose: verbose?)
|
||||
end
|
||||
end
|
||||
|
||||
@ -275,7 +281,7 @@ class Migrator
|
||||
oh1 "Temporarily unlinking #{Formatter.identifier(newname)}"
|
||||
new_cellar.subdirs.each do |d|
|
||||
keg = Keg.new(d)
|
||||
keg.unlink
|
||||
keg.unlink(verbose: verbose?)
|
||||
end
|
||||
end
|
||||
|
||||
@ -288,7 +294,7 @@ class Migrator
|
||||
# If formula is keg-only we also optlink it.
|
||||
if formula.keg_only? || !old_linked_keg_record
|
||||
begin
|
||||
new_keg.optlink
|
||||
new_keg.optlink(verbose: verbose?)
|
||||
rescue Keg::LinkError => e
|
||||
onoe "Failed to create #{formula.opt_prefix}"
|
||||
raise
|
||||
@ -299,15 +305,13 @@ class Migrator
|
||||
new_keg.remove_linked_keg_record if new_keg.linked?
|
||||
|
||||
begin
|
||||
mode = OpenStruct.new(overwrite: true)
|
||||
new_keg.link(mode)
|
||||
new_keg.link(overwrite: true, verbose: verbose?)
|
||||
rescue Keg::ConflictError => e
|
||||
onoe "Error while executing `brew link` step on #{newname}"
|
||||
puts e
|
||||
puts
|
||||
puts "Possible conflicting files are:"
|
||||
mode = OpenStruct.new(dry_run: true, overwrite: true)
|
||||
new_keg.link(mode)
|
||||
new_keg.link(dry_run: true, overwrite: true, verbose: verbose?)
|
||||
raise
|
||||
rescue Keg::LinkError => e
|
||||
onoe "Error while linking"
|
||||
@ -319,7 +323,7 @@ class Migrator
|
||||
onoe "An unexpected error occurred during linking"
|
||||
puts e
|
||||
puts e.backtrace if Homebrew.args.debug?
|
||||
ignore_interrupts { new_keg.unlink }
|
||||
ignore_interrupts { new_keg.unlink(verbose: verbose?) }
|
||||
raise
|
||||
end
|
||||
end
|
||||
@ -384,7 +388,7 @@ class Migrator
|
||||
if new_cellar.exist?
|
||||
new_cellar.subdirs.each do |d|
|
||||
newname_keg = Keg.new(d)
|
||||
newname_keg.unlink
|
||||
newname_keg.unlink(verbose: verbose?)
|
||||
newname_keg.uninstall if new_cellar_existed
|
||||
end
|
||||
end
|
||||
@ -396,16 +400,16 @@ class Migrator
|
||||
# create a keg using its old path
|
||||
if old_linked_keg_record
|
||||
begin
|
||||
old_linked_keg.link
|
||||
old_linked_keg.link(verbose: verbose?)
|
||||
rescue Keg::LinkError
|
||||
old_linked_keg.unlink
|
||||
old_linked_keg.unlink(verbose: verbose?)
|
||||
raise
|
||||
rescue Keg::AlreadyLinkedError
|
||||
old_linked_keg.unlink
|
||||
old_linked_keg.unlink(verbose: verbose?)
|
||||
retry
|
||||
end
|
||||
else
|
||||
old_linked_keg.optlink
|
||||
old_linked_keg.optlink(verbose: verbose?)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -49,7 +49,7 @@ module Homebrew
|
||||
rescue FormulaInstallationAlreadyAttemptedError
|
||||
nil
|
||||
rescue Exception # rubocop:disable Lint/RescueException
|
||||
ignore_interrupts { restore_backup(keg, keg_was_linked) }
|
||||
ignore_interrupts { restore_backup(keg, keg_was_linked, verbose: args.verbose?) }
|
||||
raise
|
||||
else
|
||||
begin
|
||||
@ -82,7 +82,7 @@ module Homebrew
|
||||
Pathname.new(keg).rmtree if keg.exist?
|
||||
|
||||
path.rename keg
|
||||
keg.link if keg_was_linked
|
||||
keg.link(verbose: verbose) if keg_was_linked
|
||||
end
|
||||
|
||||
def backup_path(path)
|
||||
|
||||
@ -21,7 +21,6 @@ describe Keg do
|
||||
|
||||
let(:dst) { HOMEBREW_PREFIX/"bin"/"helloworld" }
|
||||
let(:nonexistent) { Pathname.new("/some/nonexistent/path") }
|
||||
let(:mode) { OpenStruct.new }
|
||||
let!(:keg) { setup_test_keg("foo", "1.0") }
|
||||
let(:kegs) { [] }
|
||||
|
||||
@ -84,11 +83,11 @@ describe Keg do
|
||||
end
|
||||
|
||||
context "with dry run set to true" do
|
||||
it "only prints what would be done" do
|
||||
mode.dry_run = true
|
||||
let(:options) { { dry_run: true } }
|
||||
|
||||
it "only prints what would be done" do
|
||||
expect {
|
||||
expect(keg.link(mode)).to eq(0)
|
||||
expect(keg.link(**options)).to eq(0)
|
||||
}.to output(<<~EOF).to_stdout
|
||||
#{HOMEBREW_PREFIX}/bin/goodbye_cruel_world
|
||||
#{HOMEBREW_PREFIX}/bin/helloworld
|
||||
@ -119,27 +118,27 @@ describe Keg do
|
||||
end
|
||||
|
||||
context "with overwrite set to true" do
|
||||
let(:options) { { overwrite: true } }
|
||||
|
||||
it "overwrite existing files" do
|
||||
touch dst
|
||||
mode.overwrite = true
|
||||
expect(keg.link(mode)).to eq(3)
|
||||
expect(keg.link(**options)).to eq(3)
|
||||
expect(keg).to be_linked
|
||||
end
|
||||
|
||||
it "overwrites broken symlinks" do
|
||||
dst.make_symlink "nowhere"
|
||||
mode.overwrite = true
|
||||
expect(keg.link(mode)).to eq(3)
|
||||
expect(keg.link(**options)).to eq(3)
|
||||
expect(keg).to be_linked
|
||||
end
|
||||
|
||||
it "still supports dryrun" do
|
||||
touch dst
|
||||
mode.overwrite = true
|
||||
mode.dry_run = true
|
||||
|
||||
options[:dry_run] = true
|
||||
|
||||
expect {
|
||||
expect(keg.link(mode)).to eq(0)
|
||||
expect(keg.link(**options)).to eq(0)
|
||||
}.to output(<<~EOF).to_stdout
|
||||
#{dst}
|
||||
EOF
|
||||
|
||||
@ -26,7 +26,7 @@ module Homebrew
|
||||
end
|
||||
|
||||
formulae_to_install.each do |f|
|
||||
Migrator.migrate_if_needed(f, force: args.force?)
|
||||
Migrator.migrate_if_needed(f, force: args.force?, verbose: args.verbose?)
|
||||
begin
|
||||
upgrade_formula(f, args: args)
|
||||
Cleanup.install_formula_clean!(f)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user