5 chdir('patches') if -d 'patches';
7 if (!-f 'verify-patches') {
9 Please run this script from the root of the rsync dir or
10 from inside the patches subdir.
16 my($has_dependencies, @new);
23 open(IN, '../CVS/Root') or die $!;
27 my $tmpdir = ',tmp-for-patch-tests';
29 mkdir($tmpdir, 0777) unless -d $tmpdir;
30 chdir($tmpdir) or die "Unable to chdir to $tmpdir";
32 mkdir('workdir') unless -d 'workdir';
33 open(OUT, '>exclude') or die $!;
43 print "Using CVS to update the $tmpdir/cvsdir copy of the source.\n";
44 system qq|cvs -d "$root" co -d cvsdir rsync|;
46 @ARGV = glob('../*.diff') unless @ARGV;
49 foreach my $diff (@ARGV) {
50 next unless $diff =~ /\.diff$/;
51 next if $diff =~ /gzip-rsyncable\.diff$/;
52 $diff =~ s#^(patches|\.\.)/##;
54 open(IN, "../$diff") or die $!;
57 if (/^Depends-On-Patch: (\S+.diff)$/) {
59 $has_dependencies = 1;
60 print "\nApplying dependency patch $dep\n";
61 if (system("patch -d cvsdir -p0 -b -Vt -Z <../$dep") != 0) {
62 print "Unable to cleanly apply depenency patch -- skipping $diff\n";
71 my(@rejects, $default);
73 print "\n----------- $diff ------------\n";
77 system "rsync -a --delete cvsdir/ workdir";
78 open(IN, "patch -d workdir -p0 --no-backup-if-mismatch -Z <../$diff |") or die $!;
82 if (s/^patching file //) {
83 push(@new, $_) unless -f "cvsdir/$_";
84 } elsif (s/.* saving rejects to file //) {
86 } elsif (/^Hunk #\d+ FAILED/) {
88 } elsif (/^Hunk #\d+ succeeded/) {
89 $default = 'E' unless $default eq 'F';
93 if ($default eq 'N') {
94 generate_new_patch($diff);
95 if (system("diff ../$diff new.patch >/dev/null") == 0) {
96 print "\n(New patch is identical to old.)\n";
101 print "\nFix rejects, Edit both diffs, Update patch,\n",
102 "Apply patch again, Next, Quit: [$default] ";
105 $ans = $default unless $ans =~ s/^(\w)/$1/;
107 generate_new_patch($diff);
108 chdir('workdir') or die $!;
109 system "vim -d ../../$diff ../new.patch";
110 chdir('..') or die $!;
112 } elsif ($ans =~ /F/i) {
113 chdir('workdir') or die $!;
114 system "vim @rejects";
115 chdir('..') or die $!;
117 } elsif ($ans =~ /U/i) {
118 system "cp -p new.patch ../$diff";
119 print "\nUpdated $diff from new.patch\n";
121 } elsif ($ans =~ /A/i) {
123 } elsif ($ans =~ /N/i) {
125 } elsif ($ans =~ /Q/i) {
136 sub generate_new_patch
141 system "touch -r workdir/$_ cvsdir/$_";
143 open(IN, "../$diff") or die $!;
144 open(OUT, '>new.patch') or die $!;
150 open(IN, 'diff --exclude-from=exclude -upr cvsdir workdir |') or die $!;
152 next if /^(diff -|Index: |Only in )/;
153 s#^\Q--- cvsdir/\E#--- orig/#;
154 s#^\Q+++ workdir/\E#+++ #;
155 s#(\.000000000)? \+0000$##;
167 return unless $has_dependencies;
168 $has_dependencies = 0;
170 foreach (glob('*.~[1-9]~'), glob('*/*.~[1-9]~')) {
172 ($fn = $_) =~ s/\.~1~$//;