chiark / gitweb /
Test suite: In drs tests, check that master gets updated
[dgit.git] / infra / dgit-repos-policy-debian
index 9c2153df5e9e487ee2293ac3364066765ff4ba1f..0774f17b9e373947e0dfbd9309ebc6c683acf47a 100755 (executable)
@@ -86,7 +86,9 @@ our %deliberately;
 sub apiquery ($) {
     my ($subpath) = @_;
     local $/=undef;
-    my $cmd = "$dgitlive/dgit -d$distro \$DGIT_TEST_OPTS";
+    my $dgit = "$dgitlive/dgit";
+    $dgit = "dgit" if !stat_exists $dgit;
+    my $cmd = "$dgit -d$distro \$DGIT_TEST_OPTS";
     $cmd .= " -".("D" x $debuglevel) if $debuglevel;
     $cmd .= " archive-api-query $subpath";
     printdebug "apiquery $cmd\n";
@@ -104,7 +106,7 @@ sub specific_suite_has_vsn_in_our_history ($) {
     foreach my $entry (@$in_suite) {
        my $vsn = $entry->{version};
        die "$pkg ?" unless defined $vsn;
-       my $tagref = "refs/tags/".debiantag $vsn;
+       my $tagref = "refs/tags/".debiantag $vsn, $distro;
        printdebug " checking history suite=$suite vsn=$vsn tagref=$tagref\n";
        $?=0; my $r = system qw(git show-ref --verify --quiet), $tagref;
        return 1 if !$r;
@@ -219,15 +221,16 @@ sub check_package () {
     my $age = time -  $mtime;
     printdebug "check_package age=$age\n";
 
-    return 0 if $age < $new_upload_propagation_slop;
-
-    return 0 if new_has_vsn_in_our_history();
-
     if (good_suite_has_vsn_in_our_history) {
        chmod $publicmode, "." or die $!;
+       $pkg_secret = 0;
        return 0;
     }
 
+    return 0 if $age < $new_upload_propagation_slop;
+
+    return 0 if new_has_vsn_in_our_history();
+
     printdebug "check_package secret, deleted, tainting\n";
 
     git_for_each_ref('refs/tags', sub {
@@ -260,6 +263,8 @@ sub action_push () {
     getpackage();
     getpushinfo();
 
+    check_package(); # might make package public, or might add taints
+
     return 0 unless $pkg_exists;
     return 0 unless $pkg_secret;
 
@@ -449,21 +454,39 @@ if (!$fn) {
 my $sleepy=0;
 my $rcode;
 
-for (;;) {
-    poldb_setup(poldb_path($repos));
-    $stderr = '';
+my $db_busy_exception= 'Debian::Dgit::Policy::Debian::DB_BUSY';
 
-    $rcode = $fn->();
-    die unless defined $rcode;
+my @orgargv = @ARGV;
 
-    eval { $poldbh->commit; };
+for (;;) {
+    @ARGV = @orgargv;
+    eval {
+       poldb_setup(poldb_path($repos), sub {
+           $poldbh->{HandleError} = sub {
+               return 0 unless $poldbh->err == 5; # SQLITE_BUSY, not in .pm :-(
+               die bless { }, $db_busy_exception;
+           };
+
+           eval ($ENV{'DGIT_RPD_TEST_DBLOOP_HOOK'}//'');
+           die $@ if length $@;
+           # used by tests/tests/debpolicy-dbretry
+        });
+
+       $stderr = '';
+
+       $rcode = $fn->();
+       die unless defined $rcode;
+
+       $poldbh->commit;
+    };
     last unless length $@;
+    die $@ unless ref $@ eq $db_busy_exception;
 
     die if $sleepy >= 20;
-    print STDERR "[policy database busy, retrying]\n";
-    sleep ++$sleepy;
+    $sleepy++;
+    print STDERR "[policy database busy, retrying (${sleepy}s)]\n";
 
-    $poldbh->rollback;
+    eval { $poldbh->rollback; };
 }
 
 print STDERR $stderr or die $!;