chiark / gitweb /
dgit-repos-server: Further fixes to locking; rename acquiretree to acquirermtree
[dgit.git] / infra / dgit-repos-server
index b0064e792b131020ae9db7ec02420d198a3beb7e..8a75d0557d49e58700f515aa59e18f6b3dd341de 100755 (executable)
@@ -157,7 +157,7 @@ sub acquirelock ($$) {
     return $fh;
 }
 
-sub acquiretree ($$) {
+sub acquirermtree ($$) {
     my ($tree, $must) = @_;
     my $fh = acquirelock("$tree.lock", $must);
     if ($fh) {
@@ -167,6 +167,15 @@ sub acquiretree ($$) {
     return $fh;
 }
 
+sub locksometree ($) {
+    my ($tree) = @_;
+    acquirelock("$tree.lock", 1);
+}
+
+sub lockrealtree () {
+    locksometree($realdestrepo);
+}
+
 sub mkrepotmp () {
     my $tmpdir = "$dgitrepos/_tmp";
     return if mkdir $tmpdir;
@@ -211,7 +220,7 @@ sub runcmd {
 
 sub policyhook {
     my ($policyallowbits, @polargs) = @_;
-    # => ($exitstatuspolicybitmap, $policylockfh);
+    # => ($exitstatuspolicybitmap);
     die if $policyallowbits & ~0x3e;
     my @cmd = ($policyhook,$distro,$repos,@polargs);
     debugcmd @_;
@@ -229,7 +238,7 @@ sub mkemptyrepo ($$) {
 sub mkrepo_fromtemplate ($) {
     my ($dir) = @_;
     my $template = "$dgitrepos/_template";
-    acquiretree($template,1);
+    locksometree($template);
     debug "copy template $template -> $dir";
     my $r = system qw(cp -a --), $template, $dir;
     !$r or die "create new repo $dir failed: $r $!";
@@ -271,15 +280,15 @@ sub onwardpush () {
 sub fixmissing__git_receive_pack () {
     mkrepotmp();
     $destrepo = "$dgitrepos/_tmp/${package}_prospective";
-    acquiretree($destrepo, 1);
+    acquirermtree($destrepo, 1);
     mkrepo_fromtemplate($destrepo);
 }
 
 sub makeworkingclone () {
     mkrepotmp();
     $workrepo = "$dgitrepos/_tmp/${package}_incoming$$";
-    acquiretree($workrepo, 1);
-    my $lfh = acquiretree($realdestrepo, 1);
+    acquirermtree($workrepo, 1);
+    my $lfh = lockrealtree();
     runcmd qw(git clone -l -q --mirror), $destrepo, $workrepo;
     close $lfh;
     rmtree "${workrepo}_fresh";
@@ -345,7 +354,7 @@ sub maybeinstallprospective () {
     die Dumper(\%got)." -- missing refs in new repo"
        if grep { !$_ } values %got;
 
-    acquiretree($realdestrepo,1);
+    lockrealtree();
 
     if ($destrepo eq "${workrepo}_fresh") {
        movetogarbage;
@@ -574,7 +583,7 @@ sub checktagnoreplay () {
     return unless $policy & (FRESHREPO|NOFFCHECK);
 
     my $garbagerepo = "$dgitrepos/${package}_garbage";
-    acquiretree($realdestrepo,1);
+    lockrealtree();
 
     local $ENV{GIT_DIR};
     foreach my $garb ("$garbagerepo", "$garbagerepo-old") {
@@ -654,7 +663,7 @@ sub checks () {
     debug "translated version $v";
     $tagname eq "debian/$v" or die;
 
-    acquiretree($realdestrepo,1);
+    lockrealtree();
 
     $policy = policyhook(NOFFCHECK|FRESHREPO, 'push',$package,
                         $version,$suite,$tagname,
@@ -705,7 +714,7 @@ sub stunthook () {
 
 sub fixmissing__git_upload_pack () {
     $destrepo = "$dgitrepos/_empty";
-    my $lfh = acquiretree($destrepo,1);
+    my $lfh = locksometree($destrepo);
     return if stat_exists $destrepo;
     rmtree "$destrepo.new";
     mkemptyrepo "$destrepo.new", "0644";
@@ -715,7 +724,7 @@ sub fixmissing__git_upload_pack () {
 }
 
 sub main__git_upload_pack () {
-    my $lfh = acquiretree($destrepo,1);
+    my $lfh = locksometree($destrepo);
     chdir $destrepo or die "$destrepo: $!";
     close $lfh;
     runcmd qw(git upload-pack), ".";
@@ -792,13 +801,12 @@ sub parseargsdispatch () {
 
     reject "unknown method" unless $mainfunc;
 
-    my $lfh = acquiretree($realdestrepo,1);
+    my $lfh = lockrealtree();
 
-    my ($policy, $pollock) = policyhook(FRESHREPO,'check-package',$package);
+    $policy = policyhook(FRESHREPO,'check-package',$package);
     if ($policy & FRESHREPO) {
        movetogarbage;
     }
-    close $pollock or die $!;
 
     close $lfh;
 
@@ -827,7 +835,7 @@ sub cleanup () {
     foreach my $lf (<*.lock>) {
        my $tree = $lf;
        $tree =~ s/\.lock$//;
-       next unless acquiretree($tree, 0);
+       next unless acquirermtree($tree, 0);
        remove $lf or warn $!;
        unlockall();
     }