X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=infra%2Fdgit-repos-server;h=d3d711f178ab99fda55dbe849fd77114f98b6e01;hb=07bdd0fbd6a2cf1c0b175afe1e075bb566ed1f2c;hp=acff1727541491ace4bfc45ba4e56a63a7e40c84;hpb=d395baaa070686dce79a9ad7cd02777a4caa4778;p=dgit.git diff --git a/infra/dgit-repos-server b/infra/dgit-repos-server index acff1727..d3d711f1 100755 --- a/infra/dgit-repos-server +++ b/infra/dgit-repos-server @@ -4,6 +4,8 @@ # usages: # .../dgit-repos-server DISTRO SUITES KEYRING-AUTH-SPEC \ # DGIT-REPOS-DIR POLICY-HOOK-SCRIPT --ssh +# .../dgit-repos-server DISTRO SUITES KEYRING-AUTH-SPEC \ +# DGIT-REPOS-DIR POLICY-HOOK-SCRIPT --cron # internal usage: # .../dgit-repos-server --pre-receive-hook PACKAGE # @@ -135,6 +137,11 @@ use strict; # # policy hook for a particular package will be invoked only once at # a time - (see comments about DGIT-REPOS-DIR, above) +# +# check-list and check-package are invoked via the --cron option. +# First, without any locking, check-list is called. It should produce +# a list of package names. Then check-package will be invoked for +# each named package, in each case after taking an appropriate lock. use POSIX; @@ -148,6 +155,7 @@ open DEBUG, ">/dev/null" or die $!; our $func; our $dgitrepos; our $package; +our $distro; our $suitesfile; our $policyhook; our $realdestrepo; @@ -253,9 +261,9 @@ sub policyhook { my ($policyallowbits, @polargs) = @_; # => ($exitstatuspolicybitmap); die if $policyallowbits & ~0x3e; - my @cmd = ($policyhook,$distro,$repos,@polargs); - debugcmd @_; - my $r = system @_; + my @cmd = ($policyhook,$distro,$dgitrepos,@polargs); + debugcmd @cmd; + my $r = system @cmd; die "system: $!" if $r < 0; die "hook (@cmd) failed ($?)" if $r & ~($policyallowbits << 8); return $r >> 8; @@ -295,17 +303,6 @@ sub movetogarbage () { or die "$garbagerepo $!"; } -sub onwardpush () { - my @cmd = (qw(git send-pack), $destrepo); - push @cmd, qw(--force) if $policy & NOFFCHECK; - push @cmd, "$commit:refs/dgit/$suite", - "$tagval:refs/tags/$tagname"); - debugcmd @cmd; - $!=0; - my $r = system @cmd; - !$r or die "onward push to $destrepo failed: $r $!"; -} - #----- git-receive-pack ----- sub fixmissing__git_receive_pack () { @@ -463,12 +460,14 @@ sub parsetag () { $version = $2; die "$3 != $suite " unless $3 eq $suite; + my $copyl = $_; for (;;) { - print PT or die $!; + print PT $copyl or die $!; $!=0; $_=; defined or die "missing signature? $!"; + $copyl = $_; if (m/^\[dgit ([^"].*)\]$/) { # [dgit "something"] is for future $_ = $1." "; - for (;;) { + while (length) { if (s/^distro\=(\S+) //) { die "$1 != $distro" unless $1 eq $distro; } elsif (s/^(--deliberately-$package_re) //) { @@ -478,13 +477,14 @@ sub parsetag () { $supersedes{$1} = $2; } elsif (s/^[-+.=0-9a-z]\S* //) { } else { - die "unknown dgit info in tag"; + die "unknown dgit info in tag ($_)"; } } next; } last if m/^-----BEGIN PGP/; } + $_ = $copyl; for (;;) { print DS or die $!; $!=0; $_=; @@ -650,7 +650,7 @@ sub checktagnoreplay () { my @problems; - git_for_each_tag_referring($objreferring, sub { + git_for_each_tag_referring($onlyreferring, sub { my ($objid,$fullrefname,$tagname) = @_; debug "checktagnoreplay - overwriting $fullrefname=$objid"; my $supers = $supersedes{$fullrefname}; @@ -697,7 +697,7 @@ sub checks () { lockrealtree(); my @policy_args = ($package,$version,$suite,$tagname, - join(",",@delberatelies)); + join(",",@deliberatelies)); $policy = policyhook(NOFFCHECK|FRESHREPO, 'push', @policy_args); checktagnoreplay(); @@ -731,6 +731,17 @@ sub checks () { policyhook(0, 'push-confirm', @policy_args); } +sub onwardpush () { + my @cmd = (qw(git send-pack), $destrepo); + push @cmd, qw(--force) if $policy & NOFFCHECK; + push @cmd, "$commit:refs/dgit/$suite", + "$tagval:refs/tags/$tagname"; + debugcmd @cmd; + $!=0; + my $r = system @cmd; + !$r or die "onward push to $destrepo failed: $r $!"; +} + sub stunthook () { debug "stunthook"; chdir $workrepo or die "chdir $workrepo: $!"; @@ -789,6 +800,7 @@ sub parseargsdispatch () { @ARGV == 1 or die; $package = shift @ARGV; defined($distro = $ENV{'DGIT_DRS_DISTRO'}) or die; + defined($dgitrepos = $ENV{'DGIT_DRS_REPOS'}) or die; defined($suitesfile = $ENV{'DGIT_DRS_SUITES'}) or die; defined($workrepo = $ENV{'DGIT_DRS_WORK'}) or die; defined($destrepo = $ENV{'DGIT_DRS_DEST'}) or die; @@ -805,10 +817,10 @@ sub parseargsdispatch () { exit 0; } - $ENV{'DGIT_DRS_DISTRO'} = argval(); - $ENV{'DGIT_DRS_SUITES'} = argval(); - $ENV{'DGIT_DRS_KEYRINGS'} = argval(); - $dgitrepos = argval(); + $ENV{'DGIT_DRS_DISTRO'} = $distro = argval(); + $ENV{'DGIT_DRS_SUITES'} = $suitesfile = argval(); + $ENV{'DGIT_DRS_KEYRINGS'} = $keyrings = argval(); + $ENV{'DGIT_DRS_REPOS'} = $dgitrepos = argval(); $ENV{'DGIT_DRS_POLICYHOOK'} = $policyhook = argval(); die unless @ARGV==1 && $ARGV[0] eq '--ssh';