diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2015-03-21 14:56:24 +0000 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2015-03-22 15:20:29 +0000 |
commit | 4487fc3517fb6db0dd8f25199cc0654c026d203d (patch) | |
tree | 781ad9122350617c99a6f695ed8ecc7f00a74924 /dgit | |
parent | fb568448c56dc58293d9b7a817f25ef1fa082efc (diff) |
Support --deliberately-not-fast-forward
Diffstat (limited to 'dgit')
-rwxr-xr-x | dgit | 25 |
1 files changed, 24 insertions, 1 deletions
@@ -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 ($) { |