chiark / gitweb /
infra: Drop support for old tag name on server side
[dgit.git] / infra / dgit-repos-server
index 6131774e7c43c7e2816cad08bfbcc3b54329947e..7c7262f50fce372dcfaf89c763fa3a223f04a9d7 100755 (executable)
@@ -303,13 +303,6 @@ sub reject ($) {
     die "\ndgit-repos-server: reject: $why\n\n";
 }
 
-sub runcmd {
-    debugcmd '+',@_;
-    $!=0; $?=0;
-    my $r = system @_;
-    die (shellquote @_)." $? $!" if $r;
-}
-
 sub policyhook {
     my ($policyallowbits, @polargs) = @_;
     # => ($exitstatuspolicybitmap);
@@ -407,16 +400,21 @@ sub makeworkingclone () {
     rmtree "${workrepo}_fresh";
 }
 
+sub mkscript ($$) {
+    my ($path,$contents) = @_;
+    my $fh = new IO::File $path, O_WRONLY|O_CREAT|O_TRUNC, 0777
+       or die "$path: $!";
+    print $fh $contents or die "$path: $!";
+    close $fh or die "$path: $!";
+}
+
 sub setupstunthook () {
     my $prerecv = "$workrepo/hooks/pre-receive";
-    my $fh = new IO::File $prerecv, O_WRONLY|O_CREAT|O_TRUNC, 0777
-       or die "$prerecv: $!";
-    print $fh <<END or die "$prerecv: $!";
+    mkscript $prerecv, <<END;
 #!/bin/sh
 set -e
 exec $0 --pre-receive-hook $package
 END
-    close $fh or die "$prerecv: $!";
     $ENV{'DGIT_DRS_WORK'}= $workrepo;
     $ENV{'DGIT_DRS_DEST'}= $destrepo;
     printdebug " stunt hook set up $prerecv\n";
@@ -541,15 +539,12 @@ sub readupdates () {
     STDIN->error and die $!;
 
     reject "push is missing tag ref update" unless %tags;
-    my @newtags = grep { m#^archive/# } keys %tags;
-    my @omtags = grep { !m#^archive/# } keys %tags;
-    reject "pushing too many similar tags" if @newtags>1 || @omtags>1;
-    if (@newtags) {
-       ($tagname) = @newtags;
-       ($maint_tagname) = @omtags;
-    } else {
-       ($tagname) = @omtags or die;
-    }
+    my @dtags = grep { m#^archive/# } keys %tags;
+    reject "need exactly one archive/* tag" if @dtags!=1;
+    my @mtags = grep { !m#^archive/# } keys %tags;
+    reject "pushing too many non-dgit tags" if @mtags>1;
+    ($tagname) = @dtags;
+    ($maint_tagname) = @mtags;
     $tagval = $tags{$tagname};
     $maint_tagval = $tags{$maint_tagname // ''};
 
@@ -864,8 +859,7 @@ sub checks () {
     grep { $tagname eq $_ } @expecttagnames or die;
 
     foreach my $othertag (grep { $_ ne $tagname } @expecttagnames) {
-       reject "tag $othertag (pushed with differing dgit version)".
-           " already exists -".
+       reject "tag $othertag already exists -".
            " not replacing previously-pushed version"
            if git_get_ref "refs/tags/".$othertag;
     }
@@ -897,8 +891,8 @@ sub checks () {
 
     # defend against commits generated by #849041
     if (!($policy & NOCOMMITCHECK)) {
-       my @checks = qw(%ae %at
-                       %ce %ct);
+       my @checks = qw(%at
+                       %ct);
        my @chk = qw(git log -z);
        push @chk, '--pretty=tformat:%H%n'.
            (join "", map { $_, '%n' } @checks);
@@ -938,6 +932,17 @@ sub onwardpush () {
     my @cmdbase = (qw(git send-pack), $destrepo);
     push @cmdbase, qw(--force) if $policy & NOFFCHECK;
 
+    if ($ENV{GIT_QUARANTINE_PATH}) {
+       my $recv_wrapper = "$ENV{GIT_QUARANTINE_PATH}/dgit-recv-wrapper";
+       mkscript $recv_wrapper, <<'END';
+#!/bin/sh
+set -e
+unset GIT_QUARANTINE_PATH
+exec git receive-pack "$@"
+END
+       push @cmdbase, "--receive-pack=$recv_wrapper";
+    }
+
     my @cmd = @cmdbase;
     push @cmd, "$commit:refs/dgit/$suite",
               "$tagval:refs/tags/$tagname";