diff options
author | Matthias Andree <mandree@FreeBSD.org> | 2016-04-12 06:31:59 +0000 |
---|---|---|
committer | Matthias Andree <mandree@FreeBSD.org> | 2016-04-12 06:31:59 +0000 |
commit | 1d10e55b18ab902ee6e8651409244c51807b43d3 (patch) | |
tree | 177d2f2465e05208afb4b8d341f120039e0b78ec /Tools | |
parent | 96833d568c0201b13810a2d2dbdf189bc4a12fd9 (diff) | |
download | ports-1d10e55b18ab902ee6e8651409244c51807b43d3.tar.gz ports-1d10e55b18ab902ee6e8651409244c51807b43d3.zip |
Notes
Diffstat (limited to 'Tools')
-rwxr-xr-x | Tools/scripts/bump_revision.pl | 206 |
1 files changed, 72 insertions, 134 deletions
diff --git a/Tools/scripts/bump_revision.pl b/Tools/scripts/bump_revision.pl index 71de603d1d69..f8bccee44966 100755 --- a/Tools/scripts/bump_revision.pl +++ b/Tools/scripts/bump_revision.pl @@ -1,53 +1,33 @@ -#!/usr/bin/env perl -wT +#!/usr/bin/env perl -w # $FreeBSD$ # -# This Perl script helps with bumping the PORTREVISION of all ports -# that depend on a set of ports, for instance, when in the latter set -# one of the port bumped the .so library version. -# -# It is best executed with the working directory set to the base of a -# ports tree, usually /usr/ports. -# -# You must use either the -l (shaLlow, avoid grandparent dependencies, -# slower) or -g option (include grandparend dependencies) option. -# # MAINTAINER= gerald@FreeBSD.org # -use strict; use Getopt::Std; -use Carp 'verbose'; +use strict; use Cwd; use Data::Dumper; use File::Basename; -use vars qw/$opt_c $opt_n $opt_i $opt_u $opt_l $opt_g/; - -$ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin'; +use vars qw/$opt_c $opt_n $opt_i $opt_u/; sub usage { print <<EOF; Usage: $0 [options] [<category>/]<portname> -Mandatory flags: - -l - shaLlow, only bump ports with direct dependencies. - -g - Grandchildren, also bump for indirect dependencies. - -Optional flags: - -c - Check only (dry-run), do not change Makefiles. - -n - No tmpdir, just use the directory where INDEX resides. - -i <filename> - Use this for INDEX name. Defaults to /usr/ports/INDEX-n, - where n is the major version of the OS, or /usr/ports/INDEX if missing. + -c - Just check + -n - No tmpdir, just use dirname(INDEX) + -u <username> - Your freebsd.org username. Defaults to \$ENV{USER}. + -i <filename> - Use this for INDEX name. Defaults to /usr/ports/INDEX. Improvements, suggestions,questions -> gerald\@FreeBSD.org EOF exit 1; } -$| = 1; - sub bumpMakefile { my ($p) = @_; @@ -59,7 +39,6 @@ sub bumpMakefile { next; } my @lines = <$fin>; - if ($!) { die "Error while reading $makefile: $!. Aborting"; } close($fin) or die "Can't close $makefile b/c $!"; chomp(@lines); @@ -71,7 +50,7 @@ sub bumpMakefile { } my $printedrev = 0; - open(my $fout, '>', "$makefile.bumped"); + open(my $fout, '>', "$makefile"); foreach my $line (@lines) { if (!$printedrev) { if ($line =~ /^CATEGORIES??=/ || $line =~ /^PORTEPOCH??=/) { @@ -93,40 +72,23 @@ sub bumpMakefile { print $fout "$line\n"; } close($fout) or die "Can't close $makefile b/c $!"; - rename "$makefile.bumped", $makefile or die "Can't rename $makefile.bumped to $makefile: $!"; } -my $osversion = `uname -r`; -chomp $osversion; -$osversion =~ s/\..*//; - -my $INDEX = "/usr/ports/INDEX-$osversion"; -if (!-f $INDEX) { $INDEX = "/usr/ports/INDEX"; } - -my $shallow = 0; +my $INDEX = "/usr/ports/INDEX"; +my $USER = $ENV{USER}; { $opt_i = ""; $opt_u = ""; - getopts("cgi:lnu:"); + getopts("cni:u:"); $INDEX = $opt_i if ($opt_i); - $shallow = $opt_l if $opt_l; - if (not $opt_l and not $opt_g) { - die "Neither -g nor -l given. Aborting"; - } + $USER = $opt_u if ($opt_u); - die "$INDEX doesn't seem to exist. Please check the value supplied with -i, or use -i /path/to/INDEX." unless(-f $INDEX); + die "$INDEX doesn't seem to exist. Please check the value supplied with -i or use -i." unless(-f $INDEX); } -usage() unless(@ARGV); +my $PORT = $ARGV[0]; +usage() unless($PORT); -my $TMPDIR = File::Basename::dirname($INDEX); - -# -# Sanity checking -# -if (-d "$TMPDIR/.svn" and not $opt_n and not $opt_c) { - print "$TMPDIR/.svn exists, do you want to use the -n option? Press Ctrl-C to abort.\n"; - sleep 5; -} +my $CVSROOT = $ENV{CVSROOT} // ':ext:$USER\@pcvs.freebsd.org:/home/pcvs'; # # Read the index, save some interesting keys @@ -136,113 +98,89 @@ my %index = (); print "Reading $INDEX\n"; open(my $fin, '<', "$INDEX") or die "Cannot open $INDEX for reading."; my @lines = <$fin>; - if ($!) { die "Error while reading $INDEX: $! Aborting"; } chomp(@lines); close($fin); - my @a; - my @b; - my $port; - map { - @a = split(/\|/, $_); - @b = split(/\//, $a[1]); + foreach my $line (@lines) { + my @a = split(/\|/, $line); + my @b = split(/\//, $a[1]); - $port = $b[-2]."/".$b[-1]; + my $port = $b[-2]."/".$b[-1]; - @{ $index{$port} }{'portname', 'portnameversion', 'portdir', 'comment', 'deps'} - = ($b[-1], $a[0], $a[1], $a[3], ()); + $index{$port}{portname} = $b[-1]; + $index{$port}{portnameversion} = $a[0]; + $index{$port}{portdir} = $a[1]; + $index{$port}{comment} = $a[3]; + $index{$port}{deps} = (); if ($a[8]) { @b = split(" ", $a[8]); - @{ $index{$port}{deps} }{@b} = (1) x @b; + foreach my $b (@b) { + $index{$port}{deps}{$b} = 1; + } } - - } @lines; - print "- Processed ", scalar keys(%index), " entries.\n"; + } + my @k = keys(%index); + print "- Processed ", $#k+1, " entries.\n"; } -my %DEPPORTS = (); - -foreach my $PORT (@ARGV) { - # - # See if the port does really exists. - # If specified as category/portname, that should be enough. - # If specified as portname, check all indexes for existence or duplicates. - # - unless (defined $index{$PORT}) { - my @found = grep /\/$PORT$/, keys(%index); - my $count = @found; - - if ($count == 0) { - die "Cannot find ${PORT} in ${INDEX}."; - } elsif ($count == 1) { - $PORT = $found[0]; - } else { - my $n = join(" ", @found); - die "Found ${PORT} more than once in ${INDEX}: $n. Try category/$PORT.\nAborting"; +# +# See if the port does really exists. +# If specified as category/portname, that should be enough. +# If specified as portname, check all indexes for existence or duplicates. +# +unless (defined $index{$PORT}) { + my $count = 0; + my $n = ""; + foreach my $p (keys(%index)) { + if ($p =~ /\/$PORT$/) { + $n .= " " if ($n); + $n .= $p; + $count++; } } - - my $PORTNAMEVERSION = $index{$PORT}{portnameversion}; - print "Found $PORT as $PORTNAMEVERSION\n"; - - # - # Figure out all the ports depending on this one. - # - { - print "Searching for ports depending on $PORT\n"; - - foreach my $p (keys(%index)) { - if (defined $index{$p}{'deps'}{$PORTNAMEVERSION}) { - $DEPPORTS{$p} = 1; - } - } - print "- Found ", scalar keys(%DEPPORTS), " ports depending on $PORT.\n"; + if ($count == 0) { + die "Cannot find ${PORT} in ${INDEX}."; + } elsif ($count == 1) { + $PORT = $n; + } else { + die "Found ${PORT} more than once in ${INDEX}: $n. Try category/portname."; } } +my $PORTNAMEVERSION = $index{$PORT}{portnameversion}; +print "Found $PORT as $PORTNAMEVERSION\n"; + # -# In shallow mode, strip all those who don't have a direct dependency +# Figure out all the ports depending on this one. # -sub direct_dependence($@) { - my ($port, @requisites) = @_; - open F, '-|', '/usr/bin/make', '-C', $port, qw/-V _RUN_DEPENDS -V _LIB_DEPENDS/ or die "cannot launch make: $!"; - my @lines = <F>; - chomp @lines; - my $deps = join(" ", @lines); - my %deps = map { $_ =~ s[/usr/ports/][]; ($_ => 1) } split " ", $deps; - if ($!) { die "cannot read depends from make: $!"; } - close F or die "cannot read depends from make: $!"; - my $required = grep { $_ } map { defined $deps{$_} } @requisites; - return $required; -} -if ($shallow) { - my $n = keys %DEPPORTS; - my $idx = 1; - foreach my $p (keys %DEPPORTS) { - print "- Checking requisites of port $idx/$n...\r"; - ++$idx; - unless (direct_dependence($p, @ARGV)) { - delete $DEPPORTS{$p}; +my %DEPPORTS = (); +my $ports = ""; +{ + print "Searching for ports depending on $PORT\n"; + foreach my $p (keys(%index)) { + if (defined $index{$p}{deps}{$PORTNAMEVERSION}) { + $DEPPORTS{$p} = 1; + $ports .= " " if ($ports); + $ports .= "ports/$p"; } } - print "- Found ", scalar keys(%DEPPORTS), " ports depending directly on either of @ARGV.\n"; + my @k = keys(%DEPPORTS); + print "- Found ", $#k+1, " ports depending on it.\n"; } -my $ports = join(" ", keys %DEPPORTS); - # # Create a temp directory and cvs checkout the ports # (don't do error checking, too complicated right now) # -unless ($opt_n or $opt_c) { - $TMPDIR = ".bump_rev_tmpdir.$$"; - print "svn checkout into $TMPDIR...\n"; + +my $TMPDIR = File::Basename::dirname($INDEX); +unless ($opt_n) { + $TMPDIR = getcwd() . "/.tmpdir.$$"; mkdir($TMPDIR, 0755); chdir($TMPDIR); - system "svn checkout --depth=immediates svn+ssh://svn.freebsd.org/ports/head/ ports" and die "SVN checkout failed (wait value $?), aborting"; - chdir('ports'); - system "svn update --set-depth=infinity $ports" and die "SVN checkout failed (wait value $?), aborting"; + system "cvs -d $CVSROOT co -T $ports"; + chdir($TMPDIR); } # @@ -250,7 +188,7 @@ unless ($opt_n or $opt_c) { # { print "Updating Makefiles\n"; - foreach my $p (sort keys(%DEPPORTS)) { + foreach my $p (keys(%DEPPORTS)) { print "- Updating Makefile of $p\n"; next if $opt_c; bumpMakefile "$p"; |