[PATCH 2/3] Use File::Find rather than find and xargs in git-archimport
From: Jason Riedy <hidden>
Date: 2016-06-15 22:42:18
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted>
---
git-archimport.perl | 39 +++++++++++++++++++++++++++++----------
1 files changed, 29 insertions(+), 10 deletions(-)
8e7119df3d59da189baa741d44b04e7c8da2c421diff --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