-
Notifications
You must be signed in to change notification settings - Fork 15
/
run_branches.pl
executable file
·145 lines (108 loc) · 2.67 KB
/
run_branches.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/usr/bin/perl
=comment
Copyright (c) 2003-2010, Andrew Dunstan
See accompanying License file for license details
=cut
use vars qw($VERSION); $VERSION = 'REL_0.0';
use strict;
use warnings;
use Fcntl qw(:flock :seek);
use PGBuild::Options;
use File::Basename;
my %branch_last;
sub branch_last_sort;
my $run_build;
($run_build = $0) =~ s/run_branches/run_build/;
my($run_all, $run_one);
my %extra_options =
(
'run-all' => \$run_all,
'run-one' => \$run_one,
);
# process the command line
PGBuild::Options::fetch_options(%extra_options);
# no non-option args allowed here
die ("$0: non-option arguments not permitted")
if @ARGV;
die "only one of --run-all and --run-one permitted"
if ($run_all && $run_one);
die "need one of --run-all and --run-one"
unless ($run_all || $run_one);
# set up a "branch" variable for processing the config file
use vars qw($branch);
$branch = 'global';
#
# process config file
#
require $buildconf ;
unless (ref $PGBuild::conf{branches_to_build} eq 'ARRAY' &&
@{$PGBuild::conf{branches_to_build}})
{
die "no branches_to_build specified in $buildconf";
}
my @branches = @{$PGBuild::conf{branches_to_build}};
my $global_lock_dir =
$PGBuild::conf{global_lock_dir} ||
$PGBuild::conf{build_root} ||
'';
;
unless ($global_lock_dir && -d $global_lock_dir)
{
die "no global lock directory: $global_lock_dir"
}
# acquire the lock
my $lockfile;
my $lockfilename = "$global_lock_dir/GLOBAL.lck";
open($lockfile, ">$lockfilename") || die "opening lockfile: $!";
if ( ! flock($lockfile,LOCK_EX|LOCK_NB) )
{
print "Another process holds the lock on " .
"$lockfilename. Exiting."
if ($verbose);
exit(0);
}
if ($run_all)
{
foreach my $brnch(@branches)
{
run_branch($brnch);
}
}
elsif ($run_one)
{
# sort the branches by the order in which they last did actual work
# then try running them in that order until one does some work
%branch_last = map {$_ => find_last_status($_)} @branches;
foreach my $brnch(sort branch_last_sort @branches)
{
run_branch($brnch);
my $new_status = find_last_status($brnch);
last if $new_status != $branch_last{$brnch};
}
}
exit 0;
##########################################################
sub run_branch
{
my $branch = shift;
my @args = ($run_build,
PGBuild::Options::standard_option_list(), $branch);
system(@args);
}
sub branch_last_sort
{
return $branch_last{$a} <=> $branch_last{$b};
}
sub find_last_status
{
my $brnch = shift;
my $status_file =
"$PGBuild::conf{build_root}/$brnch/$PGBuild::conf{animal}.last.status";
return 0 unless (-e $status_file);
my $handle;
open($handle,$status_file) || dir $!;
my $ts = <$handle>;
chomp $ts;
close($handle);
return $ts + 0;
}