chiark / gitweb /
Split tags: Introduce $mktag in push_mktag
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 65e8666cf3b2a4573918dfb8a98e6cf0eb02f067..4aefa085a6b3835d16384b1a218ff5cf18f0cf73 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -66,6 +66,7 @@ our $we_are_responder;
 our $initiator_tempdir;
 our $patches_applied_dirtily = 00;
 our $tagformat_want;
+our $tagformat;
 our $tagformatfn;
 
 our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)");
@@ -245,6 +246,7 @@ sub quiltmode_splitbrain () {
 #
 #  > param head HEAD
 #  > param csuite SUITE
+#  > param tagformat old|new
 #
 #  > previously REFNAME=OBJNAME       # if --deliberately-not-fast-forward
 #                                     # goes into tag, for replay prevention
@@ -1259,6 +1261,7 @@ sub select_tagformat () {
            or grep { $_ eq $fmt } @supported;
 
     $tagformat_want = undef;
+    $tagformat = $fmt;
     $tagformatfn = ${*::}{"debiantag_$fmt"};
 
     fail "trying to use unknown tag format \`$fmt' ($why) !"
@@ -1938,12 +1941,12 @@ sub push_parse_dsc ($$$) {
 }
 
 sub push_mktag ($$$$$$$) {
-    my ($head,$clogp,$tag,
+    my ($dgithead,$clogp,$dgittag,
        $dscfn,
        $changesfile,$changesfilewhat,
-       $tfn) = @_;
+       $tfnbase) = @_;
 
-    $dsc->{$ourdscfield[0]} = $head;
+    $dsc->{$ourdscfield[0]} = $dgithead;
     $dsc->save("$dscfn.tmp") or die $!;
 
     my $changes = parsecontrol($changesfile,$changesfilewhat);
@@ -1961,8 +1964,12 @@ sub push_mktag ($$$$$$$) {
     my $authline = clogp_authline $clogp;
     my $delibs = join(" ", "",@deliberatelies);
     my $declaredistro = access_basedistro();
-    open TO, '>', $tfn->('.tmp') or die $!;
-    print TO <<END or die $!;
+
+    my $mktag = sub {
+       my ($tfn, $head, $tag) = @_;
+
+       open TO, '>', $tfn->('.tmp') or die $!;
+       print TO <<END or die $!;
 object $head
 type commit
 tag $tag
@@ -1971,35 +1978,39 @@ tagger $authline
 $package release $cversion for $clogsuite ($csuite) [dgit]
 [dgit distro=$declaredistro$delibs]
 END
-    foreach my $ref (sort keys %previously) {
-                   print TO <<END or die $!;
+       foreach my $ref (sort keys %previously) {
+           print TO <<END or die $!;
 [dgit previously:$ref=$previously{$ref}]
 END
-    }
+       }
 
-    close TO or die $!;
+       close TO or die $!;
 
-    my $tagobjfn = $tfn->('.tmp');
-    if ($sign) {
-       if (!defined $keyid) {
-           $keyid = access_cfg('keyid','RETURN-UNDEF');
-       }
-        if (!defined $keyid) {
-           $keyid = getfield $clogp, 'Maintainer';
-        }
-       unlink $tfn->('.tmp.asc') or $!==&ENOENT or die $!;
-       my @sign_cmd = (@gpg, qw(--detach-sign --armor));
-       push @sign_cmd, qw(-u),$keyid if defined $keyid;
-       push @sign_cmd, $tfn->('.tmp');
-       runcmd_ordryrun @sign_cmd;
-       if (act_scary()) {
-           $tagobjfn = $tfn->('.signed.tmp');
-           runcmd shell_cmd "exec >$tagobjfn", qw(cat --),
-               $tfn->('.tmp'), $tfn->('.tmp.asc');
+       my $tagobjfn = $tfn->('.tmp');
+       if ($sign) {
+           if (!defined $keyid) {
+               $keyid = access_cfg('keyid','RETURN-UNDEF');
+           }
+           if (!defined $keyid) {
+               $keyid = getfield $clogp, 'Maintainer';
+           }
+           unlink $tfn->('.tmp.asc') or $!==&ENOENT or die $!;
+           my @sign_cmd = (@gpg, qw(--detach-sign --armor));
+           push @sign_cmd, qw(-u),$keyid if defined $keyid;
+           push @sign_cmd, $tfn->('.tmp');
+           runcmd_ordryrun @sign_cmd;
+           if (act_scary()) {
+               $tagobjfn = $tfn->('.signed.tmp');
+               runcmd shell_cmd "exec >$tagobjfn", qw(cat --),
+                   $tfn->('.tmp'), $tfn->('.tmp.asc');
+           }
        }
-    }
+       return $tagobjfn;
+    };
 
-    return ($tagobjfn);
+    my @r;
+    push @r, $mktag->($tfnbase, $dgithead, $dgittag);
+    return @r;
 }
 
 sub sign_changes ($) {
@@ -2107,6 +2118,7 @@ END
     responder_send_file('changes',$changesfile);
     responder_send_command("param head $head");
     responder_send_command("param csuite $csuite");
+    responder_send_command("param tagformat $tagformat");
 
     if (deliberately_not_fast_forward) {
        git_for_each_ref(lrfetchrefs, sub {
@@ -2129,7 +2141,7 @@ END
        $tagobjfn = $tfn->('.signed.tmp');
        responder_receive_files('signed-tag', $tagobjfn);
     } else {
-       $tagobjfn =
+       ($tagobjfn) =
            push_mktag($head,$clogp,$tag,
                       $dscpath,
                       $changesfile,$changesfile,
@@ -2552,11 +2564,18 @@ sub i_want_signed_tag {
     my $head = $i_param{'head'};
     die if $head =~ m/[^0-9a-f]/ || $head !~ m/^../;
 
+    select_tagformat();
+    if ($protovsn >= 4) {
+       my $p = $i_param{'tagformat'} // '<undef>';
+       $p eq $tagformat
+           or badproto \*RO, "tag format mismatch: $p vs. $tagformat";
+    }
+
     die unless $i_param{'csuite'} =~ m/^$suite_re$/;
     $csuite = $&;
     push_parse_dsc $i_dscfn, 'remote dsc', $i_version;
 
-    my $tagobjfn =
+    my ($tagobjfn) =
        push_mktag $head, $i_clogp, $i_tag,
            $i_dscfn,
            $i_changesfn, 'remote changes',