summaryrefslogtreecommitdiff
path: root/infra
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2015-03-17 22:40:04 +0000
committerIan Jackson <ijackson@chiark.greenend.org.uk>2015-03-22 15:19:27 +0000
commit444896a3a9780647f751966f2c0b26f39c5cd8d3 (patch)
tree66fe7d04d624b353d6c54a82a74b81a0c360bcf7 /infra
parent772fdc0dc3733838b2efdf0c9af7252c2eafafd8 (diff)
Honour policy hook
Diffstat (limited to 'infra')
-rwxr-xr-xinfra/dgit-repos-server29
1 files changed, 28 insertions, 1 deletions
diff --git a/infra/dgit-repos-server b/infra/dgit-repos-server
index c20eb68..8162fa1 100755
--- a/infra/dgit-repos-server
+++ b/infra/dgit-repos-server
@@ -188,6 +188,18 @@ sub runcmd {
die "@_ $? $!" if $r;
}
+sub policyhook {
+ my ($policyallowbits, @polargs) = @_;
+ # => ($exitstatuspolicybitmap, $policylockfh);
+ die if $policyallowbits & ~0x3e;
+ my @cmd = ($policyhook,$distro,$repos,@polargs);
+ debugcmd @_;
+ my $r = system @_;
+ die "system: $!" if $r < 0;
+ die "hook (@cmd) failed ($?)" if $r & ~($policyallowbits << 8);
+ return $r >> 8;
+}
+
#----- git-receive-pack -----
sub fixmissing__git_receive_pack () {
@@ -492,11 +504,15 @@ sub checks () {
debug "translated version $v";
$tagname eq "debian/$v" or die;
+ my ($policy) = policyhook(2,'push',$package,
+ $version,$suite,$tagname,
+ join(",",@delberatelies));
+
checksuite();
# check that our ref is being fast-forwarded
debug "oldcommit $oldcommit";
- if ($oldcommit =~ m/[^0]/) {
+ if (!($policy & 2) && $oldcommit =~ m/[^0]/) {
$?=0; $!=0; my $mb = `git merge-base $commit $oldcommit`;
chomp $mb;
$mb eq $oldcommit or reject "not fast forward on dgit branch";
@@ -615,6 +631,17 @@ sub parseargsdispatch () {
reject "unknown method" unless $mainfunc;
+ my ($policy, $pollock) = policyhook(4, 'check-package',$package);
+ if ($policy & 4) {
+ my $garbagerepo = "$dgitrepos/_tmp/${package}_garbage";
+ acquiretree($garbagerepo,1);
+ rmtree $garbagerepo;
+ rename $realdestrepo, $garbagerepo
+ or $! == ENOENT
+ or die "rename repo $destrepo to $garbagerepo: $!";
+ }
+ close $pollock or die $!;
+
if (stat $realdestrepo) {
$destrepo = $realdestrepo;
} else {