install_symlink_p: Fix when dest includes a symlink
install_symlink_p does not work as intended when dst includes a symlink in its path. relative_path_from requires that both src and dst be real paths without symlinks. From https://ruby-doc.org/stdlib-2.3.7/libdoc/pathname/rdoc/Pathname.html#method-i-relative_path_from This method doesn't access the filesystem. It assumes no symlinks.
This commit is contained in:
parent
db42dd0420
commit
5cb458d687
@ -135,10 +135,11 @@ class Pathname
|
||||
end
|
||||
|
||||
def install_symlink_p(src, new_basename)
|
||||
src = Pathname(src).expand_path(self)
|
||||
dst = join(new_basename)
|
||||
mkpath
|
||||
FileUtils.ln_sf(src.relative_path_from(dst.parent), dst)
|
||||
dstdir = realpath
|
||||
src = Pathname(src).expand_path(dstdir)
|
||||
src = src.dirname.realpath/src.basename if src.dirname.exist?
|
||||
FileUtils.ln_sf(src.relative_path_from(dstdir), dstdir/new_basename)
|
||||
end
|
||||
private :install_symlink_p
|
||||
|
||||
|
||||
@ -245,6 +245,14 @@ describe Pathname do
|
||||
dst.install_symlink "foo" => "bar"
|
||||
expect((dst/"bar").readlink).to eq(described_class.new("foo"))
|
||||
end
|
||||
|
||||
it "can install relative symlinks in a symlinked directory" do
|
||||
mkdir_p dst/"1/2"
|
||||
dst.install_symlink "1/2" => "12"
|
||||
expect((dst/"12").readlink).to eq(described_class.new("1/2"))
|
||||
(dst/"12").install_symlink dst/"foo"
|
||||
expect((dst/"12/foo").readlink).to eq(described_class.new("../../foo"))
|
||||
end
|
||||
end
|
||||
|
||||
describe InstallRenamed do
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user