From: Mark Jamsek Subject: commit coverage of new backout/cherrypick logmsg refs To: Game of Trees Date: Sun, 29 Jan 2023 23:31:11 +1100 The below diff adds a test covering the commit side of the new logmsg ref feature, and incidentally, albeit not completely, covers the revert aspect too. We test for: - multiple logmsg refs being used in one commit - only relevant logmsg refs being used in a commit involving multiple bo/cy operations preceding a revert - logmsg ref is used when affected paths are committed following a partial revert - logmsg ref is neither used nor deleted when the affected paths are not included in a commit - previously unused logmsg ref is subsequently used when the affected paths are committed - we don't litter the tree with got-logmsg-* tmp files On the last point, the diff also includes a change to cmd_commit() to delete the merged_log tmp file. diffstat /home/mark/src/got M got/got.c | 3+ 0- M regress/cmdline/commit.sh | 259+ 0- 2 files changed, 262 insertions(+), 0 deletions(-) diff /home/mark/src/got commit - 71a61c8ccc19248c397974fbd63b952d2665771c path + /home/mark/src/got blob - 872cc74858a6d9a7d5be7fffffe97fc4f28c9927 file + got/got.c --- got/got.c +++ got/got.c @@ -9203,6 +9203,9 @@ done: error == NULL) error = got_error_from_errno2("unlink", cl_arg.logmsg_path); free(cl_arg.logmsg_path); + if (merged_logmsg && unlink(merged_logmsg) == -1 && error == NULL) + error = got_error_from_errno2("unlink", merged_logmsg); + free(merged_logmsg); if (repo) { const struct got_error *close_err = got_repo_close(repo); if (error == NULL) blob - bf310d5b1b095c5545625bae6cba5acc7abc8a66 file + regress/cmdline/commit.sh --- regress/cmdline/commit.sh +++ regress/cmdline/commit.sh @@ -1719,6 +1719,264 @@ test_parseargs "$@" test_done "$testroot" 0 } +test_commit_logmsg_ref() { + local testroot=`test_init commit_logmsg_ref` + + got checkout $testroot/repo $testroot/wt > /dev/null + ret=$? + if [ $ret -ne 0 ]; then + test_done "$testroot" "$ret" + return 1 + fi + + (cd $testroot/repo && git checkout -q -b newbranch) + + local bo_logmsg_prefix="log message of backed-out commit" + local cy_logmsg_prefix="log message of cherrypicked commit" + local branch_rev_logmsg="changes on newbranch to cherrypick" + local branch_rev2_logmsg="modified zeta on newbranch to cherrypick" + + echo "modified delta on branch" > $testroot/repo/gamma/delta + echo "modified alpha on branch" > $testroot/repo/alpha + (cd $testroot/repo && git rm -q beta) + echo "new file on branch" > $testroot/repo/epsilon/new + (cd $testroot/repo && git add epsilon/new) + + git_commit $testroot/repo -m "$branch_rev_logmsg" + local branch_rev=`git_show_head $testroot/repo` + + echo "modified zeta on branch" > $testroot/repo/epsilon/zeta + + git_commit $testroot/repo -m "$branch_rev2_logmsg" + local branch_rev2=`git_show_head $testroot/repo` + + (cd $testroot/wt && got cherrypick $branch_rev > /dev/null) + (cd $testroot/wt && got cherrypick $branch_rev2 > /dev/null) + + cat > $testroot/editor.sh < /dev/null) + ret=$? + if [ $ret -ne 0 ]; then + echo "'got commit' failed unexpectedly" >&2 + test_done "$testroot" "1" + return 1 + fi + + # check that multiple cherrypicked log messages populate the editor + local first=`printf '%s\n%s' $branch_rev $branch_rev2 | sort | head -1` + local second=`printf '%s\n%s' $branch_rev $branch_rev2 | sort | tail -1` + + if [ $branch_rev == $first ]; then + local first_msg=$branch_rev_logmsg + local second_msg=$branch_rev2_logmsg + else + local first_msg=$branch_rev2_logmsg + local second_msg=$branch_rev_logmsg + fi + + echo " $cy_logmsg_prefix $first:" > $testroot/stdout.expected + echo " $first_msg" >> $testroot/stdout.expected + echo " " >> $testroot/stdout.expected + echo " $cy_logmsg_prefix $second:" >> $testroot/stdout.expected + echo " $second_msg" >> $testroot/stdout.expected + echo " " >> $testroot/stdout.expected + + (cd $testroot/wt && got log -l2 | \ + grep -A2 'log message' | sed '/^--/d' > $testroot/stdout) + + cmp -s $testroot/stdout.expected $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + # check that only the relevant log message populates the editor + # when the changes from one of two backout commits are reverted + got checkout $testroot/repo $testroot/wt2 > /dev/null + ret=$? + if [ $ret -ne 0 ]; then + test_done "$testroot" "$ret" + return 1 + fi + + (cd $testroot/wt2 && got backout $branch_rev > /dev/null) + (cd $testroot/wt2 && got backout $branch_rev2 > /dev/null) + (cd $testroot/wt2 && got revert epsilon/zeta > /dev/null) + + (cd $testroot/wt2 && env VISUAL="$testroot/editor.sh" \ + got commit > /dev/null) + ret=$? + if [ $ret -ne 0 ]; then + echo "'got commit' failed unexpectedly" >&2 + test_done "$testroot" "1" + return 1 + fi + + echo " $bo_logmsg_prefix $branch_rev:" > $testroot/stdout.expected + echo " $branch_rev_logmsg" >> $testroot/stdout.expected + echo " " >> $testroot/stdout.expected + + (cd $testroot/wt2 && got log -l1 | \ + grep -A2 'log message' > $testroot/stdout) + + cmp -s $testroot/stdout.expected $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + # check that a cherrypicked log message is still + # used when its changes are only partially reverted + branch_rev_logmsg="changes to cherrypick and partially revert" + + echo "newline in alpha" >> $testroot/repo/alpha + echo "modified epsilon/zeta on branch" > $testroot/repo/epsilon/zeta + + git_commit $testroot/repo -m "$branch_rev_logmsg" + branch_rev=`git_show_head $testroot/repo` + + (cd $testroot/wt && got cherrypick $branch_rev > /dev/null) + (cd $testroot/wt && got revert alpha > /dev/null) + + (cd $testroot/wt && env VISUAL="$testroot/editor.sh" \ + got commit > /dev/null) + ret=$? + if [ $ret -ne 0 ]; then + echo "'got commit' failed unexpectedly" >&2 + test_done "$testroot" "1" + return 1 + fi + + echo " $cy_logmsg_prefix $branch_rev:" > $testroot/stdout.expected + echo " $branch_rev_logmsg" >> $testroot/stdout.expected + echo " " >> $testroot/stdout.expected + + (cd $testroot/wt && got log -l1 | \ + grep -A2 'log message' > $testroot/stdout) + + cmp -s $testroot/stdout.expected $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + # check we don't use and consequently delete the logmsg ref of a + # cherrypicked commit when omitting its changed path from the commit + branch_rev_logmsg="changes to cherrypick but omit from the commit" + + echo "changed delta" >> $testroot/repo/gamma/delta + + git_commit $testroot/repo -m "$branch_rev_logmsg" + local author_time=`git_show_author_time $testroot/repo` + local d=`date -u -r $author_time +"%a %b %e %X %Y UTC"` + branch_rev=`git_show_head $testroot/repo` + + (cd $testroot/wt && got update > /dev/null) + ret=$? + if [ $ret -ne 0 ]; then + echo "got update failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + + (cd $testroot/wt && got cherrypick $branch_rev > /dev/null) + + echo "changed alpha" >> $testroot/wt/alpha + + (cd $testroot/wt && got commit -m \ + "don't commit cy change to gamma/delta" alpha > /dev/null) + ret=$? + if [ $ret -ne 0 ]; then + echo "'got commit' failed unexpectedly" >&2 + test_done "$testroot" "1" + return 1 + fi + + # confirm logmsg ref was not deleted with got cherrypick -l + echo "-----------------------------------------------" \ + > $testroot/stdout.expected + echo "commit $branch_rev (newbranch)" >> $testroot/stdout.expected + echo "from: $GOT_AUTHOR" >> $testroot/stdout.expected + echo "date: $d" >> $testroot/stdout.expected + echo " " >> $testroot/stdout.expected + echo " $branch_rev_logmsg" >> $testroot/stdout.expected + echo " " >> $testroot/stdout.expected + echo " M gamma/delta" >> $testroot/stdout.expected + echo >> $testroot/stdout.expected + + (cd $testroot/wt && got cherrypick -l > $testroot/stdout) + + cmp -s $testroot/stdout.expected $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + # confirm a previously unused logmsg ref is picked up + # when an affected path is actually committed + (cd $testroot/wt && env VISUAL="$testroot/editor.sh" \ + got commit > /dev/null) + ret=$? + if [ $ret -ne 0 ]; then + echo "'got commit' failed unexpectedly" >&2 + test_done "$testroot" "1" + return 1 + fi + + echo " $cy_logmsg_prefix $branch_rev:" > $testroot/stdout.expected + echo " $branch_rev_logmsg" >> $testroot/stdout.expected + echo " " >> $testroot/stdout.expected + + (cd $testroot/wt && got log -l1 | \ + grep -A2 'log message' > $testroot/stdout) + + cmp -s $testroot/stdout.expected $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + # make sure we are not littering work trees + # by leaving temp got-logmsg-* files behind + echo -n > $testroot/stdout.expected + (cd $testroot/wt && got status > $testroot/stdout) + + cmp -s $testroot/stdout.expected $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + echo "$testroot/wt is not clean" + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + (cd $testroot/wt2 && got status > $testroot/stdout) + + cmp -s $testroot/stdout.expected $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + echo "$testroot/repo is not clean" + diff -u $testroot/stdout.expected $testroot/stdout + fi + test_done "$testroot" "$ret" +} + test_parseargs "$@" run_test test_commit_basic run_test test_commit_new_subdir @@ -1749,3 +2007,4 @@ run_test test_commit_bad_author run_test test_commit_large_file run_test test_commit_gitignore run_test test_commit_bad_author +run_test test_commit_logmsg_ref -- Mark Jamsek GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68