From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Fri, 28 Sep 2012 07:29:30 +0200 Subject: [U-Boot] [PATCH] tools: Add cleanpatch In-Reply-To: <1348807675-3776-1-git-send-email-festevam@gmail.com> References: <1348807675-3776-1-git-send-email-festevam@gmail.com> Message-ID: <201209280729.30776.marex@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Dear Fabio Estevam, > From: Fabio Estevam > > There are some errors reported by checkpatch.pl that can be easily cleaned > up by using the cleanpatch tool. > > Import the cleanpatch script from linux kernel 3.5.4 stable version. Sweet %^) Can you add the revision of the file from Linux kernel into the comment please? I think if you run git log on the file, it's the first two or three lines you put here (Author and Hash). > Signed-off-by: Fabio Estevam > --- > tools/cleanpatch | 258 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 258 > insertions(+) > create mode 100755 tools/cleanpatch > > diff --git a/tools/cleanpatch b/tools/cleanpatch > new file mode 100755 > index 0000000..9680d03 > --- /dev/null > +++ b/tools/cleanpatch > @@ -0,0 +1,258 @@ > +#!/usr/bin/perl -w > +# > +# Clean a patch file -- or directory of patch files -- of stealth > whitespace. +# WARNING: this can be a highly destructive operation. Use > with caution. +# > + > +use bytes; > +use File::Basename; > + > +# Default options > +$max_width = 79; > + > +# Clean up space-tab sequences, either by removing spaces or > +# replacing them with tabs. > +sub clean_space_tabs($) > +{ > + no bytes; # Tab alignment depends on characters > + > + my($li) = @_; > + my($lo) = ''; > + my $pos = 0; > + my $nsp = 0; > + my($i, $c); > + > + for ($i = 0; $i < length($li); $i++) { > + $c = substr($li, $i, 1); > + if ($c eq "\t") { > + my $npos = ($pos+$nsp+8) & ~7; > + my $ntab = ($npos >> 3) - ($pos >> 3); > + $lo .= "\t" x $ntab; > + $pos = $npos; > + $nsp = 0; > + } elsif ($c eq "\n" || $c eq "\r") { > + $lo .= " " x $nsp; > + $pos += $nsp; > + $nsp = 0; > + $lo .= $c; > + $pos = 0; > + } elsif ($c eq " ") { > + $nsp++; > + } else { > + $lo .= " " x $nsp; > + $pos += $nsp; > + $nsp = 0; > + $lo .= $c; > + $pos++; > + } > + } > + $lo .= " " x $nsp; > + return $lo; > +} > + > +# Compute the visual width of a string > +sub strwidth($) { > + no bytes; # Tab alignment depends on characters > + > + my($li) = @_; > + my($c, $i); > + my $pos = 0; > + my $mlen = 0; > + > + for ($i = 0; $i < length($li); $i++) { > + $c = substr($li,$i,1); > + if ($c eq "\t") { > + $pos = ($pos+8) & ~7; > + } elsif ($c eq "\n") { > + $mlen = $pos if ($pos > $mlen); > + $pos = 0; > + } else { > + $pos++; > + } > + } > + > + $mlen = $pos if ($pos > $mlen); > + return $mlen; > +} > + > +$name = basename($0); > + > + at files = (); > + > +while (defined($a = shift(@ARGV))) { > + if ($a =~ /^-/) { > + if ($a eq '-width' || $a eq '-w') { > + $max_width = shift(@ARGV)+0; > + } else { > + print STDERR "Usage: $name [-width #] files...\n"; > + exit 1; > + } > + } else { > + push(@files, $a); > + } > +} > + > +foreach $f ( @files ) { > + print STDERR "$name: $f\n"; > + > + if (! -f $f) { > + print STDERR "$f: not a file\n"; > + next; > + } > + > + if (!open(FILE, '+<', $f)) { > + print STDERR "$name: Cannot open file: $f: $!\n"; > + next; > + } > + > + binmode FILE; > + > + # First, verify that it is not a binary file; consider any file > + # with a zero byte to be a binary file. Is there any better, or > + # additional, heuristic that should be applied? > + $is_binary = 0; > + > + while (read(FILE, $data, 65536) > 0) { > + if ($data =~ /\0/) { > + $is_binary = 1; > + last; > + } > + } > + > + if ($is_binary) { > + print STDERR "$name: $f: binary file\n"; > + next; > + } > + > + seek(FILE, 0, 0); > + > + $in_bytes = 0; > + $out_bytes = 0; > + $lineno = 0; > + > + @lines = (); > + > + $in_hunk = 0; > + $err = 0; > + > + while ( defined($line = ) ) { > + $lineno++; > + $in_bytes += length($line); > + > + if (!$in_hunk) { > + if ($line =~ > + /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@/) { > + $minus_lines = $2; > + $plus_lines = $4; > + if ($minus_lines || $plus_lines) { > + $in_hunk = 1; > + @hunk_lines = ($line); > + } > + } else { > + push(@lines, $line); > + $out_bytes += length($line); > + } > + } else { > + # We're in a hunk > + > + if ($line =~ /^\+/) { > + $plus_lines--; > + > + $text = substr($line, 1); > + $text =~ s/[ \t\r]*$//; # Remove trailing spaces > + $text = clean_space_tabs($text); > + > + $l_width = strwidth($text); > + if ($max_width && $l_width > $max_width) { > + print STDERR > + "$f:$lineno: adds line exceeds $max_width ", > + "characters ($l_width)\n"; > + } > + > + push(@hunk_lines, '+'.$text); > + } elsif ($line =~ /^\-/) { > + $minus_lines--; > + push(@hunk_lines, $line); > + } elsif ($line =~ /^ /) { > + $plus_lines--; > + $minus_lines--; > + push(@hunk_lines, $line); > + } else { > + print STDERR "$name: $f: malformed patch\n"; > + $err = 1; > + last; > + } > + > + if ($plus_lines < 0 || $minus_lines < 0) { > + print STDERR "$name: $f: malformed patch\n"; > + $err = 1; > + last; > + } elsif ($plus_lines == 0 && $minus_lines == 0) { > + # End of a hunk. Process this hunk. > + my $i; > + my $l; > + my @h = (); > + my $adj = 0; > + my $done = 0; > + > + for ($i = scalar(@hunk_lines)-1; $i > 0; $i--) { > + $l = $hunk_lines[$i]; > + if (!$done && $l eq "+\n") { > + $adj++; # Skip this line > + } elsif ($l =~ /^[ +]/) { > + $done = 1; > + unshift(@h, $l); > + } else { > + unshift(@h, $l); > + } > + } > + > + $l = $hunk_lines[0]; # Hunk header > + undef @hunk_lines; # Free memory > + > + if ($adj) { > + die unless > + ($l =~ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+), ([0-9]+)\s\@\@(.*)$/); > + my $mstart = $1; > + my $mlin = $2; > + my $pstart = $3; > + my $plin = $4; > + my $tail = $5; # doesn't include the final newline > + > + $l = sprintf("@@ -%d,%d +%d,%d @@%s\n", > + $mstart, $mlin, $pstart, $plin-$adj, > + $tail); > + } > + unshift(@h, $l); > + > + # Transfer to the output array > + foreach $l (@h) { > + $out_bytes += length($l); > + push(@lines, $l); > + } > + > + $in_hunk = 0; > + } > + } > + } > + > + if ($in_hunk) { > + print STDERR "$name: $f: malformed patch\n"; > + $err = 1; > + } > + > + if (!$err) { > + if ($in_bytes != $out_bytes) { > + # Only write to the file if changed > + seek(FILE, 0, 0); > + print FILE @lines; > + > + if ( !defined($where = tell(FILE)) || > + !truncate(FILE, $where) ) { > + die "$name: Failed to truncate modified file: $f: $!\n"; > + } > + } > + } > + > + close(FILE); > +}