summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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,