summaryrefslogtreecommitdiff
path: root/dgit
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2015-03-21 14:56:24 +0000
committerIan Jackson <ijackson@chiark.greenend.org.uk>2015-03-22 15:20:29 +0000
commit4487fc3517fb6db0dd8f25199cc0654c026d203d (patch)
tree781ad9122350617c99a6f695ed8ecc7f00a74924 /dgit
parentfb568448c56dc58293d9b7a817f25ef1fa082efc (diff)
Support --deliberately-not-fast-forward
Diffstat (limited to 'dgit')
-rwxr-xr-xdgit25
1 files changed, 24 insertions, 1 deletions
diff --git a/dgit b/dgit
index ad6289d..9d40cee 100755
--- a/dgit
+++ b/dgit
@@ -1572,6 +1572,12 @@ tagger $authline
$package release $cversion for $clogsuite ($csuite) [dgit]
[dgit distro=$distro$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');
@@ -1684,6 +1690,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;
@@ -1707,7 +1722,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) {
@@ -1988,6 +2003,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 ($) {