In 'builtin/name-rev.c' in the name_rev() function there is a loop iterating over all parents of the given commit, and the loop body looks like this: if (parent_number > 1) { if (generation > 0) // do stuff #1 else // do stuff #2 } else { // do stuff #3 } These conditions are not covered properly in the test suite. As far as purely test coverage goes, they are all executed several times over in 't6120-describe.sh'. However, they don't directly influence the command's output, because the repository used in that test script contains several branches and tags pointing somewhere into the middle of the commit DAG, and thus result in a better name for the to-be-named commit. In an early version of this patch series I managed to mess up those conditions (every single one of them at once!), but the whole test suite still passed successfully. So add a new test case that operates on the following history: -----------master / / A----------M2 \ / \---M1-C \ / B and names the commit 'B', where: - The merge commit at master makes sure that the 'do stuff #3' affects the final name. - The merge commit M2 make sure that the 'do stuff #1' part affects the final name. - And M1 makes sure that the 'do stuff #2' part affects the final name. Signed-off-by: SZEDER Gábor <szeder.dev@xxxxxxxxx> --- t/t6120-describe.sh | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh index 07e6793e84..2a0f2204c4 100755 --- a/t/t6120-describe.sh +++ b/t/t6120-describe.sh @@ -421,4 +421,47 @@ test_expect_success 'describe complains about missing object' ' test_must_fail git describe $ZERO_OID ' +# -----------master +# / / +# A----------M2 +# \ / +# \---M1-C +# \ / +# B +test_expect_success 'test' ' + git init repo && + ( + cd repo && + + echo A >file && + git add file && + git commit -m A && + A=$(git rev-parse HEAD) && + + git checkout --detach && + echo B >file && + git commit -m B file && + B=$(git rev-parse HEAD) && + + git checkout $A && + git merge --no-ff $B && # M1 + + echo C >file && + git commit -m C file && + + git checkout $A && + git merge --no-ff HEAD@{1} && # M2 + + git checkout master && + git merge --no-ff HEAD@{1} && + + git log --graph --oneline && + + echo "$B master^2^2~1^2" >expect && + git name-rev $B >actual && + + test_cmp expect actual + ) +' + test_done -- 2.23.0.331.g4e51dcdf11