chiark / gitweb /
Test suite: Use make for parallel execution
[dgit.git] / dgit
diff --git a/dgit b/dgit
index a0144bcde7901c8c702d5a77878f8f841aa29391..088c5a23385018e093bf35db792c1f4a0fffef97 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -52,6 +52,7 @@ our $new_package = 0;
 our $ignoredirty = 0;
 our $rmonerror = 1;
 our @deliberatelies;
+our %supersedes;
 our $existing_package = 'dpkg';
 our $cleanmode = 'dpkg-source';
 our $changes_since_version;
@@ -185,13 +186,6 @@ sub changedir ($) {
     chdir $newdir or die "chdir: $newdir: $!";
 }
 
-sub stat_exists ($) {
-    my ($f) = @_;
-    return 1 if stat $f;
-    return 0 if $!==&ENOENT;
-    die "stat $f: $!";
-}
-
 sub deliberately ($) {
     return !!grep { $_[0] eq $_ } @deliberatelies;
 }
@@ -1569,6 +1563,7 @@ sub push_mktag ($$$$$$$) {
     # to control the "tagger" (b) we can do remote signing
     my $authline = clogp_authline $clogp;
     my $delibs = join(" ", "",@deliberatelies);
+    my $declaredistro = access_basedistro();
     open TO, '>', $tfn->('.tmp') or die $!;
     print TO <<END or die $!;
 object $head
@@ -1577,8 +1572,14 @@ tag $tag
 tagger $authline
 
 $package release $cversion for $clogsuite ($csuite) [dgit]
-[dgit distro=$distro$delibs]
+[dgit distro=$declaredistro$delibs]
+END
+    foreach my $ref (sort keys %supersedes) {
+                   print TO <<END or die $!;
+[dgit supersede:$ref=$supersedes{$ref}]
 END
+    }
+
     close TO or die $!;
 
     my $tagobjfn = $tfn->('.tmp');
@@ -1691,6 +1692,15 @@ sub dopush () {
     responder_send_command("param head $head");
     responder_send_command("param csuite $csuite");
 
+    my $forceflag = deliberately('not-fast-forward') ? '+' : '';
+    if ($forceflag && defined $lastpush_hash) {
+       git_for_each_tag_referring($lastpush_hash, sub {
+           my ($objid,$fullrefname,$tagname) = @_;
+           responder_send_command("supersedes $fullrefname=$objid");
+           $supersedes{$fullrefname} = $objid;
+       });
+    }
+
     my $tfn = sub { ".git/dgit/tag$_[0]"; };
     my $tagobjfn;
 
@@ -1714,7 +1724,7 @@ sub dopush () {
        create_remote_git_repo();
     }
     runcmd_ordryrun @git, qw(push),access_giturl(),
-        "HEAD:".rrref(), "refs/tags/$tag";
+        $forceflag."HEAD:".rrref(), "refs/tags/$tag";
     runcmd_ordryrun @git, qw(update-ref -m), 'dgit push', lrref(), 'HEAD';
 
     if ($we_are_responder) {
@@ -1995,6 +2005,14 @@ sub i_resp_param ($) {
     $i_param{$1} = $2;
 }
 
+sub i_resp_supersedes ($) {
+    $_[0] =~ m#^(refs/tags/\S+)=(\w+)$#
+       or badproto \*RO, "bad supersedes spec";
+    my $r = system qw(git check-ref-format), $1;
+    die "bad supersedes ref spec ($r)" if $r;
+    $supersedes{$1} = $2;
+}
+
 our %i_wanted;
 
 sub i_resp_want ($) {