mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-03 07:32:15 +00:00
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:
parent
1564db11fe
commit
a1be77cd35
@ -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;
|
||||
|
30
src/fetch.c
30
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;
|
||||
|
Loading…
Reference in New Issue
Block a user