commit fb8e08fd0336dfc0bb04096a31ce3e326bf6d1e8 from: Stefan Sperling via: Thomas Adam date: Sat Nov 16 10:31:04 2024 UTC fix bogus "reference not found" error from 'got send' When a reference exists on the server but not locally, 'got send' could fail to ignore this reference as intended, raising an error instead. Add a test case for this isssue. commit - 32cda8560bceecc6155bc6011c69e9e9a7c262c0 commit + fb8e08fd0336dfc0bb04096a31ce3e326bf6d1e8 blob - 44aa5f0a6244130706709c0184fc170d90f6fe5c blob + 69d89b78451413629dc1fc7ede0086ec2236a101 --- lib/send.c +++ lib/send.c @@ -589,6 +589,7 @@ got_send_pack(const char *remote_name, struct got_path if (err) { if (err->code != GOT_ERR_NOT_REF) goto done; + err = NULL; } else { err = got_ref_resolve(&their_ids[ntheirs], repo, ref); blob - 5053abcc3b14deece4bb33886f4380b7fe2e9bd0 blob + 833f87bb85b0f4cf72b87af23b71df99419de359 --- regress/cmdline/send.sh +++ regress/cmdline/send.sh @@ -1729,7 +1729,102 @@ EOF diff -u $testroot/stderr.expected $testroot/stderr fi test_done "$testroot" "$ret" + +} + +test_send_with_unknown_ref_on_server() { + local testroot=`test_init send_with_unknown_ref_on_server` + local testurl=ssh://127.0.0.1/$testroot + local commit_id=`git_show_head $testroot/repo` + + got clone -q $testurl/repo $testroot/repo-clone + ret=$? + if [ $ret -ne 0 ]; then + echo "got clone command failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + + # Add a commit on a new branch in the source repo. + # To trigger a known bug in 'got send', this branch reference must + # alphabetically sort last. + git -C $testroot/repo checkout -q -b zzz + echo "modified alpha" > $testroot/repo/alpha + git -C $testroot/repo rm -q beta + (cd $testroot/repo && ln -s epsilon/zeta symlink) + git -C $testroot/repo add symlink + echo "new file alpha" > $testroot/repo/new + git -C $testroot/repo add new + git_commit $testroot/repo -m "modified alpha" + local commit_id2=`git_show_head $testroot/repo` + + # This would error "got: reference refs/remotes/origin/zzz not found" + got send -r $testroot/repo-clone > $testroot/stdout \ + 2> $testroot/stderr + ret=$? + if [ $ret -ne 0 ]; then + echo "got send command failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + + echo "Connecting to \"origin\" ssh://127.0.0.1$testroot/repo" \ + > $testroot/stdout.expected + echo "Already up-to-date" >> $testroot/stdout.expected + cmp -s $testroot/stdout $testroot/stdout.expected + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + got ref -l -r $testroot/repo > $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + echo "got ref command failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + + echo "HEAD: refs/heads/zzz" > $testroot/stdout.expected + echo "refs/heads/master: $commit_id" >> $testroot/stdout.expected + echo "refs/heads/zzz: $commit_id2" >> $testroot/stdout.expected + + cmp -s $testroot/stdout $testroot/stdout.expected + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + got ref -l -r $testroot/repo-clone > $testroot/stdout + ret=$? + if [ $ret -ne 0 ]; then + echo "got ref command failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + + echo "HEAD: refs/heads/master" > $testroot/stdout.expected + echo "refs/heads/master: $commit_id" >> $testroot/stdout.expected + echo "refs/remotes/origin/HEAD: refs/remotes/origin/master" \ + >> $testroot/stdout.expected + echo "refs/remotes/origin/master: $commit_id" \ + >> $testroot/stdout.expected + + cmp -s $testroot/stdout $testroot/stdout.expected + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + git_fsck "$testroot" "$testroot/repo-clone" + ret=$? + test_done "$testroot" "$ret" } test_parseargs "$@" @@ -1749,3 +1844,4 @@ run_test test_send_config no-sha256 run_test test_send_gitconfig no-sha256 run_test test_send_rejected no-sha256 run_test test_send_basic_http no-sha256 +run_test test_send_with_unknown_ref_on_server no-sha256