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>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
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;