commit 4064588e9563c73b3a08166b9665a4c9b7c69ae1 from: Stefan Sperling via: Thomas Adam date: Sun Oct 17 10:13:58 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 - 4c573c7c79e170567111adc245c8f3d80ff7f879 commit + 4064588e9563c73b3a08166b9665a4c9b7c69ae1 blob - d983e298afbf41bdaf8560eb6a46db4c9148df0c blob + ccbf90715f4f221a82615360de55231aff22beda --- lib/send.c +++ lib/send.c @@ -508,6 +508,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 @@ -519,22 +521,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