summaryrefslogtreecommitdiff
path: root/pkgtools/pkgdiff/files/mkpatches.pl
diff options
context:
space:
mode:
Diffstat (limited to 'pkgtools/pkgdiff/files/mkpatches.pl')
-rwxr-xr-xpkgtools/pkgdiff/files/mkpatches.pl121
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;