diff options
| author | Desmond Brand | 2013-04-27 15:21:17 -0700 | 
|---|---|---|
| committer | Misty De Meo | 2013-05-09 09:21:34 -0500 | 
| commit | fc565bee2603a2aaf3eaa79cdbc0e0ef85276ca6 (patch) | |
| tree | 36465e738c70bdc787039f7a7e27fcc1011c2f60 | |
| parent | 1bc3574fcc3b3c1d6a9aaf9cac66b67a51eac97a (diff) | |
| download | homebrew-fc565bee2603a2aaf3eaa79cdbc0e0ef85276ca6.tar.bz2 | |
Overwrite broken symlinks with --overwrite
Closes #19480.
Signed-off-by: Misty De Meo <mistydemeo@gmail.com>
| -rw-r--r-- | Library/Homebrew/extend/pathname.rb | 15 | ||||
| -rw-r--r-- | Library/Homebrew/keg.rb | 4 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_keg.rb | 9 | 
3 files changed, 25 insertions, 3 deletions
diff --git a/Library/Homebrew/extend/pathname.rb b/Library/Homebrew/extend/pathname.rb index ef7dcea99..25bb1e537 100644 --- a/Library/Homebrew/extend/pathname.rb +++ b/Library/Homebrew/extend/pathname.rb @@ -264,7 +264,20 @@ class Pathname            raise <<-EOS.undent              Could not symlink file: #{src.expand_path}              Target #{self} already exists. You may need to delete it. -            To force the link and delete this file, do: +            To force the link and overwrite all other conflicting files, do: +              brew link --overwrite formula_name + +            To list all files that would be deleted: +              brew link --overwrite --dry-run formula_name +            EOS +        # #exist? will return false for symlinks whose target doesn't exist +        elsif self.symlink? +          raise <<-EOS.undent +            Could not symlink file: #{src.expand_path} +            Target #{self} already exists as a symlink to #{readlink}. +            If this file is from another formula, you may need to +            `brew unlink` it. Otherwise, you may want to delete it. +            To force the link and overwrite all other conflicting files, do:                brew link --overwrite formula_name              To list all files that would be deleted: diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index 8e774ba85..a63af419d 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -194,14 +194,14 @@ class Keg < Pathname        puts "Skipping; already exists: #{dst}" if ARGV.verbose?      # cf. git-clean -n: list files to delete, don't really link or delete      elsif mode.dry_run and mode.overwrite -      puts dst if dst.exist? +      puts dst if dst.exist? or dst.symlink?        return      # list all link targets      elsif mode.dry_run        puts dst        return      else -      dst.delete if mode.overwrite && dst.exist? +      dst.delete if mode.overwrite && (dst.exist? or dst.symlink?)        dst.make_relative_symlink src      end    end diff --git a/Library/Homebrew/test/test_keg.rb b/Library/Homebrew/test/test_keg.rb index 3081381aa..208d62683 100644 --- a/Library/Homebrew/test/test_keg.rb +++ b/Library/Homebrew/test/test_keg.rb @@ -61,6 +61,15 @@ class LinkTests < Test::Unit::TestCase      assert_equal 3, @keg.link(mode)    end +  def test_link_overwrite_broken_symlinks +    FileUtils.cd HOMEBREW_PREFIX/"bin" do +      FileUtils.ln_s "nowhere", "helloworld" +    end +    mode = OpenStruct.new +    mode.overwrite = true +    assert_equal 3, @keg.link(mode) +  end +    def test_link_overwrite_dryrun      FileUtils.touch HOMEBREW_PREFIX/"bin/helloworld"      mode = OpenStruct.new  | 
