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 |
