chiark / gitweb /
dgit: import-dsc: Handle relative symlinks correctly
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 13 Jan 2019 18:35:53 +0000 (18:35 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 13 Jan 2019 18:39:22 +0000 (18:39 +0000)
The logic here was correct only with bpd = `..'.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
dgit

diff --git a/dgit b/dgit
index ce7fdaef69457531129c58c6e7be5a2da25d3cc1..12161c0f3e7ad5443bc6f79bb92547e2052b8a22 100755 (executable)
--- 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;