Commit a1be77cd3534c09b0710794a44a0aed6fd6c3e21

Carlos Martín Nieto 2011-08-07T14:27:47

Be smarter about selecting wants There is no need to inspect what the local repository is like. Only check whether the objects exist locally. Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>

diff --git a/include/git2/net.h b/include/git2/net.h
index 7c49f80..d4f4755 100644
--- a/include/git2/net.h
+++ b/include/git2/net.h
@@ -52,8 +52,7 @@ GIT_BEGIN_DECL
  * Remote head description, given out on `ls` calls.
  */
 struct git_remote_head {
-	int local:1, /* available locally */
-	    want:1; /* want to update */
+	int local:1; /* available locally */
 	git_oid oid;
 	git_oid loid;
 	char *name;
diff --git a/src/fetch.c b/src/fetch.c
index e00b2e3..ccc8aa0 100644
--- a/src/fetch.c
+++ b/src/fetch.c
@@ -61,8 +61,6 @@ static int filter_wants(git_remote *remote)
 	}
 
 	for (i = 0; i < refs.len; ++i) {
-		char local[1024];
-		git_reference *ref;
 		git_remote_head *head = refs.heads[i];
 
 		/* If it doesn't match the refpec, we don't want it */
@@ -74,34 +72,10 @@ static int filter_wants(git_remote *remote)
 			goto cleanup;
 		}
 
-		/* If the local ref is the same, we don't want it either */
-		error = git_refspec_transform(local, sizeof(local), spec, head->name);
-		if (error < GIT_SUCCESS) {
-			error = git__rethrow(error, "Error transforming ref name");
-			goto cleanup;
-		}
-
-		error = git_reference_lookup(&ref, repo, local);
-		/* If we don't have it locally, it's new, so we want it */
-		if (error < GIT_SUCCESS && error != GIT_ENOTFOUND) {
-			error = git__rethrow(error, "Error looking up local ref");
-			goto cleanup;
-		}
-
-		if (ref != NULL) {
-			if (!git_oid_cmp(&head->oid, git_reference_oid(ref)))
-				continue;
-
+		/* If we have the object, mark it so we don't ask for it */
+		if (git_odb_exists(repo->db, &head->oid))
 			head->local = 1;
-			git_oid_cpy(&head->loid, git_reference_oid(ref));
-		}
 
-		/*
-		 * Now we know we want to have that ref, so add it as a "want"
-		 * to the list, storing the local oid for that branch so we
-		 * don't have to look for it again.
-		 */
-		head->want = 1;
 		error = git_vector_insert(&list, head);
 		if (error < GIT_SUCCESS)
 			goto cleanup;