summaryrefslogtreecommitdiff
path: root/dgit
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2019-01-13 18:35:53 +0000
committerIan Jackson <ijackson@chiark.greenend.org.uk>2019-03-01 17:43:47 +0000
commit7adb1a2ff884501c97fbb92b4b91337929c047fd (patch)
treee9774e6178e4accc658ed6af4a2c9f71f3ebb40d /dgit
parent23a0de6747ba1c63d42a0e5bd954ba299f0bb4a3 (diff)
dgit: import-dsc: Handle relative symlinks correctly
The logic here was correct only with bpd = `..'. Closes: #913259 Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk> squash!! dgit: import-dsc: Handle relative symlinks correctly
Diffstat (limited to 'dgit')
-rwxr-xr-xdgit34
1 files changed, 22 insertions, 12 deletions
diff --git a/dgit b/dgit
index ce7fdae..3032c56 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;
@@ -7011,28 +7012,37 @@ END
# or something.
my $here = "$buildproductsdir/$f";
if (lstat $here) {
- next if stat $here;
+ if (stat $here) {
+ next;
+ }
fail f_ "lstat %s works but stat gives %s !", $here, $!;
}
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 ?";
+ # $there is file we want, relative to user's cwd, or abs
+ printdebug "not in bpd, $f, test $there ...\n";
+ stat $there or fail f_
+ "import %s requires %s, but: %s", $dscfn, $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;