chiark / gitweb /
dgit-repos-server: tests: no need for troot
[dgit.git] / dgit-repos-server
index 7c48b2f322fb3a971a79a341cb61fe8cc29db077..aaa754207ab91701fda9ba899bface80a25e1eb8 100755 (executable)
@@ -133,6 +133,13 @@ sub acquiretree ($$) {
     return $fh;
 }
 
+sub mkrepotmp () {
+    my $tmpdir = "$dgitrepos/_tmp";
+    return if mkdir $tmpdir;
+    return if $! == EEXIST;
+    die $!;
+}
+
 sub reject ($) {
     die "dgit-repos-server: reject: $_[0]\n";
 }
@@ -146,6 +153,7 @@ sub runcmd {
 #----- git-receive-pack -----
 
 sub fixmissing__git_receive_pack () {
+    mkrepotmp();
     $destrepo = "$dgitrepos/_tmp/${package}_prospective";
     acquiretree($destrepo, 1);
     my $r = system qw(cp -a --), "$dgitrepos/_template", "$destrepo";
@@ -153,6 +161,7 @@ sub fixmissing__git_receive_pack () {
 }
 
 sub makeworkingclone () {
+    mkrepotmp();
     $workrepo = "$dgitrepos/_tmp/${package}_incoming$$";
     acquiretree($workrepo, 1);
     runcmd qw(git clone -l -q --mirror), $destrepo, $workrepo;
@@ -403,6 +412,15 @@ sub stunthook () {
 
 sub fixmissing__git_upload_pack () {
     $destrepo = "$dgitrepos/_empty";
+    my $lfh = acquiretree($destrepo,1);
+    return if stat $destrepo;
+    die $! unless $!==ENOENT;
+    rmtree "$destrepo.new";
+    umask 022;
+    runcmd qw(git init --bare --quiet), "$destrepo.new";
+    rename "$destrepo.new", $destrepo or die $!;
+    unlink "$destrepo.lock" or die $!;
+    close $lfh;
 }
 
 sub main__git_upload_pack () {
@@ -478,7 +496,10 @@ sub unlockall () {
 
 sub cleanup () {
     unlockall();
-    chdir "$dgitrepos/_tmp" or die $!;
+    if (!chdir "$dgitrepos/_tmp") {
+       $!==ENOENT or die $!;
+       return;
+    }
     foreach my $lf (<*.lock>) {
        my $tree = $lf;
        $tree =~ s/\.lock$//;