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