#! /usr/bin/perl use strict; use warnings; die "$0 'git diff -U999999 old..new|' new.report\n" if @ARGV!=1; my %h; { local *DIFF; open DIFF,$ARGV[0] or die $ARGV[0]; my($from,$fromline,$to,$toline); local $_; while () { chomp; next if /^diff /; next if /^index /; next if /^new file mode /; next if /^deleted file mode /; if (m{^--- a/(\S+)$}) { $from=$1; $fromline=0; next; } if (m{^\Q+++\E b/(\S+)$}) { $to=$1; $toline=0; next; } next if /^@@ -[10](?:,\d+)? [+][10](?:,\d+)? @@(?:)$/; if (/^ /) { $fromline++; $toline++; } elsif (/^-/) { $fromline++; } elsif (/^[+]/) { $toline++; } else { die; } $h{$from}{$fromline}=[$to,$toline]; } close DIFF or die $ARGV[0]; } { local $_; while () { s{[(]([^():\s]+):(\d+)[)]}{ my($basename,$line)=($1,$2); my $filename="gdb/$basename"; my $r=$h{$filename}{$line}; if ($r) { die "$filename->".$r->[0] if $r->[0] ne $filename; $line=$r->[1]; } "($basename:$line)"; }e; print; } }