use Fcntl qw(:flock);
use File::Path qw(rmtree);
-open DEBUG, ">/dev/null" or die $!;
+use Debian::Dgit qw(:DEFAULT :policyflags);
-our $package_re = '[0-9a-z][-+.0-9a-z]+';
+open DEBUG, ">/dev/null" or die $!;
our $func;
our $dgitrepos;
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;
+}
+
+sub mkemptyrepo ($$) {
+ my ($dir,$sharedperm) = @_;
+ runcmd qw(git init --bare --quiet), "--shared=$sharedperm", $dir;
+}
+
#----- git-receive-pack -----
sub fixmissing__git_receive_pack () {
debug "translated version $v";
$tagname eq "debian/$v" or die;
+ my ($policy) = policyhook(NOFFCHECK, '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 & NOFFCHECK) && $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";
return if stat $destrepo;
die $! unless $!==ENOENT;
rmtree "$destrepo.new";
- umask 022;
- runcmd qw(git init --bare --quiet), "$destrepo.new";
+ mkemptyrepo "$destrepo.new", "0644";
rename "$destrepo.new", $destrepo or die $!;
unlink "$destrepo.lock" or die $!;
close $lfh;
reject "unknown method" unless $mainfunc;
+ my ($policy, $pollock) = policyhook(FRESHREPO,'check-package',$package);
+ if ($policy & FRESHREPO) {
+ 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 {