diff options
Diffstat (limited to 'pkgtools/pkgdiff/files/mkpatches.pl')
-rwxr-xr-x | pkgtools/pkgdiff/files/mkpatches.pl | 121 |
1 files changed, 83 insertions, 38 deletions
diff --git a/pkgtools/pkgdiff/files/mkpatches.pl b/pkgtools/pkgdiff/files/mkpatches.pl index 6a62d5d09e2..a1625673b29 100755 --- a/pkgtools/pkgdiff/files/mkpatches.pl +++ b/pkgtools/pkgdiff/files/mkpatches.pl @@ -1,6 +1,6 @@ #!@PERL5@ # -# $NetBSD: mkpatches.pl,v 1.13 2008/02/16 22:21:35 apb Exp $ +# $NetBSD: mkpatches.pl,v 1.14 2011/02/02 10:23:02 wiz Exp $ # # mkpatches: creates a set of patches patch-aa, patch-ab, ... # in work/.newpatches by looking for *.orig files in and below @@ -13,7 +13,7 @@ # It retains the naming and header (RCS Id and comment) from the # patches directory. # -# Copyright (c) 2000 by Thomas Klausner <wiz@NetBSD.org> +# Copyright (c) 2000, 2011 by Thomas Klausner <wiz@NetBSD.org> # 2004 by Dieter Baron <dillo@NetBSD.org> # All Rights Reserved. Absolutely no warranty. # @@ -31,27 +31,27 @@ my %old_header; # create patchdir, or empty it if already existing sub create_patchdir { - if ( -d $patchdir ) { - unlink "$patchdir/*"; - } else { + if (! -d $patchdir) { mkdir($patchdir, 0755); } } # read command line arguments -undef($opt_d); +undef($opt_c); undef($opt_h); +undef($opt_r); undef($opt_v); -getopts('d:hv'); +getopts('chrv'); if ($opt_h) { ($prog) = ($0 =~ /([^\/]+)$/); print STDERR <<EOF; -usage: $prog [-d output-directory] - -d dirname directory to put the resulting patches into; - defaults to \$WRKDIR/.newpatches +usage: $prog [-chv] + -c commit -- clean up old patches backups + -h show this help + -r revert -- remove new patches, put old patches back -v verbose - list .orig files as processed EOF exit 0; @@ -62,15 +62,32 @@ EOF $wrkdir=`@MAKE@ show-var VARNAME=WRKDIR` or die ("can't find WRKDIR -- wrong dir?"); chomp($wrkdir); -$old_patchdir=`@MAKE@ show-var VARNAME=PATCHDIR` or +$patchdir=`@MAKE@ show-var VARNAME=PATCHDIR` or die ("can't find PATCHDIR -- wrong dir?"); -chomp($old_patchdir); +chomp($patchdir); + +if ($opt_c) { + open(HANDLE, "find ${patchdir} -type f -name \\\*.orig |"); + foreach (<HANDLE>) { + chomp; + unlink $_; + } + exit 0; +} -if ($opt_d) { - $patchdir = cwd()."/$opt_d"; -} -else { - $patchdir="$wrkdir"."/.newpatches"; +if ($opt_r) { + open(HANDLE, "find ${patchdir} -type f -name \\\*.orig |"); + foreach (<HANDLE>) { + chomp; + my $orig = $_; + my $new = $_; + $new =~ s/.orig$//; + rename $orig, $new; + if (! -s $new) { + unlink $new; + } + } + exit 0; } create_patchdir(); @@ -81,6 +98,8 @@ $wrksrc=`@MAKE@ show-var VARNAME=WRKSRC` or die ("can't find WRKSRC -- wrong dir?"); chomp($wrksrc); +move_away_old_patches(); + analyze_old_patches(); chdir $wrksrc or die ("can't cd to WRKSRC ($wrksrc)"); @@ -98,22 +117,18 @@ foreach (sort <HANDLE>) { $path = $_; $complete = $path; $complete =~ s/.orig$//; - $new = File::Spec->abs2rel( $complete, $wrksrc ); - $old = File::Spec->abs2rel( $path, $wrksrc ); - if ( -f $complete ) { + $new = File::Spec->abs2rel($complete, $wrksrc); + $old = File::Spec->abs2rel($path, $wrksrc); + if (-f $complete) { $patchfile = patch_name($new); if ($opt_v) { print "$patchfile -> $complete\n"; } - $diff=`pkgdiff $old $new`; - if ( $? ) { + $diff=`pkgdiff $old $new 2>&1`; + if ($?) { print "$old: $diff"; } - if ( "$diff" eq "" ) { - print ("$new and $old don't differ\n"); - } else { - make_patch($old, $new, $patchfile, $diff); - } + make_patch($old, $new, $patchfile, $diff); } else { print ("$new doesn't exist, though $old does\n"); } @@ -122,19 +137,28 @@ foreach (sort <HANDLE>) { sub analyze_old_patches { my $filename; + my $origfilename; my $patch; my $name; + my $checkname; %old_header = (); %old_filename = (); - open(HANDLE, "ls $old_patchdir/patch-* 2>/dev/null |"); + open(HANDLE, "ls $patchdir/patch-* 2>/dev/null |"); - while ($filename = <HANDLE>) { - chomp $filename; - $patch = `sed '/^\+\+\+/ q' $filename`; + while ($origfilename = <HANDLE>) { + chomp $origfilename; + next if not $origfilename =~ m/.orig$/; + $filename = $origfilename; + $filename =~ s/.orig$//; + $checkname = $origfilename; + if (! -s $checkname) { + $checkname = $filename; + } + $patch = `sed '/^\+\+\+/ q' $checkname`; if (!($patch =~ m/^\+\+\+ ([^\t\n]*)(\n$|\t)/m)) { - warn "cannot extract filename from patch $filename"; + warn "cannot extract filename from patch $checkname"; next; } $name = $1; @@ -148,6 +172,19 @@ sub analyze_old_patches close(HANDLE); } +sub move_away_old_patches +{ + open(HANDLE, "ls $patchdir/patch-* 2>/dev/null |"); + + while ($filename = <HANDLE>) { + chomp $filename; + next if $filename =~ m/.orig$/; + if (-f "$filename" and not -f "$filename.orig") { + rename "$filename", "$filename.orig"; + } + } + +} sub patch_name # filename { @@ -158,12 +195,11 @@ sub patch_name # filename return $old_filename{$name}; } - for ($l=0; ; $l++) { - $pname = 'patch-' . ("aa" .. "zz")[$l]; - if (! -f "$old_patchdir/$pname" and ! -f "$patchdir/$pname") { - return $pname; - } - } + $name =~ s,_,__,g; + $name =~ s,/,_,g; + $name = "patch-$name"; + + return $name; } @@ -171,6 +207,15 @@ sub make_patch # new old patchfile diff { my ($old, $new, $patchfile, $diff) = @_; + if ("$diff" eq "") { + print "$old and $new don't differ\n"; + if (-f "$patchdir/$patchfile.orig") { + rename "$patchdir/$patchfile.orig", "$patchdir/$patchfile"; + } + } + if (not -f "$patchdir/$patchfile.orig") { + system("touch", "$patchdir/$patchfile.orig"); + } if (defined($old_header{$new})) { $diff =~ s/^.*\n(--- )/$1/s; $diff = $old_header{$new} . $diff; |