From: Ian Jackson Date: Sun, 13 Jan 2019 18:35:53 +0000 (+0000) Subject: dgit: import-dsc: Handle relative symlinks correctly X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=6cc51976cc97fee7d80096fbef65ac9aeda76d8e;p=dgit.git dgit: import-dsc: Handle relative symlinks correctly The logic here was correct only with bpd = `..'. Signed-off-by: Ian Jackson --- diff --git a/dgit b/dgit index ce7fdaef..12161c0f 100755 --- a/dgit +++ b/dgit @@ -32,6 +32,7 @@ use Data::Dumper; use LWP::UserAgent; use Dpkg::Control::Hash; use File::Path; +use File::Spec; use File::Temp qw(tempdir); use File::Basename; use Dpkg::Version; @@ -7017,22 +7018,25 @@ END fail f_ "stat %s: %s", $here, $! unless $! == ENOENT; # $f does not exist in bpd, we need to transfer it my $there = $dscfn; - if ($dscfn =~ m#^(?:\./+)?\.\./+#) { - $there = $'; - } elsif ($dscfn =~ m#^/#) { - $there = $dscfn; + $there =~ s{[^/]+$}{$f} or confess "$there ?"; + if ($there =~ m#^(?:\./+)?\.\./+#) { + # $there is relative to user's cwd + my $there_from_parent = $'; + if ($buildproductsdir !~ m{^/}) { + # abs2rel, despite its name, can take two relative paths + $there = File::Spec->abs2rel($there,$buildproductsdir); + # now $there is relative to bpd, great + } else { + $there = (dirname $maindir)."/$there_from_parent"; + # now $there is absoute + } + } elsif ($there =~ m#^/#) { + # $there is absolute already } else { fail f_ "cannot import %s which seems to be inside working tree!", $dscfn; } - $there =~ s#/+[^/]+$## or fail f_ - "import %s requires .../%s, but it does not exist", - $dscfn, $f; - $there .= "/$f"; - my $test = $there =~ m{^/} ? $there : "../$there"; - stat $test or fail f_ - "import %s requires %s, but: %s", $dscfn, $test, $!; symlink $there, $here or fail f_ "symlink %s to %s: %s", $there, $here, $!; progress f_ "made symlink %s -> %s", $here, $there;