commit 924100791157ab7f6842e7c7b5bd225c00ad5aab from: Stefan Sperling date: Sat Oct 16 14:50:03 2021 UTC fix regression where 'got send -T' failed if same tag already exists on server Problem reported and fix tested by Omar Polo. commit - 2e3a6c3be72d70d3e58780d82d7545cd0a3d9e82 commit + 924100791157ab7f6842e7c7b5bd225c00ad5aab blob - 7250f245c5c0f1d67211774b2cb6c6c571879eec blob + 0576ad42d0f1ba289507bd309c4b24c1bb0f2dbb --- lib/send.c +++ lib/send.c @@ -511,6 +511,8 @@ got_send_pack(const char *remote_name, struct got_path if (!got_ref_name_is_valid(refname)) continue; + if (strncmp(refname, "refs/tags/", 10) == 0) + is_tag = 1; /* * Find out whether this is a reference we want to upload. * Otherwise we can still use this reference as a hint to @@ -522,22 +524,19 @@ got_send_pack(const char *remote_name, struct got_path err = got_ref_resolve(&my_id, repo, my_ref); if (err) goto done; - if (got_object_id_cmp(my_id, their_id) != 0) + if (got_object_id_cmp(my_id, their_id) != 0) { + if (!overwrite_refs && is_tag) { + err = got_error_fmt( + GOT_ERR_SEND_TAG_EXISTS, + "%s", refname); + free(my_id); + goto done; + } refs_to_send++; + } free(my_id); - } - if (strncmp(refname, "refs/tags/", 10) == 0) - is_tag = 1; - - /* Prevent tags from being overwritten by default. */ - if (!overwrite_refs && my_ref && is_tag) { - err = got_error_fmt(GOT_ERR_SEND_TAG_EXISTS, - "%s", refname); - goto done; - } - /* Check if their object exists locally. */ err = got_object_open(&obj, repo, their_id); if (err) { blob - bf7378666fbaffcdef506f93bd3df20d0c8e454b blob + 3eb8e7e29c0385103d644e4f76b51d8f5f478922 --- regress/cmdline/send.sh +++ regress/cmdline/send.sh @@ -679,6 +679,24 @@ EOF got tag -l -r $testroot/repo-clone | grep ^tag | sort > $testroot/stdout echo "tag 1.0 $tag_id" > $testroot/stdout.expected echo "tag 2.0 $tag_id2" >> $testroot/stdout.expected + cmp -s $testroot/stdout $testroot/stdout.expected + ret="$?" + if [ "$ret" != "0" ]; then + diff -u $testroot/stdout.expected $testroot/stdout + test_done "$testroot" "$ret" + return 1 + fi + + # Send the same tags again. This should be a no-op. + got send -q -r $testroot/repo -T > $testroot/stdout 2> $testroot/stderr + ret="$?" + if [ "$ret" != "0" ]; then + echo "got send command failed unexpectedly" >&2 + test_done "$testroot" "$ret" + return 1 + fi + + echo -n > $testroot/stdout.expected cmp -s $testroot/stdout $testroot/stdout.expected ret="$?" if [ "$ret" != "0" ]; then