chiark / gitweb /
i18n-commit - autogenerated
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 4b147b2dd54960f8c5a70f8374358f0f75eb3ba7..b6bfd5605684ae5fbebb3343175ccc2bd5c2ac4f 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -257,7 +257,7 @@ sub forceing ($) {
 }
 
 sub no_such_package () {
-    print STDERR f_ "%s: package %s does not exist in suite %s\n",
+    print STDERR f_ "%s: source package %s does not exist in suite %s\n",
        $us, $package, $isuite;
     finish 4;
 }
@@ -2203,6 +2203,66 @@ sub check_bpd_exists () {
        $buildproductsdir, $!;
 }
 
+sub dotdot_bpd_transfer_origs ($$$) {
+    my ($bpd_abs, $upstreamversion, $wanted) = @_;
+    # checks is_orig_file_of_vsn and if
+    # calls $wanted->{$leaf} and expects boolish
+
+    return if $buildproductsdir eq '..';
+
+    my $warned;
+    my $dotdot = $maindir;
+    $dotdot =~ s{/[^/]+$}{};
+    opendir DD, $dotdot or fail "opendir .. ($dotdot): $!";
+    while ($!=0, defined(my $leaf = readdir DD)) {
+       {
+           local ($debuglevel) = $debuglevel-1;
+           printdebug "DD_BPD $leaf ?\n";
+       }
+       next unless is_orig_file_of_vsn $leaf, $upstreamversion;
+       next unless $wanted->($leaf);
+       next if lstat "$bpd_abs/$leaf";
+
+       print STDERR f_
+ "%s: found orig(s) in .. missing from build-products-dir, transferring:\n",
+           $us
+           unless $warned++;
+       $! == &ENOENT or fail f_
+           "check orig file %s in bpd %s: %s", $leaf, $bpd_abs, $!;
+       lstat "$dotdot/$leaf" or fail f_
+           "check orig file %s in ..: %s", $leaf, $!;
+       if (-l _) {
+           stat "$dotdot/$leaf" or fail f_
+               "check targe of orig symlink %s in ..: %s", $leaf, $!;
+           my $ltarget = readlink "$dotdot/$leaf" or
+               die "readlink $dotdot/$leaf: $!";
+           if ($ltarget !~ m{^/}) {
+               $ltarget = "$dotdot/$ltarget";
+           }
+           symlink $ltarget, "$bpd_abs/$leaf"
+               or die "$ltarget $bpd_abs $leaf: $!";
+           print STDERR f_
+ "%s: cloned orig symlink from ..: %s\n",
+               $us, $leaf;
+       } elsif (link "$dotdot/$leaf", "$bpd_abs/$leaf") {
+           print STDERR f_
+ "%s: hardlinked orig from ..: %s\n",
+               $us, $leaf;
+       } elsif ($! != EXDEV) {
+           fail f_ "failed to make %s a hardlink to %s: %s",
+               "$bpd_abs/$leaf", "$dotdot/$leaf", $!;
+       } else {
+           symlink "$bpd_abs/$leaf", "$dotdot/$leaf"
+               or die "$bpd_abs $dotdot $leaf $!";
+           print STDERR f_
+ "%s: symmlinked orig from .. on other filesystem: %s\n",
+               $us, $leaf;
+       }
+    }
+    die "$dotdot; $!" if $!;
+    closedir DD;
+}
+
 sub generate_commits_from_dsc () {
     # See big comment in fetch_from_archive, below.
     # See also README.dsc-import.
@@ -2213,6 +2273,9 @@ sub generate_commits_from_dsc () {
     my $upstreamv = upstreamversion $dsc->{version};
     my @dfi = dsc_files_info();
 
+    dotdot_bpd_transfer_origs $bpd_abs, $upstreamv,
+       sub { grep { $_->{Filename} eq $_[0] } @dfi };
+
     foreach my $fi (@dfi) {
        my $f = $fi->{Filename};
        die "$f ?" if $f =~ m#/|^\.|\.dsc$|\.tmp$#;
@@ -5792,6 +5855,9 @@ sub unpack_playtree_linkorigs ($$) {
     # calls $fn->($leafname);
 
     my $bpd_abs = bpd_abs();
+
+    dotdot_bpd_transfer_origs $bpd_abs, $upstreamversion, sub { 1 };
+
     opendir QFD, $bpd_abs or fail "buildproductsdir: $bpd_abs: $!";
     while ($!=0, defined(my $leaf = readdir QFD)) {
        my $f = bpd_abs()."/".$leaf;