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