^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #!/usr/bin/env perl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) # SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) # Clean a patch file -- or directory of patch files -- of stealth whitespace.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) # WARNING: this can be a highly destructive operation. Use with caution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) use warnings;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) use bytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) use File::Basename;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) # Default options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) $max_width = 79;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) # Clean up space-tab sequences, either by removing spaces or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) # replacing them with tabs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) sub clean_space_tabs($)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) no bytes; # Tab alignment depends on characters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) my($li) = @_;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) my($lo) = '';
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) my $pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) my $nsp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) my($i, $c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) for ($i = 0; $i < length($li); $i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) $c = substr($li, $i, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) if ($c eq "\t") {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) my $npos = ($pos+$nsp+8) & ~7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) my $ntab = ($npos >> 3) - ($pos >> 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) $lo .= "\t" x $ntab;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) $pos = $npos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) $nsp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) } elsif ($c eq "\n" || $c eq "\r") {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) $lo .= " " x $nsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) $pos += $nsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) $nsp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) $lo .= $c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) $pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) } elsif ($c eq " ") {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) $nsp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) $lo .= " " x $nsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) $pos += $nsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) $nsp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) $lo .= $c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) $pos++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) $lo .= " " x $nsp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) return $lo;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) # Compute the visual width of a string
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) sub strwidth($) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) no bytes; # Tab alignment depends on characters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) my($li) = @_;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) my($c, $i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) my $pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) my $mlen = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) for ($i = 0; $i < length($li); $i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) $c = substr($li,$i,1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) if ($c eq "\t") {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) $pos = ($pos+8) & ~7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) } elsif ($c eq "\n") {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) $mlen = $pos if ($pos > $mlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) $pos = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) $pos++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) $mlen = $pos if ($pos > $mlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) return $mlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) $name = basename($0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) @files = ();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) while (defined($a = shift(@ARGV))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if ($a =~ /^-/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if ($a eq '-width' || $a eq '-w') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) $max_width = shift(@ARGV)+0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) print STDERR "Usage: $name [-width #] files...\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) exit 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) push(@files, $a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) foreach $f ( @files ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) print STDERR "$name: $f\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) if (! -f $f) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) print STDERR "$f: not a file\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) if (!open(FILE, '+<', $f)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) print STDERR "$name: Cannot open file: $f: $!\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) binmode FILE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) # First, verify that it is not a binary file; consider any file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) # with a zero byte to be a binary file. Is there any better, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) # additional, heuristic that should be applied?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) $is_binary = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) while (read(FILE, $data, 65536) > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if ($data =~ /\0/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) $is_binary = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) last;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) if ($is_binary) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) print STDERR "$name: $f: binary file\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) next;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) seek(FILE, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) $in_bytes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) $out_bytes = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) $lineno = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) @lines = ();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) $in_hunk = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) $err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) while ( defined($line = <FILE>) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) $lineno++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) $in_bytes += length($line);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) if (!$in_hunk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) if ($line =~
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) $minus_lines = $2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) $plus_lines = $4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) if ($minus_lines || $plus_lines) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) $in_hunk = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) @hunk_lines = ($line);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) push(@lines, $line);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) $out_bytes += length($line);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) # We're in a hunk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) if ($line =~ /^\+/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) $plus_lines--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) $text = substr($line, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) $text =~ s/[ \t\r]*$//; # Remove trailing spaces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) $text = clean_space_tabs($text);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) $l_width = strwidth($text);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) if ($max_width && $l_width > $max_width) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) print STDERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) "$f:$lineno: adds line exceeds $max_width ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) "characters ($l_width)\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) push(@hunk_lines, '+'.$text);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) } elsif ($line =~ /^\-/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) $minus_lines--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) push(@hunk_lines, $line);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) } elsif ($line =~ /^ /) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) $plus_lines--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) $minus_lines--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) push(@hunk_lines, $line);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) print STDERR "$name: $f: malformed patch\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) $err = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) last;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) if ($plus_lines < 0 || $minus_lines < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) print STDERR "$name: $f: malformed patch\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) $err = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) last;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) } elsif ($plus_lines == 0 && $minus_lines == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) # End of a hunk. Process this hunk.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) my $i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) my $l;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) my @h = ();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) my $adj = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) my $done = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) for ($i = scalar(@hunk_lines)-1; $i > 0; $i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) $l = $hunk_lines[$i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) if (!$done && $l eq "+\n") {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) $adj++; # Skip this line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) } elsif ($l =~ /^[ +]/) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) $done = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) unshift(@h, $l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) unshift(@h, $l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) $l = $hunk_lines[0]; # Hunk header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) undef @hunk_lines; # Free memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) if ($adj) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) die unless
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) ($l =~ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@(.*)$/);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) my $mstart = $1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) my $mlin = $2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) my $pstart = $3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) my $plin = $4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) my $tail = $5; # doesn't include the final newline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) $l = sprintf("@@ -%d,%d +%d,%d @@%s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) $mstart, $mlin, $pstart, $plin-$adj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) $tail);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) unshift(@h, $l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) # Transfer to the output array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) foreach $l (@h) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) $out_bytes += length($l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) push(@lines, $l);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) $in_hunk = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) if ($in_hunk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) print STDERR "$name: $f: malformed patch\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) $err = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) if (!$err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if ($in_bytes != $out_bytes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) # Only write to the file if changed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) seek(FILE, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) print FILE @lines;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if ( !defined($where = tell(FILE)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) !truncate(FILE, $where) ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) die "$name: Failed to truncate modified file: $f: $!\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) close(FILE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) }