Handle conflicts where links point at symlinks
Fixes Homebrew/homebrew#30664.
This commit is contained in:
parent
7b26c885bd
commit
1eafe3bc35
@ -322,11 +322,12 @@ class Keg
|
|||||||
private
|
private
|
||||||
|
|
||||||
def resolve_any_conflicts dst, mode
|
def resolve_any_conflicts dst, mode
|
||||||
# if it isn't a directory then a severe conflict is about to happen. Let
|
src = dst.resolved_path
|
||||||
# it, and the exception that is generated will message to the user about
|
# src itself may be a symlink, so check lstat to ensure we are dealing with
|
||||||
# the situation
|
# a directory, and not a symlink pointing at a directory (which needs to be
|
||||||
if dst.symlink? and dst.directory?
|
# treated as a file). In other words, we onlly want to resolve one symlink.
|
||||||
src = dst.resolved_path
|
# If it isn't a directory, make_relative_symlink will raise an exception.
|
||||||
|
if dst.symlink? && src.lstat.directory?
|
||||||
keg = Keg.for(src)
|
keg = Keg.for(src)
|
||||||
dst.unlink unless mode.dry_run
|
dst.unlink unless mode.dry_run
|
||||||
keg.link_dir(src, mode) { :mkpath }
|
keg.link_dir(src, mode) { :mkpath }
|
||||||
|
|||||||
@ -217,4 +217,20 @@ class LinkTests < Homebrew::TestCase
|
|||||||
assert_predicate link.resolved_path, :symlink?
|
assert_predicate link.resolved_path, :symlink?
|
||||||
assert_predicate link.lstat, :symlink?
|
assert_predicate link.lstat, :symlink?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_links_to_symlinks_are_not_removed
|
||||||
|
a = HOMEBREW_CELLAR.join("a", "1.0")
|
||||||
|
b = HOMEBREW_CELLAR.join("b", "1.0")
|
||||||
|
|
||||||
|
a.join("lib", "example").mkpath
|
||||||
|
a.join("lib", "example2").make_symlink "example"
|
||||||
|
b.join("lib", "example2").mkpath
|
||||||
|
|
||||||
|
Keg.new(a).link
|
||||||
|
|
||||||
|
lib = HOMEBREW_PREFIX.join("lib")
|
||||||
|
assert_equal 2, lib.children.length
|
||||||
|
assert_raises(Keg::ConflictError) { Keg.new(b).link }
|
||||||
|
assert_equal 2, lib.children.length
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user