chiark / gitweb /
dgit: Provide dotdot_bpd_transfer_origs for using origs from ..
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 5684ba9a6e86b7df84e598107efcc665ee698d34..21a3f287508062aaaa03464ad887836402736e11 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -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
+    my $warned;
+
+    if ($buildproductsdir ne '..') {
+       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.
@@ -5793,16 +5853,16 @@ sub unpack_playtree_linkorigs ($$) {
 
     my $bpd_abs = bpd_abs();
     opendir QFD, $bpd_abs or fail "buildproductsdir: $bpd_abs: $!";
-    while ($!=0, defined(my $b = readdir QFD)) {
-       my $f = bpd_abs()."/".$b;
+    while ($!=0, defined(my $leaf = readdir QFD)) {
+       my $f = bpd_abs()."/".$leaf;
        {
            local ($debuglevel) = $debuglevel-1;
-           printdebug "QF linkorigs $b, $f ?\n";
+           printdebug "QF linkorigs bpd $leaf, $f ?\n";
        }
-       next unless is_orig_file_of_vsn $b, $upstreamversion;
-       printdebug "QF linkorigs $b, $f Y\n";
-       link_ltarget $f, $b or die "$b $!";
-        $fn->($b);
+       next unless is_orig_file_of_vsn $leaf, $upstreamversion;
+       printdebug "QF linkorigs $leaf, $f Y\n";
+       link_ltarget $f, $leaf or die "$leaf $!";
+        $fn->($leaf);
     }
     die "$buildproductsdir: $!" if $!;
     closedir QFD;
@@ -5859,16 +5919,16 @@ Files:
 END
 
     my $dscaddfile=sub {
-        my ($b) = @_;
+        my ($leaf) = @_;
         
        my $md = new Digest::MD5;
 
-       my $fh = new IO::File $b, '<' or die "$b $!";
+       my $fh = new IO::File $leaf, '<' or die "$leaf $!";
        stat $fh or confess $!;
        my $size = -s _;
 
        $md->addfile($fh);
-       print $fakedsc " ".$md->hexdigest." $size $b\n" or confess $!;
+       print $fakedsc " ".$md->hexdigest." $size $leaf\n" or confess $!;
     };
 
     unpack_playtree_linkorigs($upstreamversion, $dscaddfile);
@@ -6104,9 +6164,9 @@ END
     };
 
     my @dl;
-    foreach my $b (qw(01 02)) {
+    foreach my $bits (qw(01 02)) {
         foreach my $v (qw(O2H O2A H2A)) {
-            push @dl, ($diffbits->{$v} & $b) ? '##' : '==';
+            push @dl, ($diffbits->{$v} & $bits) ? '##' : '==';
         }
     }
     printdebug "differences \@dl @dl.\n";