From: Jon Smirl Date: Sun, 22 Jul 2007 23:45:58 GMT Subject: Re: Git help for kernel archeology, suppress diffs caused by CVS keyword expansion Message-ID: <9e4733910707221645x21d74e70y3c43bc8c02a9d4ca@mail.gmail.com> In-Reply-To: On 7/22/07, Johannes Schindelin wrote: > As you already did, this is my attempt at a perl script... Feel free to > bash my Perl capabilities, or to correct it... I don't really know Perl but Perl is probably a better language for this. I was doing it in C. This doesn't run on the two full kernel samples I sent you. That's the problem I was having, I can catch 95% of the expanded keywords with my program but I have to touch up 5% by hand. I'll stare at this and see if I can increase my understanding of Perl. > > Ciao, > Dscho > > -- snipsnap -- > #!/usr/bin/perl > > sub init_hunk { > $_ = $_[0]; > $current_hunk = ""; > $current_hunk_header = $_; > ($start_minus, $dummy, $start_plus, $dummy) = > /^\@\@ -(\d+)(,\d+|) \+(\d+)(,\d+|) \@\@/; > $plus = $minus = $space = 0; > $skip_logs = 0; > } > > sub flush_hunk { > if ($plus > 0 || $minus > 0) { > if ($current_file ne "") { > print $current_file; > $current_file = ""; > } > $minus += $space; > $plus += $space; > print "\@\@ -$start_minus,$minus " > . "+$start_plus,$plus \@\@\n"; > print $current_hunk; > } > } > > sub check_file { > $_ = $_[0]; > $current_file = $_; > while (<>) { > if (/^\@\@/) { > last; > } > $current_file .= $_; > } > > init_hunk $_; > > # check hunks > while (<>) { > if ($skip_logs && /^\+ *\*/) { > # do nothing > } elsif (/^\@\@.*/) { > flush_hunk; > init_hunk $_; > } elsif (/^diff/) { > flush_hunk; > return; > } elsif (/^-.*\$(Id|Revision|Author|Date).*\$/) { > $key = $1; > s/^-/ /; > $current_hunk .= $_; > $space++; > $_ = <>; > if (!/\+.*\$Id.*\$/) { > die "Expected some changed \$$key line: $_"; > } > $skip_logs = 0; > } elsif (/^ .*\$Log.*\$/) { > $current_hunk .= $_; > $space++; > $skip_logs++; > } elsif (/^ /) { > $current_hunk .= $_; > $space++; > $skip_logs = 0; > } elsif (/^\+/) { > $current_hunk .= $_; > $plus++; > } elsif (/^-/) { > $current_hunk .= $_; > $minus++; > $skip_logs = 0; > } else { > die "Unexpected line: $_"; > } > } > } > > while (<>) { > if (/^diff/) { > do { > check_file $_; > } while(/^diff/); > } else { > printf $_; > } > } > -- Jon Smirl jonsmirl@gmail.com