Message ID | 4e3d7233095064de197c447cb31cf4652d42b775.1588347029.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Integrating line-log and changed-path Bloom filters | expand |
On Fri, May 01, 2020 at 03:30:26PM +0000, SZEDER Gábor via GitGitGadget wrote: > From: =?UTF-8?q?SZEDER=20G=C3=A1bor?= <szeder.dev@gmail.com> > > None of the tests in 't4211-line-log.sh' really check which parent > object IDs are shown in the output, either implicitly as part of > "Merge: ..." lines [1] or explicitly via the '%p' or '%P' format > specifiers in a custom pretty format. > > Add two tests to 't4211-line-log.sh' to check which parent object IDs > are shown, one without and one with explicitly requested parent > rewriting, IOW without and with the '--parents' option. > > The test without '--parents' is marked as failing, because without > that option parent rewriting should not be performed, and thus the > parent object ID should be that of the immediate parent, just like in > case of a pathspec-limited history traversal without parent rewriting. > The current line-level log implementation, however, performs parent > rewriting unconditionally and without a possibility to turn it off, > and, consequently, it shows the object ID of the most recent ancestor > that modified the given line range. > > In both of these new tests we only really care about the object IDs of > the listed commits and their parents, but not the diffs of the line > ranges; the diffs have already been thoroughly checked in the previous > tests. > > [1] While one of the tests ('-M -L ':f:b.c' parallel-change') does > list a merge commit, both of its parents happen to modify the > given line range and are listed as well, so the implications of > parent rewriting remained hidden and untested. > > Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com> > Signed-off-by: Derrick Stolee <dstolee@microsoft.com> > --- These tests make sense, and demonstrate the problem nicely. I don't think that I have a ton to add to this patch, so: Reviewed-by: Taylor Blau <me@ttaylorr.com> Thanks, Taylor
diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh index cda58186c2d..ea4a9398365 100755 --- a/t/t4211-line-log.sh +++ b/t/t4211-line-log.sh @@ -215,4 +215,72 @@ test_expect_success 'fancy rename following #2' ' test_cmp expect actual ' +# Create the following linear history, where each commit does what its +# subject line promises: +# +# * 66c6410 Modify func2() in file.c +# * 50834e5 Modify other-file +# * fe5851c Modify func1() in file.c +# * 8c7c7dd Add other-file +# * d5f4417 Add func1() and func2() in file.c +test_expect_success 'setup for checking line-log and parent oids' ' + git checkout --orphan parent-oids && + git reset --hard && + + cat >file.c <<-\EOF && + int func1() + { + return F1; + } + + int func2() + { + return F2; + } + EOF + git add file.c && + test_tick && + git commit -m "Add func1() and func2() in file.c" && + + echo 1 >other-file && + git add other-file && + git commit -m "Add other-file" && + + sed -e "s/F1/F1 + 1/" file.c >tmp && + mv tmp file.c && + git commit -a -m "Modify func1() in file.c" && + + echo 2 >other-file && + git commit -a -m "Modify other-file" && + + sed -e "s/F2/F2 + 2/" file.c >tmp && + mv tmp file.c && + git commit -a -m "Modify func2() in file.c" && + + head_oid=$(git rev-parse --short HEAD) && + prev_oid=$(git rev-parse --short HEAD^) && + root_oid=$(git rev-parse --short HEAD~4) +' + +# Parent oid should be from immediate parent. +test_expect_failure 'parent oids without parent rewriting' ' + cat >expect <<-EOF && + $head_oid $prev_oid Modify func2() in file.c + $root_oid Add func1() and func2() in file.c + EOF + git log --format="%h %p %s" --no-patch -L:func2:file.c >actual && + test_cmp expect actual +' + +# Parent oid should be from the most recent ancestor touching func2(), +# i.e. in this case from the root commit. +test_expect_success 'parent oids with parent rewriting' ' + cat >expect <<-EOF && + $head_oid $root_oid Modify func2() in file.c + $root_oid Add func1() and func2() in file.c + EOF + git log --format="%h %p %s" --no-patch -L:func2:file.c --parents >actual && + test_cmp expect actual +' + test_done