lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20110719183023.GB6445@shale.localdomain>
Date:	Tue, 19 Jul 2011 21:30:23 +0300
From:	Dan Carpenter <error27@...il.com>
To:	joe@...ches.com
Cc:	Andrew Morton <akpm@...ux-foundation.org>,
	devel@...verdev.osuosl.org, linux-kernel@...r.kernel.org
Subject: [patch] Add scripts/rename_review.pl

rename_review.pl is a tool for reviewing refactoring patches that
rename variables.  You pipe a diff to it, and it strips out the
renames and the white space changes and leaves the more complicated
and interesting code changes.

Signed-off-by: Dan Carpenter <error27@...il.com>

diff --git a/scripts/rename_review.pl b/scripts/rename_review.pl
new file mode 100755
index 0000000..2cc7b6f
--- /dev/null
+++ b/scripts/rename_review.pl
@@ -0,0 +1,154 @@
+#!/usr/bin/perl
+
+# This is a tool to help review variable rename patches. The goal is
+# to strip out the automatic sed renames and the white space changes
+# and leaves the interesting code changes.
+#
+# Example 1: A patch renames openInfo to open_info:
+#     cat diff | rename_review.pl openInfo open_info
+#
+# Example 2: A patch swaps the first two arguments to some_func():
+#     cat diff | rename_review.pl \
+#                    -e 's/some_func\((.*?),(.*?),/some_func\($2, $1,/'
+#
+# Example 3: A patch removes the xkcd_ prefix from some but not all the
+# variables.  Instead of trying to figure out which variables were renamed
+# just remove the prefix from them all:
+#     cat diff | rename_review.pl -ea 's/xkcd_//g'
+#
+# Example 4: A patch renames 20 CamelCase variables.  To review this let's
+# just ignore all case changes and all '_' chars.
+#     cat diff | rename_review -ea 'tr/[A-Z]/[a-z]/' -ea 's/_//g'
+#
+# The other arguments are:
+# -nc removes comments
+# -ns removes '\' chars if they are at the end of the line.
+
+use strict;
+use File::Temp qw/ :mktemp  /;
+
+sub usage() {
+    print "usage: cat diff | $0 old new old new old new...\n";
+    print "   or: cat diff | $0 -e 's/old/new/g'\n";
+    print " -e : execute on old lines\n";
+    print " -ea: execute on all lines\n";
+    print " -nc: strip one line comments\n";
+    print " -ns: no slashes at the end of a line\n";
+    exit(1);
+}
+my @subs;
+my @cmds;
+my $strip_comments;
+my $strip_slashes;
+
+sub filter($) {
+    my $_ = shift();
+    my $old = 0;
+    if ($_ =~ /^-/) {
+        $old = 1;
+    }
+    # remove the first char
+    s/^[ +-]//;
+    if ($strip_comments) {
+        s/\/\*.*?\*\///g;
+        s/\/\/.*//;
+    }
+    foreach my $cmd (@cmds) {
+        if ($old || $cmd->[0] =~ /^-ea$/) {
+		eval $cmd->[1];
+	}
+    }
+    foreach my $sub (@subs) {
+	if ($old) {
+		s/$sub->[0]/$sub->[1]/g;
+	}
+    }
+    return $_;
+}
+
+while (my $param1 = shift()) {
+    if ($param1 =~ /^-nc$/) {
+        $strip_comments = 1;
+        next;
+    }
+    if ($param1 =~ /^-ns$/) {
+        $strip_slashes = 1;
+        next;
+    }
+    my $param2 = shift();
+    if ($param2 =~ /^$/) {
+	usage();
+    }
+    if ($param1 =~ /^-e(a|)$/) {
+        push @cmds, [$param1, $param2];
+	next;
+    }
+    push @subs, [$param1, $param2];
+}
+
+my ($oldfh, $oldfile) = mkstemp("/tmp/oldXXXXX");
+my ($newfh, $newfile) = mkstemp("/tmp/newXXXXX");
+
+while (<>) {
+    if ($_ =~ /^(---|\+\+\+)/) {
+	next;
+    }
+    my $output = filter($_);
+    if ($_ =~ /^-/) {
+	print $oldfh $output;
+	next;
+    }
+    if ($_ =~ /^\+/) {
+	print $newfh $output;
+	next;
+    }
+    print $oldfh $output;
+    print $newfh $output;
+}
+
+my $hunk;
+my $old_txt;
+my $new_txt;
+
+open diff, "diff -uw $oldfile $newfile |";
+while (<diff>) {
+    if ($_ =~ /^(---|\+\+\+)/) {
+	next;
+    }
+
+    if ($_ =~ /^@/) {
+	if ($old_txt ne $new_txt) {
+ 	    print $hunk;
+	    print $_;
+	}
+	$hunk = "";
+	$old_txt = "";
+	$new_txt = "";
+	next;
+    }
+
+    $hunk = $hunk . $_;
+
+    if ($strip_slashes) {
+	s/\\$//;
+    }
+
+    if ($_ =~ /^-/) {
+	s/-//;
+	s/[ \t\n]//g;
+	$old_txt = $old_txt . $_;
+	next;
+    }
+    if ($_ =~ /^\+/) {
+	s/\+//;
+	s/[ \t\n]//g;
+	$new_txt = $new_txt . $_;
+	next;
+    }
+}
+if ($old_txt ne $new_txt) {
+    print $hunk;
+}
+
+unlink($oldfile);
+unlink($newfile);

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ