Merge branch 'jk/blame-coalesce-fix'

When given more than one target line ranges, "git blame -La,b
-Lc,d" was over-eager to coalesce groups of original lines and
showed incorrect results, which has been corrected.

* jk/blame-coalesce-fix:
  blame: only coalesce lines that are adjacent in result
  t8003: factor setup out of coalesce test
  t8003: check output of coalesced blame
This commit is contained in:
Junio C Hamano 2020-08-19 16:14:49 -07:00
commit 93121dfd8c
2 changed files with 20 additions and 9 deletions

View File

@ -1184,6 +1184,7 @@ void blame_coalesce(struct blame_scoreboard *sb)
for (ent = sb->ent; ent && (next = ent->next); ent = next) {
if (ent->suspect == next->suspect &&
ent->s_lno + ent->num_lines == next->s_lno &&
ent->lno + ent->num_lines == next->lno &&
ent->ignored == next->ignored &&
ent->unblamable == next->unblamable) {
ent->num_lines += next->num_lines;

View File

@ -273,18 +273,14 @@ test_expect_success 'blame file with CRLF core.autocrlf=true' '
grep "A U Thor" actual
'
# Tests the splitting and merging of blame entries in blame_coalesce().
# The output of blame is the same, regardless of whether blame_coalesce() runs
# or not, so we'd likely only notice a problem if blame crashes or assigned
# blame to the "splitting" commit ('SPLIT' below).
test_expect_success 'blame coalesce' '
test_expect_success 'setup coalesce tests' '
cat >giraffe <<-\EOF &&
ABC
DEF
EOF
git add giraffe &&
git commit -m "original file" &&
oid=$(git rev-parse HEAD) &&
orig=$(git rev-parse HEAD) &&
cat >giraffe <<-\EOF &&
ABC
@ -293,6 +289,7 @@ test_expect_success 'blame coalesce' '
EOF
git add giraffe &&
git commit -m "interior SPLIT line" &&
split=$(git rev-parse HEAD) &&
cat >giraffe <<-\EOF &&
ABC
@ -300,12 +297,25 @@ test_expect_success 'blame coalesce' '
EOF
git add giraffe &&
git commit -m "same contents as original" &&
final=$(git rev-parse HEAD)
'
test_expect_success 'blame coalesce' '
cat >expect <<-EOF &&
$oid 1) ABC
$oid 2) DEF
$orig 1 1 2
$orig 2 2
EOF
git -c core.abbrev=$(test_oid hexsz) blame -s giraffe >actual &&
git blame --porcelain $final giraffe >actual.raw &&
grep "^$orig" actual.raw >actual &&
test_cmp expect actual
'
test_expect_success 'blame does not coalesce non-adjacent result lines' '
cat >expect <<-EOF &&
$orig 1) ABC
$orig 3) DEF
EOF
git blame --no-abbrev -s -L1,1 -L3,3 $split giraffe >actual &&
test_cmp expect actual
'