1 ################################################################################
3 # devtools.pl -- various utility functions
5 ################################################################################
7 # Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
8 # Version 2.x, Copyright (C) 2001, Paul Marquess.
9 # Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
11 # This program is free software; you can redistribute it and/or
12 # modify it under the same terms as Perl itself.
14 ################################################################################
18 eval "use Term::ANSIColor";
19 $@ and eval "sub colored { pop; @_ }";
27 s/^(.*)/colored("($0) ", 'bold blue').colored($1, 'blue')/eg for @out;
34 return $opt{verbose} ? ('--verbose') : ();
39 my $opt = ref $_[0] ? shift @_ : {};
40 my($prog, @args) = @_;
41 my $sysstr = join ' ', map { "'$_'" } $prog, @args;
42 $sysstr .= " >$opt->{'out'}" if exists $opt->{'out'};
43 $sysstr .= " 2>$opt->{'err'}" if exists $opt->{'err'};
44 verbose("running $sysstr\n");
45 my $rv = system $sysstr;
46 verbose("$prog => exit code $rv\n");
52 my $opt = ref $_[0] ? shift @_ : {};
53 runtool($opt, $^X, @_);
61 runtool({ 'out' => 'tmp.out', 'err' => 'tmp.err' }, $prog, @args);
63 my $out = IO::File->new("tmp.out") or die "tmp.out: $!\n";
64 my $err = IO::File->new("tmp.err") or die "tmp.err: $!\n";
73 unlink "tmp.out", "tmp.err";
75 $? & 128 and $rval{core} = 1;
76 $? & 127 and $rval{signal} = $? & 127;
83 return "$^X $0 @argvcopy";
88 verbose(ident_str() . "\n");
97 print "\a\n$q [y/n] ";
99 while ($a !~ /^\s*([yn])\s*$/i);
105 print "\nSorry, cannot continue.\n\n";
111 quit_now unless &ask;
116 my($start, $i, $n) = @_;
117 return "--:--:--" if $i < 3;
118 my $elapsed = tv_interval($start);
119 my $h = int($elapsed*($n-$i)/$i);
120 my $s = $h % 60; $h /= 60;
121 my $m = $h % 60; $h /= 60;
122 return sprintf "%02d:%02d:%02d", $h, $m, $s;
125 sub get_and_sort_perls($)
129 # Get blead and all other perls
130 my @perls = $opt->{blead};
131 for my $dir (split ",", $opt->{install}) {
132 push @perls, grep !/-RC\d+/, glob "$dir/bin/perl5.*";
135 # Sort in descending version order. Each element is a hash describing a perl,
136 # with keys 'version' and 'path'
137 @perls = sort { $b->{version} <=> $a->{version} }
139 # Call the perl to get it to print out it's $]
141 map { { version => `$_ -e 'printf "%.6f", \$]'`,
146 # Override blead's version if specified.
147 if (exists $opt->{'blead-version'}) {
148 $perls[0]{version} = format_version($opt->{'blead-version'});
153 # blead's todo is its version plus 1. Otherwise, each todo is the
154 # previous one's. Also get rid of duplicate versions.
155 $perls[0]{todo} = $perls[0]{version} + 1;
156 $seen{$perls[0]{version}} = 1;
157 for my $i (1 .. $#perls) {
158 last unless defined $perls[$i];
159 if ( exists $seen{$perls[$i]{version}}) {
160 splice @perls, $i, 1;
164 $seen{$perls[$i]{version}} = 1;
165 $perls[$i]{todo} = $perls[$i-1]{version};