chiark / gitweb /
Test suite: add some replay prevention tests
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 6e9c3044f54d745e4371209d51208f7ec1d372b2..65bc10f01f5c369d29b7d7a069999a8cac2fd78b 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -111,6 +111,8 @@ sub lref () { return "refs/heads/".lbranch(); }
 sub lrref () { return "refs/remotes/$remotename/".server_branch($csuite); }
 sub rrref () { return server_ref($csuite); }
 
+sub lrfetchrefs () { return "refs/dgit-fetch/$isuite"; }
+
 sub stripepoch ($) {
     my ($vsn) = @_;
     $vsn =~ s/^\d+\://;
@@ -163,8 +165,9 @@ sub deliberately ($) {
 }
 
 sub deliberately_not_fast_forward () {
-    deliberately('not-fast-forward') ||
-       deliberately('TEST-not-fast-forward-dgit-only');
+    foreach (qw(not-fast-forward fresh-repo)) {
+       return 1 if deliberately($_) || deliberately("TEST-dgit-only-$_");
+    }
 }
 
 #---------- remote protocol support, common ----------
@@ -1261,6 +1264,11 @@ sub ensure_we_have_orig () {
 
 sub git_fetch_us () {
     runcmd_ordryrun_local @git, qw(fetch),access_giturl(),fetchspec();
+    if (deliberately_not_fast_forward) {
+       runcmd_ordryrun_local @git, qw(fetch -p), access_giturl(),
+           map { "+refs/$_/*:".lrfetchrefs."/$_/*" }
+           qw(tags heads);
+    }
 }
 
 sub fetch_from_archive () {
@@ -1653,11 +1661,12 @@ sub dopush ($) {
     responder_send_command("param head $head");
     responder_send_command("param csuite $csuite");
 
-    if ($forceflag && defined $lastpush_hash) {
-       git_for_each_tag_referring($lastpush_hash, sub {
-           my ($tagobjid,$refobjid,$fullrefname,$tagname) = @_;
-           responder_send_command("supersedes $fullrefname=$tagobjid");
-           $supersedes{$fullrefname} = $tagobjid;
+    if ($forceflag) {
+       git_for_each_ref(lrfetchrefs, sub {
+           my ($objid,$objtype,$lrfetchrefname,$reftail) = @_;
+           my $rrefname= substr($lrfetchrefname, length(lrfetchrefs) + 1);
+           responder_send_command("supersedes $rrefname=$objid");
+           $supersedes{$rrefname} = $objid;
        });
     }