chiark / gitweb /
dgit: Do not execute END blocks in children.
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 0cd122ef23aaabec7537c3c4389a51947c89dbab..afdf2c58ec8d13c7dc54e2444f6abd1b5412b147 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -156,6 +156,7 @@ our $split_brain = 0;
 
 END {
     local ($@, $?);
+    return unless forkcheck_mainprocess();
     print STDERR "! $_\n" foreach $supplementary_message =~ m/^.+$/mg;
 }
 
@@ -220,6 +221,7 @@ initdebug('');
 our @end;
 END { 
     local ($?);
+    return unless forkcheck_mainprocess();
     foreach my $f (@end) {
        eval { $f->(); };
        print STDERR "$us: cleanup: $@" if length $@;
@@ -2072,21 +2074,43 @@ sub generate_commits_from_dsc () {
        die "$f ?" if $f =~ m#/|^\.|\.dsc$|\.tmp$#;
        my $upper_f = "../../../../$f";
 
-       printdebug "considering linking $f: ";
-
-       link_ltarget $upper_f, $f
-           or ((printdebug "($!) "), 0)
-           or $!==&ENOENT
-           or die "$f $!";
-
-       printdebug "linked.\n";
+       printdebug "considering reusing $f: ";
+
+       if (link_ltarget "$upper_f,fetch", $f) {
+           printdebug "linked (using ...,fetch).\n";
+       } elsif ((printdebug "($!) "),
+                $! != ENOENT) {
+           fail "accessing ../$f,fetch: $!";
+       } elsif (link_ltarget $upper_f, $f) {
+           printdebug "linked.\n";
+       } elsif ((printdebug "($!) "),
+                $! != ENOENT) {
+           fail "accessing ../$f: $!";
+       } else {
+           printdebug "absent.\n";
+       }
 
-       complete_file_from_dsc('.', $fi)
+       my $refetched;
+       complete_file_from_dsc('.', $fi, \$refetched)
            or next;
 
-       link $f, $upper_f
-           or $!==&EEXIST
-           or die "$f $!";
+       printdebug "considering saving $f: ";
+
+       if (link $f, $upper_f) {
+           printdebug "linked.\n";
+       } elsif ((printdebug "($!) "),
+                $! != EEXIST) {
+           fail "saving ../$f: $!";
+       } elsif (!$refetched) {
+           printdebug "no need.\n";
+       } elsif (link $f, "$upper_f,fetch") {
+           printdebug "linked (using ...,fetch).\n";
+       } elsif ((printdebug "($!) "),
+                $! != EEXIST) {
+           fail "saving ../$f,fetch: $!";
+       } else {
+           printdebug "cannot.\n";
+       }
     }
 
     # We unpack and record the orig tarballs first, so that we only
@@ -3299,6 +3323,7 @@ sub multisuite_suite_child ($$$) {
     my $canonsuitefh = IO::File::new_tmpfile;
     my $pid = fork // die $!;
     if (!$pid) {
+       forkcheck_setup();
        $isuite = $tsuite;
        $us .= " [$isuite]";
        $debugprefix .= " ";
@@ -4450,7 +4475,10 @@ sub i_cleanup {
     }
 }
 
-END { i_cleanup(); }
+END {
+    return unless forkcheck_mainprocess();
+    i_cleanup();
+}
 
 sub i_method {
     my ($base,$selector,@args) = @_;
@@ -5641,12 +5669,12 @@ sub cmd_clean () {
 sub build_prep_early () {
     our $build_prep_early_done //= 0;
     return if $build_prep_early_done++;
-    notpushing();
     badusage "-p is not allowed when building" if defined $package;
     my $clogp = parsechangelog();
     $isuite = getfield $clogp, 'Distribution';
     $package = getfield $clogp, 'Source';
     $version = getfield $clogp, 'Version';
+    notpushing();
     check_not_dirty();
 }