Commit Diff


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