From: Jason Riedy Date: Sat, 11 Feb 2006 02:52:03 GMT Subject: [PATCH 2/3] Use File::Find rather than find and xargs in git-archimport Message-ID: <549.1139626323@lotus.CS.Berkeley.EDU> git-archimport uses find and xargs directly to find and apply patches. Replace these by File::Find and save one call to find. Tested on Solaris 8 with a quite complex, interrelated set of Arch repos. Hopefully handles {arch} subdirectories correctly. Thanks to Randal Schwartz for pointing out the problem. Signed-off-by: Jason Riedy --- git-archimport.perl | 39 +++++++++++++++++++++++++++++---------- 1 files changed, 29 insertions(+), 10 deletions(-) 8e7119df3d59da189baa741d44b04e7c8da2c421 diff --git a/git-archimport.perl b/git-archimport.perl index 841738d..ffdf742 100755 --- a/git-archimport.perl +++ b/git-archimport.perl @@ -60,6 +60,7 @@ use Getopt::Std; use File::Temp qw(tempdir); use File::Path qw(mkpath rmtree); use File::Basename qw(basename dirname); +use File::Find; use Data::Dumper qw/ Dumper /; use IPC::Open2; @@ -664,17 +665,35 @@ sub apply_cset { # get the changeset safe_pipe_capture($TLA,'get-changeset',$ps->{id},"$tmp/changeset"); die "Cannot get changeset: $!" if $?; - + + my @patchlist; + my $wanted_patches = sub { + # We want all those non-empty *.patch files that do not modify + # arch state. The preprocess argument strips out {arch}. + if (-f && !-z && /^.*\.patch$/) { + push @patchlist, $File::Find::name; + } + if ($File::Find::dir =~ /\{arch\}/) { + print STDERR "AUGH! tested " . $File::Find::name . "\n"; + } + }; # perl note: This needs to be an anonymous sub to share + # @patchlist correctly. + # apply patches - if (`find $tmp/changeset/patches -type f -name '*.patch'`) { - # this can be sped up considerably by doing - # (find | xargs cat) | patch - # but that cna get mucked up by patches - # with missing trailing newlines or the standard - # 'missing newline' flag in the patch - possibly - # produced with an old/buggy diff. - # slow and safe, we invoke patch once per patchfile - `find $tmp/changeset/patches -type f -name '*.patch' -print0 | grep -zv '{arch}' | xargs -iFILE -0 --no-run-if-empty patch -p1 --forward -iFILE`; + + # this can be sped up considerably by applying all the patches in + # one pass, as with + # (find | xargs cat) | patch + # but that can get mucked up by patches with missing trailing + # newlines or the standard 'missing newline' flag in the patch - + # possibly produced with an old/buggy diff. + # slow and safe, we invoke patch once per patchfile + + File::Find ({wanted => $wanted_patches, + preprocess => sub { grep(!/^\{arch\}$/, @_); }}, + $tmp . "/changeset/patches"); + foreach my $patchname (@patchlist) { + safe_pipe_capture("patch", "-p1", "--forward", "-i", $patchname); die "Problem applying patches! $!" if $?; } -- 1.1.6.g0d39d