#!/usr/bin/perl while($patchpath = shift(@ARGV)) { $patch = $patchpath; $patch =~ s#.*/##; $patch =~ s/\.(bz2|gz)$//; print "$patchpath $patch\n"; if (-d $patch) { system ("rm -rf $patch"); } mkdir($patch) || die; $openpatch = $patchpath; $openpatch = "zcat $patchpath |" if ($patchpath =~ /\.gz$/); $openpatch = "bzcat $patchpath |" if ($patchpath =~ /\.bz2$/); open(PATCH, $openpatch) || die "Cannot open $openpatch"; undef $/; @chunks = split(/^diff /m, ); # $/ = "\ndiff "; # @chunks = ; close(PATCH); shift(@chunks); print $#chunks . "\n"; foreach $chunk (@chunks) { $chunk =~ s/^/diff /; $chunk =~ /^diff .* (\S+)\s+(\S+)$/m; $filename = $1; $filename =~ s#^[^/]+/##; write_to_file("${patch}/${filename}", $chunk); } } sub write_to_file { my ($file, $data) = @_; # recursively make directories we'll need for this file my $path; @elements = split (/\//, $file); pop (@elements); # ditch the end filename, we just need dirs foreach $element (@elements) { $path .= $element . '/'; mkdir($path) if (! -d $path); } open (OUTPUT, "> $file") || die; print OUTPUT $data; close (OUTPUT); }