Date: Mon, 8 Mar 2004 14:43:30 +1100 (EST) From: Edwin Groothuis <edwin@mavetju.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: ports/63915: [new tool] bump_revision script Message-ID: <20040308034330.B2C6A6184@k7.mavetju> Resent-Message-ID: <200403080350.i283o4bO036993@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 63915 >Category: ports >Synopsis: [new tool] bump_revision script >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sun Mar 07 19:50:04 PST 2004 >Closed-Date: >Last-Modified: >Originator: Edwin Groothuis >Release: FreeBSD 5.2.1-RELEASE i386 >Organization: - >Environment: System: FreeBSD k7.mavetju 5.2.1-RELEASE FreeBSD 5.2.1-RELEASE #3: Fri Feb 27 13:54:29 EST 2004 edwin@k7.mavetju:/usr/src/sys/i386/compile/k7 i386 >Description: Small script to bump the PORTREVISION variable of ports which are depending on a port with a changed shared lib version. History: I'm about to commit ports/57475, which included a version bump for libsdl.so from 5 to 6. That means for 199 ports I need to udpate the PORTREVISION. I don't want to do this manually :-) >How-To-Repeat: >Fix: Suggested directory: Tools/scripts. #!/usr/bin/perl -w # $FreeBSD$ # # Author: Edwin Groothuis <edwin@freebsd.org> # use Getopt::Std; use strict; use Cwd; use Data::Dumper; use vars qw/$opt_i $opt_u/; sub usage { print <<EOF; Usage: $0 [options] [<category>/]<portname> -u <username> - Your freebsd.org username. Defaults to \$ENV{USER}. -i <filename> - Use this for INDEX name. Defaults to /usr/ports/INDEX. Questions, suggestions etc -> edwin\@freebsd.org EOF exit 1; } my $INDEX="/usr/ports/INDEX"; my $USER=$ENV{USER}; { $opt_i=""; $opt_u=""; getopts("i:u:"); $INDEX=$opt_i if ($opt_i); $USER=$opt_u if ($opt_u); die "$INDEX doesn't seem to exist. Please check the value supplied with -i or use -i." if (! -f $INDEX); } my $PORT=$ARGV[0]; usage() if (!$PORT); my $CVSROOT=":ext:$USER\@pcvs.freebsd.org:/home/pcvs"; # # Read the index, save some interesting keys # my %index=(); { print "Reading $INDEX\n"; open(FIN,"$INDEX") or die "Cannot open $INDEX for reading."; my @lines=<FIN>; chomp(@lines); close(FIN); foreach my $line (@lines) { my @a=split(/\|/,$line); my @b=split(/\//,$a[1]); my $port=$b[-2]."/".$b[-1]; $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]); foreach my $b (@b) { $index{$port}{deps}{$b}=1; } } } my @k=keys(%index); print "- Processed ",$#k+1," entries.\n"; } # # 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. # if (defined $index{$PORT}) { # all okay } else { my $count=0; my $n=""; foreach my $p (keys(%index)) { if ($p=~/\/$PORT$/) { $n.=" " if ($n); $n.=$p; $count++; } } 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"; # # Figure out all the ports depending on this one. # 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"; } } my @k=keys(%DEPPORTS); print "- Found ",$#k+1," ports depending on it.\n"; } # # Create a temp directory and cvs checkout the ports # (don't do error checking, too complicated right now) # my $TMPDIR=getcwd()."/.tmpdir.$$"; { mkdir($TMPDIR,0755); chdir($TMPDIR); `cvs -d $CVSROOT co -T $ports`; } chdir($TMPDIR); # # Bump portrevisions # { print "Updating Makefiles\n"; foreach my $p (keys(%DEPPORTS)) { my $makefile="ports/$p/Makefile"; print "- Updating Makefile of $p\n"; if (!open(FIN,$makefile)) { print "-- Cannot open Makefile of $p, ignored.\n"; next; } my @lines=<FIN>; close(FIN); chomp(@lines); my $revision=1; foreach my $line (@lines) { last if ($line=~/^MAINTAINER/); $revision+=$1 if ($line=~/PORTREVISION=[ \t](\d+)$/); } my $printedrev=0; open(FOUT,">$makefile"); foreach my $line (@lines) { if (!$printedrev) { if ($line=~/^CATEGORIES=/ || $line=~/^PORTREVISION=/) { print FOUT "PORTREVISION= $revision\n"; $printedrev=1; } } next if ($line=~/^PORTREVISION=/); print FOUT "$line\n"; } close(FOUT); } } # # Commit the changes. Not automated. # print <<EOF; All portrevisions have been updated. You are nearly done, only one thing remains: The commiting in the ports tree. This program is not going to do that for you, you have to do it manually. \$ cd $TMPDIR/ports \$ cvs commit Then, remove the temp directory. EOF >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040308034330.B2C6A6184>