chiark / gitweb /
check: /var/run
[version-charset-test.git] / check
1 #!/bin/bash
2 set -e
3 set -o pipefail
4
5 cpus=$(
6         perl -we '
7             use strict;
8             require Sys::CPU;
9             my $ncpus = Sys::CPU::cpu_count();
10             $ncpus *= 1.5;
11             print join " ", (0 .. $ncpus-1) or die $!;
12             print "\n" or die $!;
13         ' ||
14         echo 0 1 2
15 )
16
17 uid=`id -u`
18 cd /var/run/user/$uid
19 mkdir -p version-charset-test
20 cd version-charset-test
21
22 rm -rf stunt
23 mkdir stunt
24 cd stunt
25
26 for cpu in $cpus; do
27         mkdir c$cpu
28         (cd c$cpu
29          git init)
30 done
31
32 #exec 3<&0 </dev/null
33
34 #git commit --allow-empty -m 'Test object'
35 #head=`git rev-parse HEAD`
36
37 #exec <&3 3<&-
38
39 perl -we '
40     use strict;
41
42     our $file;
43     our $count;
44     our $batch=0;
45     our @tasks;
46
47     my @freecpus = qw('"$cpus"');
48
49     print STDERR "check using cpus @freecpus\n";
50
51     sub await_task () {
52         my ($pid, $cpu, $oldbatch) = @{ shift @tasks };
53         waitpid $pid, 0 == $pid or die $!;
54         die "$oldbatch $?" if $?;
55         unlink "b$oldbatch" or die "$oldbatch $!";
56         print STDERR "check completed $oldbatch [$pid] #$cpu\n";
57         push @freecpus, $cpu;
58     }
59
60     sub complete_batch () {
61         return unless $file;
62
63         close $file or die $!;
64
65         print STDERR "check closing $batch ($count)\n";
66
67         await_task unless @freecpus;
68
69         my $cpu = shift @freecpus;
70
71         my $pid = fork // die $!;
72         if (!$pid) {
73             close STDIN;
74 #            seek STDIN,0,1;
75 #            flush STDIN;
76             open STDIN, "<", "b$batch" or die $batch;
77             chdir "c$cpu" or die "$cpu $!";
78             exec qw(eatmydata git update-ref --stdin);
79             die $!;
80         }
81         print STDERR "check spawned $batch ($count) [$pid] #$cpu\n";
82         push @tasks, [ $pid, $cpu, $batch ];
83         $batch++;
84         $file = undef;
85         $count = 0;
86     }
87
88     while (<>) {
89 #print STDERR ">$_<\n";
90         $file ||= new IO::File "b$batch", ">" or die $!;
91         chomp;
92         print $file "delete refs/tags/$_\n" or die $!;
93         $count++ < 100000 or complete_batch;
94     }
95 #print STDERR "FOO\n";
96     STDIN->error and die $!;
97     complete_batch();
98     await_task while @tasks;
99 '