Commit 505b5d0c815a9b8f78bf7267e57ea433f04d0b6b

Carlos Martín Nieto 2013-05-07T16:01:22

remote: correctly interpret tagopt '--tags' When tagopt is set to '--tags', we should only take the default tags refspec into account and ignore any configured ones. Bring the code into compliance.

diff --git a/src/fetch.c b/src/fetch.c
index 8ae34bd..b5ec697 100644
--- a/src/fetch.c
+++ b/src/fetch.c
@@ -34,10 +34,16 @@ static int filter_ref__cb(git_remote_head *head, void *payload)
 
 	if (!p->found_head && strcmp(head->name, GIT_HEAD_FILE) == 0)
 		p->found_head = 1;
-	else if (git_remote__matching_refspec(p->remote, head->name))
+	else if (p->remote->download_tags == GIT_REMOTE_DOWNLOAD_TAGS_ALL) {
+		/*
+		 * If tagopt is --tags, then we only use the default
+		 * tags refspec and ignore the remote's
+		 */
+		if (git_refspec_src_matches(p->tagspec, head->name))
 			match = 1;
-	else if (p->remote->download_tags == GIT_REMOTE_DOWNLOAD_TAGS_ALL &&
-		 git_refspec_src_matches(p->tagspec, head->name))
+		else
+			return 0;
+	} else if (git_remote__matching_refspec(p->remote, head->name))
 			match = 1;
 
 	if (!match)
diff --git a/src/remote.c b/src/remote.c
index cba6b25..6925376 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -957,30 +957,38 @@ on_error:
 
 int git_remote_update_tips(git_remote *remote)
 {
-	git_refspec *spec;
+	git_refspec *spec, tagspec;
 	git_vector refs;
+	int error;
 	size_t i;
 
+
+	if (git_refspec__parse(&tagspec, GIT_REFSPEC_TAGS, true) < 0)
+		return -1;
+
 	if (git_vector_init(&refs, 16, NULL) < 0)
 		return -1;
 
-	if (git_remote_ls(remote, store_refs, &refs) < 0)
-		goto on_error;
+	if ((error = git_remote_ls(remote, store_refs, &refs)) < 0)
+		goto out;
+
+	if (remote->download_tags == GIT_REMOTE_DOWNLOAD_TAGS_ALL) {
+		error = update_tips_for_spec(remote, &tagspec, &refs);
+		goto out;
+	}
 
 	git_vector_foreach(&remote->refspecs, i, spec) {
 		if (spec->push)
 			continue;
 
-		if (update_tips_for_spec(remote, spec, &refs) < 0)
-			goto on_error;
+		if ((error = update_tips_for_spec(remote, spec, &refs)) < 0)
+			goto out;
 	}
 
+out:
+	git_refspec__free(&tagspec);
 	git_vector_free(&refs);
-	return 0;
-
-on_error:
-	git_vector_free(&refs);
-	return -1;
+	return error;
 }
 
 int git_remote_connected(git_remote *remote)
diff --git a/tests-clar/network/remote/local.c b/tests-clar/network/remote/local.c
index 74ef63d..3cb8a25 100644
--- a/tests-clar/network/remote/local.c
+++ b/tests-clar/network/remote/local.c
@@ -141,3 +141,20 @@ void test_network_remote_local__shorthand_fetch_refspec1(void)
 
 	cl_git_fail(git_reference_lookup(&ref, repo, "refs/tags/hard_tag"));
 }
+
+void test_network_remote_local__tagopt(void)
+{
+	git_reference *ref;
+
+	connect_to_local_repository(cl_fixture("testrepo.git"));
+	git_remote_set_autotag(remote, GIT_REMOTE_DOWNLOAD_TAGS_ALL);
+
+	cl_git_pass(git_remote_download(remote, NULL, NULL));
+	cl_git_pass(git_remote_update_tips(remote));
+
+
+	cl_git_fail(git_reference_lookup(&ref, repo, "refs/remotes/master"));
+
+	cl_git_pass(git_reference_lookup(&ref, repo, "refs/tags/hard_tag"));
+	git_reference_free(ref);
+}