1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-10-20 20:09:11 +00:00

Script to set MAKE_JOBS_(UN)SAFE= yes for a MAINTAINERs ports.

Please be sure to completely test the results of running this _BEFORE_ committing
several times and in a Tinderbox

Feel free to commit to this file
This commit is contained in:
Philip M. Gollucci 2009-04-22 00:33:44 +00:00
parent c876a4476b
commit 4fa6707cf8
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=232474

191
Tools/scripts/mark_safe.pl Executable file
View File

@ -0,0 +1,191 @@
#!/usr/bin/perl -w
# $FreeBSD$
#
# MAINTAINER= pgollucci@FreeBSD.org
## core
use strict;
use warnings FATAL => 'all';
use Carp;
use File::Find ();
use Getopt::Long ();
use Pod::Usage ();
### constants
## exit codes
use constant EXIT_SUCCESS => 0;
use constant EXIT_FAILED_INVALID_ARGS_OR_ENV => 1;
## other
use constant PROGNAME => $0;
### signal handlers
local $SIG{__DIE__} = \&Carp::confess;
local $SIG{__WARN__} = \&Carp::cluck;
### version
our $VERSION = do { my @r = (q$FreeBSD$ =~ /\d+/g); sprintf "%d." . "%02d" x $#r, @r };
### globals
# cmdline options (standard) with defaults
my $Help = 0;
my $Version = 0;
my $Debug = 0;
my $Verbose = 0;
my $NoExec = 0;
# cmdline options (custom) with defaults
my $Maintainer = "$ENV{USER}\@FreeBSD.org";
my $Safe = 1;
my $Index = 'INDEX-8';
# internals
my $PORTSDIR = $ENV{PORTSDIR} || '/usr/ports';
my %RPARTS = (
0 => 'pkg_name',
1 => 'dir',
2 => 'prefix',
3 => 'comment',
4 => 'pkg_descr',
5 => 'maintainer',
6 => 'categories',
7 => 'ldep',
8 => 'rdep',
9 => 'www',
);
my %PARTS = reverse %RPARTS;
### Utility Functions
sub error { print STDERR "ERROR: $_[0]" }
sub debug { print STDERR "DEBUG: $_[0]" if $Debug }
sub verbose { print STDOUT "VERBOSE($_[0]): $_[1]" if $Verbose > $_[0] }
### main
sub getopts_wrapper {
my $rv =
Getopt::Long::GetOptions(
"debug|d" => \$Debug,
"verbose=i" => \$Verbose,
"help|h" => \$Help,
"version|V" => \$Version,
"noexec|n" => \$NoExec,
"maintainer|m=s" => \$Maintainer,
"safe|s=i" => \$Safe,
"index|i=s" => \$Index,
);
Pod::Usage::pod2usage(-verbose => 1) unless $rv;
unless ($Help || valid_args()) {
$rv = 0;
Pod::Usage::pod2usage(-verbose => 1);
}
return $rv ? 1 : 0;
}
sub valid_args {
my $errors = 0;
## NoExec implies Verbosity level 1
$Verbose = 1 if $NoExec;
return $errors > 0 ? 0 : 1;
}
sub work {
my $rv = EXIT_SUCCESS;
my $ports = ports_get();
mark($ports);
return $rv;
}
sub mark {
my ($ports) = @_;
foreach my $port_dir (@$ports) {
my $mfile = "$port_dir/Makefile";
print "Mfile: $mfile\n";
open my $mk, '<', $mfile or die "Can't open [$mfile] b/c [$!]";
my @lines = <$mk>;
close $mk or die "Can't close [$mfile] b/c [$!]";
my $i_depends = 0;
my $i_comment = 0;
my $i_maintainer = 0;
my $i = 0;
foreach my $line (@lines) {
## ORDER MATTERs, lowest in file is last
$i_depends = $i if $line =~ /DEPENDS/;
$i_comment = $i if $line =~ /COMMENT/;
$i_maintainer = $i if $line =~ /MAINTAINER/;
++$i;
}
my $loc = $i_depends > 0 ? $i_depends :
$i_comment > 0 ? $i_comment :
$i_maintainer > 0 ? $i_maintainer : die "Can't find location to insert";
my @newlines = @lines[0..$loc];
push @newlines, "\n", "MAKE_JOBS_" . ($Safe ? "SAFE" : "UNSAFE") . "= yes\n";
push @newlines, @lines[$loc+1..$#lines];
open my $mk_o, '>', $mfile or die "Can't open [$mfile] b/c [$!]";
foreach my $line (@newlines) {
print $mk_o $line;
}
close $mk_o or die "Can't close [$mfile] b/c [$!]";
}
return;
}
sub ports_get {
my $index = "$PORTSDIR/$Index";
print "Index: $index\n";
my @ports = ();
open my $fh, '<', $index or die "Can't open [$index] b/c [$!]";
while (<$fh>) {
my @parts = split /\|/;
my $port_dir = $parts[$PARTS{dir}];
$port_dir =~ s!/usr/ports!$PORTSDIR!;
my $maintainer = $parts[$PARTS{maintainer}];
push @ports, $port_dir if $maintainer =~ /^$Maintainer$/io;
}
close $fh or die "Can't close [$index] b/c [$!]";
return \@ports;
}
sub main {
getopts_wrapper() or return EXIT_FAILED_INVALID_ARGS_OR_ENV;
if ($Help) {
Pod::Usage::pod2usage(-verbose => 1);
return EXIT_SUCCESS;
}
if ($Version) {
print PROGNAME . " - v$VERSION\n\n";
return EXIT_SUCCESS;
}
return work();
}
MAIN: {
exit main();
}