# 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
#
#
# 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;
our $func;
our $dgitrepos;
our $package;
+our $distro;
our $suitesfile;
our $policyhook;
our $realdestrepo;
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;
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 () {
$version = $2;
die "$3 != $suite " unless $3 eq $suite;
+ my $copyl = $_;
for (;;) {
- print PT or die $!;
+ print PT $copyl or die $!;
$!=0; $_=<T>; 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) //) {
$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; $_=<T>;
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};
lockrealtree();
my @policy_args = ($package,$version,$suite,$tagname,
- join(",",@delberatelies));
+ join(",",@deliberatelies));
$policy = policyhook(NOFFCHECK|FRESHREPO, 'push', @policy_args);
checktagnoreplay();
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: $!";
@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;
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';