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>
This commit is contained in:
Carlos Martín Nieto 2011-08-07 14:27:47 +02:00 committed by Vicent Marti
parent 1564db11fe
commit a1be77cd35
2 changed files with 3 additions and 30 deletions

View File

@ -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;

View File

@ -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;