public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] tools: Add cleanpatch
@ 2012-09-28  4:47 Fabio Estevam
  2012-09-28  5:29 ` Marek Vasut
  0 siblings, 1 reply; 5+ messages in thread
From: Fabio Estevam @ 2012-09-28  4:47 UTC (permalink / raw)
  To: u-boot

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

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 = <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);
+}
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [U-Boot] [PATCH] tools: Add cleanpatch
  2012-09-28  4:47 [U-Boot] [PATCH] tools: Add cleanpatch Fabio Estevam
@ 2012-09-28  5:29 ` Marek Vasut
  2012-09-28 12:42   ` Otavio Salvador
  0 siblings, 1 reply; 5+ messages in thread
From: Marek Vasut @ 2012-09-28  5:29 UTC (permalink / raw)
  To: u-boot

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);
> +
> + 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 = <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);
> +}

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] [PATCH] tools: Add cleanpatch
  2012-09-28  5:29 ` Marek Vasut
@ 2012-09-28 12:42   ` Otavio Salvador
  2012-09-28 13:19     ` Fabio Estevam
  0 siblings, 1 reply; 5+ messages in thread
From: Otavio Salvador @ 2012-09-28 12:42 UTC (permalink / raw)
  To: u-boot

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.

-- 
Otavio Salvador                             O.S. Systems
E-mail: otavio at ossystems.com.br  http://www.ossystems.com.br
Mobile: +55 53 9981-7854              http://projetos.ossystems.com.br

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] [PATCH] tools: Add cleanpatch
  2012-09-28 12:42   ` Otavio Salvador
@ 2012-09-28 13:19     ` Fabio Estevam
  2012-09-28 13:23       ` Otavio Salvador
  0 siblings, 1 reply; 5+ messages in thread
From: Fabio Estevam @ 2012-09-28 13:19 UTC (permalink / raw)
  To: u-boot

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.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [U-Boot] [PATCH] tools: Add cleanpatch
  2012-09-28 13:19     ` Fabio Estevam
@ 2012-09-28 13:23       ` Otavio Salvador
  0 siblings, 0 replies; 5+ messages in thread
From: Otavio Salvador @ 2012-09-28 13:23 UTC (permalink / raw)
  To: u-boot

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.

-- 
Otavio Salvador                             O.S. Systems
E-mail: otavio at ossystems.com.br  http://www.ossystems.com.br
Mobile: +55 53 9981-7854              http://projetos.ossystems.com.br

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-09-28 13:23 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-28  4:47 [U-Boot] [PATCH] tools: Add cleanpatch Fabio Estevam
2012-09-28  5:29 ` Marek Vasut
2012-09-28 12:42   ` Otavio Salvador
2012-09-28 13:19     ` Fabio Estevam
2012-09-28 13:23       ` Otavio Salvador

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox