diff --git a/support-d/utils/hashfinder b/support-d/utils/hashfinder index 88df4ce5cc..b402f6552b 100755 --- a/support-d/utils/hashfinder +++ b/support-d/utils/hashfinder @@ -35,9 +35,9 @@ # hashfinder - Find origin of a particular line of code # - my $file = shift; my $regex = shift; +my $alt_file = shift; my $delim = " "; $file and $regex or die "missing params. Syntax: "; @@ -58,7 +58,9 @@ sub doit($$) { $linematch = 1; } - open GIT, "git blame -n $file $rev|"; + retry: + + open GIT, "git blame -n $file $rev 2>&1|"; my $mc = 0; my @matches = (); @@ -66,6 +68,14 @@ sub doit($$) { while () { my $matched = 0; + if (/fatal:/) { + if ($alt_file) { + $file = $alt_file; + $alt_file = undef; + goto retry; + } + } + if ($linematch) { $matched = (/^\S+\s+$pattern\s+/); } else { @@ -81,7 +91,6 @@ sub doit($$) { close(GIT); - if ($mc > 5) { print $delim x $loops; print "$mc matches; Maybe more specific?\n"; @@ -100,10 +109,11 @@ sub doit($$) { my ($hash, $lno, $author, $line); my $done = 0; - if (/$file/) { + if (/\//) { ($hash, $lno, $author, $line) = /(\S+)\s+\S+\s+(\S+)\s+(\([^\)]+\))\s*(.*)/; $done = 1; } else { + die $_; ($hash, $lno, $author, $line) = /(\S+)\s+(\S+)\s+(\([^\)]+\))\s*(.*)/; }