chiark / gitweb /
fix invocation lengths
[version-charset-test.git] / check
diff --git a/check b/check
index df4b83f411f64bbbfb296834fb86fda1deab805d..7ffa2da33ecc73a00cd89101b966f95d728148a4 100755 (executable)
--- a/check
+++ b/check
@@ -2,15 +2,37 @@
 set -e
 set -o pipefail
 
+cpus=$(
+       perl -we '
+           use strict;
+           require Sys::CPU;
+           my $ncpus = Sys::CPU::cpu_count();
+           $ncpus *= 1.5;
+            print join " ", (0 .. $ncpus-1) or die $!;
+           print "\n" or die $!;
+       ' ||
+       echo 0 1 2
+)
+
+uid=`id -u`
+cd /var/run/user/$uid
+mkdir -p version-charset-test
+cd version-charset-test
+
 rm -rf stunt
 mkdir stunt
 cd stunt
 
+for cpu in $cpus; do
+       mkdir c$cpu
+       (cd c$cpu
+        git init)
+done
+
 #exec 3<&0 </dev/null
 
-git init
-git commit --allow-empty -m 'Test object'
-head=`git rev-parse HEAD`
+#git commit --allow-empty -m 'Test object'
+#head=`git rev-parse HEAD`
 
 #exec <&3 3<&-
 
@@ -19,26 +41,60 @@ perl -we '
 
     our $file;
     our $count;
+    our $batch=0;
+    our @tasks;
+
+    my @freecpus = qw('"$cpus"');
+
+    print STDERR "check using cpus @freecpus\n";
+
+    sub await_task () {
+       my ($pid, $cpu, $oldbatch) = @{ shift @tasks };
+       waitpid $pid, 0 == $pid or die $!;
+       die "$oldbatch $?" if $?;
+       unlink "b$oldbatch" or die "$oldbatch $!";
+#        print STDERR "check completed $oldbatch [$pid] #$cpu\n";
+       push @freecpus, $cpu;
+    }
 
     sub complete_batch () {
-        if ($file) {
-            print STDERR "completing batch ($_)\n";
-            close $file or die $!;
-            system "git update-ref --stdin <batch"
-                and die "$? $!";
-        }
+        return unless $file;
+
+       close $file or die $!;
+
+#        print STDERR "check closing $batch ($count)\n";
+
+       await_task unless @freecpus;
+
+       my $cpu = shift @freecpus;
+
+       my $pid = fork // die $!;
+       if (!$pid) {
+           close STDIN;
+#            seek STDIN,0,1;
+#            flush STDIN;
+           open STDIN, "<", "b$batch" or die $batch;
+           chdir "c$cpu" or die "$cpu $!";
+           exec qw(eatmydata git update-ref --stdin);
+           die $!;
+       }
+#        print STDERR "check spawned $batch ($count) [$pid] #$cpu\n";
+       push @tasks, [ $pid, $cpu, $batch ];
+       $batch++;
        $file = undef;
        $count = 0;
     }
 
     while (<>) {
-print STDERR ">$_<\n";
-        $file ||= new IO::File "batch", ">" or die $!;
+#print STDERR ">$_<\n";
+        $file ||= new IO::File "b$batch", ">" or die $!;
         chomp;
-       print $file "create refs/tags/$_ '$head'\n" or die $!;
+       print $file "delete refs/tags/$_\n" or die $!;
        $count++ < 1000 or complete_batch;
     }
-print STDERR "FOO\n";
+#print STDERR "FOO\n";
     STDIN->error and die $!;
     complete_batch();
+    await_task while @tasks;
+    print STDERR "check happy all done\n";
 '