Re: Git help for kernel archeology, suppress diffs caused by CVS keyword expansion

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 7/22/07, Johannes Schindelin <Johannes.Schindelin@xxxxxx> 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@xxxxxxxxx
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux