summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2016-07-31 18:41:02 +0100
committerIan Jackson <ijackson@chiark.greenend.org.uk>2016-09-05 13:41:48 +0100
commit045ec681a42fd823280cdec86a177309ddd741f0 (patch)
tree19f322b5ee46181e5d73119a4f21ca15c2217382
parent3e228ac23b8b7351a7de2957de1f42fb894bb1f5 (diff)
Split tags: Genrate maintainer-view tag too
push_tagwants gets a new argument, $maintviewhead, which is defined iff the quilt mode means we want split tags. It then specifies the generation of both tags. push_mktags gains the ability to make the new `maint' view tag (and checks that the view is not something else unexpected). Introduce a function debiantag_maintview for calculating the maintainer's idea of the tag. Currently we use DEP-14 encoding (and this function is a clone-and-hack of Dgit.pm::debiantag_old, but perhaps we should do something more complicated (depending on the quilt mode). For now we do not push the maint view tag anywhere. The ability to do that, where appropriate, will come in a moment. This commit introduces protocol version 4, which includes the new `maint-view' param. When have a split brain quilt mode, we need to be sure that we're using protocol version 4 or out peer may not honour this, resulting in an annoying failure later (the responder sending a different number of tags to the number expected). We also have to check that we're using the new tag format (or we might want to try to generate two different tags with the same name, which is madness). When the quilt mode is not a split brain one, this whole commit should produce no overall functional change (even though a higher protocol version may be negotiated). Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
-rwxr-xr-xdgit60
1 files changed, 52 insertions, 8 deletions
diff --git a/dgit b/dgit
index 102864c..548a25b 100755
--- a/dgit
+++ b/dgit
@@ -40,7 +40,7 @@ use Debian::Dgit;
our $our_version = 'UNRELEASED'; ###substituted###
-our @rpushprotovsn_support = qw(3 2); # 4 is new tag format
+our @rpushprotovsn_support = qw(4 3 2); # 4 is new tag format
our $protovsn;
our $isuite = 'unstable';
@@ -141,6 +141,12 @@ sub debiantag ($$) {
return $tagformatfn->($v, $distro);
}
+sub debiantag_maintview ($$) {
+ my ($v,$distro) = @_;
+ $v =~ y/~:/_%/;
+ return "$distro/$v";
+}
+
sub lbranch () { return "$branchprefix/$csuite"; }
my $lbranch_re = '^refs/heads/'.$branchprefix.'/([^/.]+)$';
sub lref () { return "refs/heads/".lbranch(); }
@@ -245,9 +251,10 @@ sub quiltmode_splitbrain () {
# > file changes
# [etc]
#
-# > param head HEAD
+# > param head DGIT-VIEW-HEAD
# > param csuite SUITE
# > param tagformat old|new
+# > param maint-view MAINT-VIEW-HEAD
#
# > previously REFNAME=OBJNAME # if --deliberately-not-fast-forward
# # goes into tag, for replay prevention
@@ -1956,8 +1963,8 @@ sub push_parse_dsc ($$$) {
" but debian/changelog is for $package $cversion";
}
-sub push_tagwants ($$$) {
- my ($cversion, $dgithead, $tfbase) = @_;
+sub push_tagwants ($$$$) {
+ my ($cversion, $dgithead, $maintviewhead, $tfbase) = @_;
my @tagwants;
push @tagwants, {
TagFn => \&debiantag,
@@ -1965,6 +1972,14 @@ sub push_tagwants ($$$) {
TfSuffix => '',
View => 'dgit',
};
+ if (defined $maintviewhead) {
+ push @tagwants, {
+ TagFn => \&debiantag_maintview,
+ Objid => $maintviewhead,
+ TfSuffix => '-maintview',
+ View => 'maint',
+ };
+ }
foreach my $tw (@tagwants) {
$tw->{Tag} = $tw->{TagFn}($cversion, access_basedistro);
$tw->{Tfn} = sub { $tfbase.$tw->{TfSuffix}.$_[0]; };
@@ -2011,13 +2026,24 @@ type commit
tag $tag
tagger $authline
+END
+ if ($tw->{View} eq 'dgit') {
+ print TO <<END or die $!;
$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
+ }
+ } elsif ($tw->{View} eq 'maint') {
+ print TO <<END or die $!;
+$package release $cversion for $clogsuite ($csuite)
+(maintainer view tag generated by dgit --quilt=$quilt_mode)
+END
+ } else {
+ die Dumper($tw)."?";
}
close TO or die $!;
@@ -2066,6 +2092,10 @@ sub dopush ($) {
Push failed, while preparing your push.
You can retry the push, after fixing the problem, if you like.
END
+
+ need_tagformat 'new', "quilt mode $quilt_mode"
+ if quiltmode_splitbrain;
+
prep_ud();
access_giturl(); # check that success is vaguely likely
@@ -2158,6 +2188,10 @@ END
responder_send_command("param head $dgithead");
responder_send_command("param csuite $csuite");
responder_send_command("param tagformat $tagformat");
+ if (quiltmode_splitbrain) {
+ die unless ($protovsn//4) >= 4;
+ responder_send_command("param maint-view $maintviewhead");
+ }
if (deliberately_not_fast_forward) {
git_for_each_ref(lrfetchrefs, sub {
@@ -2168,7 +2202,7 @@ END
});
}
- my @tagwants = push_tagwants($cversion, $dgithead,
+ my @tagwants = push_tagwants($cversion, $dgithead, $maintviewhead,
".git/dgit/tag");
my @tagobjfns;
@@ -2212,6 +2246,8 @@ END
my @pushrefs = $forceflag."HEAD:".rrref();
foreach my $tw (@tagwants) {
+ my $view = $tw->{View};
+ next unless $view eq 'dgit';
push @pushrefs, $forceflag."refs/tags/$tw->{Tag}";
}
@@ -2506,6 +2542,11 @@ sub cmd_rpush {
($protovsn) = initiator_expect { m/^dgit-remote-push-ready (\S+)/ };
die "$protovsn ?" unless grep { $_ eq $protovsn } @rpushprotovsn_support;
$supplementary_message = '' unless $protovsn >= 3;
+
+ fail "rpush negotiated protocol version $protovsn".
+ " which does not support quilt mode $quilt_mode"
+ if quiltmode_splitbrain;
+
rpush_handle_protovsn_bothends();
for (;;) {
my ($icmd,$iargs) = initiator_expect {
@@ -2611,6 +2652,9 @@ sub i_want_signed_tag {
my $head = $i_param{'head'};
die if $head =~ m/[^0-9a-f]/ || $head !~ m/^../;
+ my $maintview = $i_param{'maint-view'};
+ die if defined $maintview && $maintview =~ m/[^0-9a-f]/;
+
select_tagformat();
if ($protovsn >= 4) {
my $p = $i_param{'tagformat'} // '<undef>';
@@ -2622,7 +2666,7 @@ sub i_want_signed_tag {
$csuite = $&;
push_parse_dsc $i_dscfn, 'remote dsc', $i_version;
- my @tagwants = push_tagwants $i_version, $head, "tag";
+ my @tagwants = push_tagwants $i_version, $head, $maintview, "tag";
return
push_mktags $i_clogp, $i_dscfn,