On Thu, 25 Jul 2002, Andrew Morton wrote:
> This script which someone wrote will break the diff into
> standalone chunks.
This one might work better.
#!/usr/bin/perl -w
#
# Copyright (c) 2002, Thunder from the hill <thunder@ngforever.de>
#
# $ld: split-patches,v 0.10.2 2002/06/01 00:40:49 GMT thunder Exp $
#
# -----------------------------------------------------------------
# Distribution of this script is permitted under the terms of the
# GNU General Public License (GNU GPL) v2.
# -----------------------------------------------------------------
#
# This perl script splits patch files and sorts them as unified format into
# a tree form which is being taken from the patches.
#
require 5.004;
my @path;
my $i;
my $inbuf;
my $minusline;
my $filename;
my $fullname;
my $plusname;
my $minusname;
my $lines_applied = 0;
my $lines_dropped = 0;
my $lines_converted = 0;
my $fd_open = 0;
while (defined($inbuf = <>)) {
$inbuf =~ s/\r//g;
if ($inbuf =~ /^\+\+\+\s+/) {
# "Control" sequence - decode filename and change it
local ($shortname,$bigpath, $pdate, $mdate) = (0,"","");
$plusname = $inbuf;
$plusname =~ s/^\+\+\+\s+([\w\d\+\-\.\/]+)\s+[\w\d\,\:\s]+[\+\-]?\d*[\w\d\.\,\s\/\(\)\-\+]*$/$1/;
$minusline =~s/\r//g;
$minusname = $minusline;
$minusname =~ s/^\-\-\-\s+([\w\d\+\-\.\/]+)\s+[\w\d\,\:\s]+[\+\-]?\d*[\w\d\.\,\s\/\(\)\-\+]*$/$1/;
if ($plusname eq "/dev/null") {
$filename = $minusname;
} else {
$filename = $plusname;
}
$fullname = $filename;
@path = split("/", $filename);
shift(@path);
$filename = join("/", @path);
$shortname = $path[-1];
for ($i = 0; $i < scalar(@path)-1; $i++) {
if ($i == 0) {
$bigpath = $path[0];
} else {
$bigpath = sprintf("%s/%s", $bigpath, $path[$i]);
}
if (! -d $bigpath) {
printf(STDERR "Creating directory %s\n", $bigpath);
mkdir($bigpath, 0775);
}
}
if ($fd_open) {
close(FileDescriptor);
}
if ($minusname eq "/dev/null") {
printf(STDERR "Creating \"%s\"\n", $filename);
} elsif ($plusname eq "/dev/null") {
printf(STDERR "Removing \"%s\"\n", $filename);
} else {
printf(STDERR "Patching \"%s\"\n", $filename);
}
if (!open(FileDescriptor, sprintf(">%s.diff", $filename))) {
die(sprintf("Error %s opening \"%s\" for writing.\n",$!,$filename));
} else {
$fd_open = 1;
}
$pdate = $inbuf;
$pdate =~ s/^\+\+\+\s+[\w\d\+\-\.\/]+\s+([\w\d\,\:\s]+[\+\-]?\d*)[\w\d\.\,\s\/\(\)\-\+]*$/$1/;
if (!($pdate =~ /\s[\+\-]\d\d\d\d$/)) {
$pdate .= " +0000";
} else {
$pdate =~ s/[\+\-]\d\d\d\d$/\+0000/;
}
$mdate = $minusline;
$mdate =~ s/^\+\+\+\s+[\w\d\+\-\.\/]+\s+([\w\d\,\:\s]+[\+\-]?\d*)[\w\d\.\,\s\/\(\)\-\+]*$/$1/;
if (!($mdate =~ /\s[\+\-]\d\d\d\d$/)) {
$mdate .= " +0000";
} else {
$mdate =~ s/[\+\-]\d\d\d\d$/\+0000/;
}
$pdate =~ s/\r//;
$pdate =~ s/\n//;
$mdate =~ s/\r//;
$mdate =~ s/\n//;
printf(FileDescriptor "diff -Nur %s %s\n--- %s %s\n+++ %s %s\n", $minusname, $plusname, $minusname, $mdate, $plusname, $pdate);
} elsif ($inbuf =~ /^\-\-\-\s+/) {
# Header lines, skip (we had our own version at the beginning
# of the diff split
$minusline = $inbuf;
} elsif ($inbuf =~ /^[\+\- ]/) {
# Unified diff line, just commit
$inbuf =~ s/\n//g;
if ($fd_open) {
printf(FileDescriptor "%s\n", $inbuf);
$lines_applied++;
} else {
if (!$lines_dropped) {
printf("Junk at beginning of patch\n");
}
$lines_dropped++;
}
} elsif ($inbuf =~ /^[\<\>]/) {
# Convert to unified diff and apply
$inbuf =~ s/\n//g;
$inbuf =~ s/^\</-/;
$inbuf =~ s/^\>/+/;
if ($fd_open) {
printf(FileDescriptor "%s\n", $inbuf);
$lines_converted++;
} else {
if (!$lines_dropped) {
printf("Junk at beginning of patch\n");
}
$lines_dropped++;
}
} elsif ($inbuf =~ /^@@/) {
# Line section change; apply please
$inbuf =~ s/\n//g;
if ($fd_open) {
printf(FileDescriptor "%s\n", $inbuf);
$lines_applied++;
} else {
if (!$lines_dropped) {
printf("Junk at beginning of patch\n");
}
$lines_dropped++;
}
} else {
$lines_dropped++;
}
}
if ($fd_open) {
close(FileDescriptor);
$fd_open = 0;
}
printf("\nApplied: %i, dropped: %i, converted: %i\n", $lines_applied, $lines_dropped, $lines_converted);
exit(0);
Thunder
-- I promise you one day we'll again have lots of time If you like, just arrange the sun that day to shine Upon both of our graves- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/