chiark
/
gitweb
/
~ianmdlvl
/
dgit.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Split brain: TODOs
[dgit.git]
/
dgit
diff --git
a/dgit
b/dgit
index 102864cf1a326bec0261158301f38e7b625986a0..53ccd724b821a9dcd59355f08011ff804f4951d7 100755
(executable)
--- a/
dgit
+++ b/
dgit
@@
-34,13
+34,14
@@
use POSIX;
use IPC::Open2;
use Digest::SHA;
use Digest::MD5;
use IPC::Open2;
use Digest::SHA;
use Digest::MD5;
+use List::Util qw(any);
use List::MoreUtils qw(pairwise);
use Debian::Dgit;
our $our_version = 'UNRELEASED'; ###substituted###
use List::MoreUtils qw(pairwise);
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';
our $protovsn;
our $isuite = 'unstable';
@@
-141,6
+142,12
@@
sub debiantag ($$) {
return $tagformatfn->($v, $distro);
}
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(); }
sub lbranch () { return "$branchprefix/$csuite"; }
my $lbranch_re = '^refs/heads/'.$branchprefix.'/([^/.]+)$';
sub lref () { return "refs/heads/".lbranch(); }
@@
-245,9
+252,10
@@
sub quiltmode_splitbrain () {
# > file changes
# [etc]
#
# > file changes
# [etc]
#
-# > param head HEAD
+# > param head
DGIT-VIEW-
HEAD
# > param csuite SUITE
# > param tagformat old|new
# > 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
#
# > previously REFNAME=OBJNAME # if --deliberately-not-fast-forward
# # goes into tag, for replay prevention
@@
-506,7
+514,7
@@
our %defcfg = ('dgit.default.distro' => 'debian',
'dgit.default.ssh' => 'ssh',
'dgit.default.archive-query' => 'madison:',
'dgit.default.sshpsql-dbname' => 'service=projectb',
'dgit.default.ssh' => 'ssh',
'dgit.default.archive-query' => 'madison:',
'dgit.default.sshpsql-dbname' => 'service=projectb',
- 'dgit.default.dgit-tag-format' => 'old,new',
+ 'dgit.default.dgit-tag-format' => 'old,new
,maint
',
'dgit-distro.debian.archive-query' => 'ftpmasterapi:',
'dgit-distro.debian.git-check' => 'url',
'dgit-distro.debian.git-check-suffix' => '/info/refs',
'dgit-distro.debian.archive-query' => 'ftpmasterapi:',
'dgit-distro.debian.git-check' => 'url',
'dgit-distro.debian.git-check-suffix' => '/info/refs',
@@
-1154,7
+1162,7
@@
sub select_tagformat () {
die 'bug' if $tagformatfn && $tagformat_want;
# ... $tagformat_want assigned after previous select_tagformat
die 'bug' if $tagformatfn && $tagformat_want;
# ... $tagformat_want assigned after previous select_tagformat
- my (@supported) = access_cfg_tagformats();
+ my (@supported) =
grep { $_ ne 'maint' }
access_cfg_tagformats();
printdebug "select_tagformat supported @supported\n";
$tagformat_want //= [ $supported[0], "distro access configuration", 0 ];
printdebug "select_tagformat supported @supported\n";
$tagformat_want //= [ $supported[0], "distro access configuration", 0 ];
@@
-1956,8
+1964,8
@@
sub push_parse_dsc ($$$) {
" but debian/changelog is for $package $cversion";
}
" 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,
my @tagwants;
push @tagwants, {
TagFn => \&debiantag,
@@
-1965,6
+1973,14
@@
sub push_tagwants ($$$) {
TfSuffix => '',
View => 'dgit',
};
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]; };
foreach my $tw (@tagwants) {
$tw->{Tag} = $tw->{TagFn}($cversion, access_basedistro);
$tw->{Tfn} = sub { $tfbase.$tw->{TfSuffix}.$_[0]; };
@@
-2011,13
+2027,24
@@
type commit
tag $tag
tagger $authline
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
$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
[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 $!;
}
close TO or die $!;
@@
-2066,6
+2093,10
@@
sub dopush ($) {
Push failed, while preparing your push.
You can retry the push, after fixing the problem, if you like.
END
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
prep_ud();
access_giturl(); # check that success is vaguely likely
@@
-2117,8
+2148,6
@@
END
}
}
}
}
- die 'xxx fast forward (should not depend on quilt mode, but will always be needed if we did $split_brain)' if $split_brain;
-
check_not_dirty();
changedir $ud;
progress "checking that $dscfn corresponds to HEAD";
check_not_dirty();
changedir $ud;
progress "checking that $dscfn corresponds to HEAD";
@@
-2158,6
+2187,10
@@
END
responder_send_command("param head $dgithead");
responder_send_command("param csuite $csuite");
responder_send_command("param tagformat $tagformat");
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 {
if (deliberately_not_fast_forward) {
git_for_each_ref(lrfetchrefs, sub {
@@
-2168,7
+2201,7
@@
END
});
}
});
}
- my @tagwants = push_tagwants($cversion, $dgithead,
+ my @tagwants = push_tagwants($cversion, $dgithead,
$maintviewhead,
".git/dgit/tag");
my @tagobjfns;
".git/dgit/tag");
my @tagobjfns;
@@
-2212,6
+2245,9
@@
END
my @pushrefs = $forceflag."HEAD:".rrref();
foreach my $tw (@tagwants) {
my @pushrefs = $forceflag."HEAD:".rrref();
foreach my $tw (@tagwants) {
+ my $view = $tw->{View};
+ next unless $view eq 'dgit'
+ or any { $_ eq $view } access_cfg_tagformats();
push @pushrefs, $forceflag."refs/tags/$tw->{Tag}";
}
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;
($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 {
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 $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>';
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;
$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,
return
push_mktags $i_clogp, $i_dscfn,