Pass verbose? to Keg#link, Keg#unlink and Keg#optlink.

This commit is contained in:
Markus Reiter 2020-08-02 04:46:32 +02:00
parent e9d8f09da1
commit 6c964d4a78
14 changed files with 92 additions and 92 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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}"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)