The git command `git symbolic-ref <refname1> <refname2>` updates <refname1> to be a "symbolic" pointer to <refname2>. No matter what future value <refname2> takes on, <refname1> will continue to refer to that future value since it's "symbolic". Since commit 523fa69c36744ae6 ("reflog: cleanse messages in the refs.c layer", 2020-07-10, v2.29.0), the effect of using the aforementioned "symbolic-ref" command on ref logs has changed in an unexpected way. Add a new set of tests to exercise and demonstrate this change in preparation for correcting it (at which point the failing tests will be flipped from `test_expect_failure` to `test_expect_success`). The new test file can be used unchanged to examine this behavior in much older Git versions (likely to as far back as v2.6.0). Signed-off-by: Kyle J. McKay <mackyle@xxxxxxxxx> --- t/t1417-reflog-symref.sh | 91 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100755 t/t1417-reflog-symref.sh diff --git a/t/t1417-reflog-symref.sh b/t/t1417-reflog-symref.sh new file mode 100755 index 00000000..6149531f --- /dev/null +++ b/t/t1417-reflog-symref.sh @@ -0,0 +1,91 @@ +#!/bin/sh +# +# Copyright (c) 2021 Kyle J. McKay +# + +test_description='Test symbolic-ref effects on reflogs' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + +. ./test-lib.sh + +test_expect_success setup ' + test_commit 'initial' && + git checkout -b unu && + test_commit 'one' && + git checkout -b du && + test_commit 'two' && + git checkout -b tri && + test_commit 'three' && + git checkout du && + test_commit 'twofour' && + git checkout -b KVAR du && + test_commit 'four' && + unu="$(git rev-parse --verify unu)" && + du="$(git rev-parse --verify du)" && + tri="$(git rev-parse --verify tri)" && + kvar="$(git rev-parse --verify KVAR)" && + test -n "$unu" && + test -n "$du" && + test -n "$tri" && + test -n "$kvar" && + test "$unu" != "$du" && + test "$unu" != "$tri" && + test "$unu" != "$kvar" && + test "$du" != "$tri" && + test "$du" != "$kvar" && + test "$tri" != "$kvar" && + git symbolic-ref refs/heads/KVAR refs/heads/du && + kvarsym="$(git rev-parse --verify KVAR)" && + test "$kvarsym" = "$du" && + test "$kvarsym" != "$kvar" && + git reflog exists HEAD && + git reflog exists refs/heads/KVAR && + git symbolic-ref HEAD >/dev/null && + git symbolic-ref refs/heads/KVAR && + git checkout unu && + hcnt=$(git reflog show HEAD | wc -l) && + kcnt=$(git reflog show refs/heads/KVAR | wc -l) && + test -n "$hcnt" && + test -n "$kcnt" && + test $hcnt -gt 1 && + test $kcnt -gt 1 && + test $hcnt -ne $kcnt +' + +test_expect_failure 'HEAD reflog symbolic-ref' ' + hcnt1=$(git reflog show HEAD | wc -l) && + git symbolic-ref HEAD refs/heads/unu && + git symbolic-ref HEAD refs/heads/du && + git symbolic-ref HEAD refs/heads/tri && + hcnt2=$(git reflog show HEAD | wc -l) && + test $hcnt1 = $hcnt2 +' + +test_expect_failure 'refs/heads/KVAR reflog symbolic-ref' ' + kcnt1=$(git reflog show refs/heads/KVAR | wc -l) && + git symbolic-ref refs/heads/KVAR refs/heads/tri && + git symbolic-ref refs/heads/KVAR refs/heads/du && + git symbolic-ref refs/heads/KVAR refs/heads/unu && + kcnt2=$(git reflog show refs/heads/KVAR | wc -l) && + test $kcnt1 = $kcnt2 +' + +test_expect_failure 'double symref reflog symbolic-ref' ' + hcnt1=$(git reflog show HEAD | wc -l) && + kcnt1=$(git reflog show refs/heads/KVAR | wc -l) && + git symbolic-ref HEAD refs/heads/KVAR && + git symbolic-ref refs/heads/KVAR refs/heads/du && + git symbolic-ref refs/heads/KVAR refs/heads/unu && + git symbolic-ref refs/heads/KVAR refs/heads/tri && + git symbolic-ref HEAD refs/heads/du && + git symbolic-ref HEAD refs/heads/tri && + git symbolic-ref HEAD refs/heads/unu && + hcnt2=$(git reflog show HEAD | wc -l) && + kcnt2=$(git reflog show refs/heads/KVAR | wc -l) && + test $hcnt1 = $hcnt2 && + test $kcnt1 = $kcnt2 && + test $hcnt2 != $kcnt2 +' + +test_done --