Commit a1be77cd by Carlos Martín Nieto Committed by Vicent Marti

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>
parent 1564db11
...@@ -52,8 +52,7 @@ GIT_BEGIN_DECL ...@@ -52,8 +52,7 @@ GIT_BEGIN_DECL
* Remote head description, given out on `ls` calls. * Remote head description, given out on `ls` calls.
*/ */
struct git_remote_head { struct git_remote_head {
int local:1, /* available locally */ int local:1; /* available locally */
want:1; /* want to update */
git_oid oid; git_oid oid;
git_oid loid; git_oid loid;
char *name; char *name;
......
...@@ -61,8 +61,6 @@ static int filter_wants(git_remote *remote) ...@@ -61,8 +61,6 @@ static int filter_wants(git_remote *remote)
} }
for (i = 0; i < refs.len; ++i) { for (i = 0; i < refs.len; ++i) {
char local[1024];
git_reference *ref;
git_remote_head *head = refs.heads[i]; git_remote_head *head = refs.heads[i];
/* If it doesn't match the refpec, we don't want it */ /* If it doesn't match the refpec, we don't want it */
...@@ -74,34 +72,10 @@ static int filter_wants(git_remote *remote) ...@@ -74,34 +72,10 @@ static int filter_wants(git_remote *remote)
goto cleanup; goto cleanup;
} }
/* If the local ref is the same, we don't want it either */ /* If we have the object, mark it so we don't ask for it */
error = git_refspec_transform(local, sizeof(local), spec, head->name); if (git_odb_exists(repo->db, &head->oid))
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;
head->local = 1; 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); error = git_vector_insert(&list, head);
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
goto cleanup; goto cleanup;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment