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@xxxxxxxxx> 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); _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel