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