Patchwork [U-Boot] tools: Add cleanpatch

login
register
mail settings
Submitter Fabio Estevam
Date Sept. 28, 2012, 4:47 a.m.
Message ID <1348807675-3776-1-git-send-email-festevam@gmail.com>
Download mbox | patch
Permalink /patch/187716/
State Superseded
Delegated to: Tom Rini
Headers show

Comments

Fabio Estevam - Sept. 28, 2012, 4:47 a.m.
From: Fabio Estevam <fabio.estevam@freescale.com>

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.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
---
 tools/cleanpatch |  258 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 258 insertions(+)
 create mode 100755 tools/cleanpatch
Marek Vasut - Sept. 28, 2012, 5:29 a.m.
Dear Fabio Estevam,

> From: Fabio Estevam <fabio.estevam@freescale.com>
> 
> 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 <fabio.estevam@freescale.com>
> ---
>  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);
> +
> +@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 = <FILE>) ) {
> +	$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);
> +}
Otavio Salvador - Sept. 28, 2012, 12:42 p.m.
On Fri, Sep 28, 2012 at 2:29 AM, Marek Vasut <marex@denx.de> wrote:
> Dear Fabio Estevam,
>
>> From: Fabio Estevam <fabio.estevam@freescale.com>
>>
>> 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).

Please take it from master so it is easier to track from the hash.
Using the stable tree will force the check of another tree.
Fabio Estevam - Sept. 28, 2012, 1:19 p.m.
On Fri, Sep 28, 2012 at 9:42 AM, Otavio Salvador
<otavio@ossystems.com.br> wrote:

> Please take it from master so it is easier to track from the hash.
> Using the stable tree will force the check of another tree.

I don't understand your explanation.

As suggested by Marek I will point to this commit in my patch description:

commit cb3ed5b7e09c6c0462e396d55e3fecc0980a333a
Author: H. Peter Anvin <hpa@zytor.com>
Date:   Fri May 25 17:58:26 2007 -0700

    scripts: Make cleanfile/cleanpatch warn about long lines

    Make the "cleanfile" and "cleanpatch" script warn about long lines,
    by default lines whose visual width exceeds 79 characters.

    Per suggestion from Auke Kok.

    Signed-off-by: H. Peter Anvin <hpa@zytor.com>
    Signed-off-by: Sam Ravnborg <sam@ravnborg.org>

,which is the same commit id in linux-stable, linus master, linux-next.
Otavio Salvador - Sept. 28, 2012, 1:23 p.m.
On Fri, Sep 28, 2012 at 10:19 AM, Fabio Estevam <festevam@gmail.com> wrote:
> On Fri, Sep 28, 2012 at 9:42 AM, Otavio Salvador
> <otavio@ossystems.com.br> wrote:
>
>> Please take it from master so it is easier to track from the hash.
>> Using the stable tree will force the check of another tree.
>
> I don't understand your explanation.
>
> As suggested by Marek I will point to this commit in my patch description:
>
> commit cb3ed5b7e09c6c0462e396d55e3fecc0980a333a
> Author: H. Peter Anvin <hpa@zytor.com>
> Date:   Fri May 25 17:58:26 2007 -0700
>
>     scripts: Make cleanfile/cleanpatch warn about long lines
>
>     Make the "cleanfile" and "cleanpatch" script warn about long lines,
>     by default lines whose visual width exceeds 79 characters.
>
>     Per suggestion from Auke Kok.
>
>     Signed-off-by: H. Peter Anvin <hpa@zytor.com>
>     Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
>
> ,which is the same commit id in linux-stable, linus master, linux-next.

Oh, so it is the same. Good.

Patch

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);
+
+@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 = <FILE>) ) {
+	$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);
+}