mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-05 03:52:10 +00:00
remote: build up the list of refs to remove
When removing the remote-tracking branches, build up the list and remove in two steps, working around an issue with the iterator. Removing while we're iterating over the refs can cause us to miss references.
This commit is contained in:
parent
9bc2813bef
commit
8a9419aae1
42
src/remote.c
42
src/remote.c
@ -1809,24 +1809,50 @@ static int remove_branch_config_related_entries(
|
||||
return error;
|
||||
}
|
||||
|
||||
static int remove_refs(git_repository *repo, const char *glob)
|
||||
static int remove_refs(git_repository *repo, const git_refspec *spec)
|
||||
{
|
||||
git_reference_iterator *iter;
|
||||
git_reference_iterator *iter = NULL;
|
||||
git_vector refs;
|
||||
const char *name;
|
||||
char *dup;
|
||||
int error;
|
||||
size_t i;
|
||||
|
||||
if ((error = git_reference_iterator_glob_new(&iter, repo, glob)) < 0)
|
||||
if ((error = git_vector_init(&refs, 8, NULL)) < 0)
|
||||
return error;
|
||||
|
||||
if ((error = git_reference_iterator_new(&iter, repo)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
while ((error = git_reference_next_name(&name, iter)) == 0) {
|
||||
if (!git_refspec_dst_matches(spec, name))
|
||||
continue;
|
||||
|
||||
dup = git__strdup(name);
|
||||
if (!dup) {
|
||||
error = -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if ((error = git_vector_insert(&refs, dup)) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
if (error == GIT_ITEROVER)
|
||||
error = 0;
|
||||
if (error < 0)
|
||||
goto cleanup;
|
||||
|
||||
git_vector_foreach(&refs, i, name) {
|
||||
if ((error = git_reference_remove(repo, name)) < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
git_reference_iterator_free(iter);
|
||||
|
||||
if (error == GIT_ITEROVER)
|
||||
error = 0;
|
||||
|
||||
git_vector_foreach(&refs, i, dup) {
|
||||
git__free(dup);
|
||||
}
|
||||
git_vector_free(&refs);
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -1848,7 +1874,7 @@ static int remove_remote_tracking(git_repository *repo, const char *remote_name)
|
||||
if (refspec == NULL)
|
||||
continue;
|
||||
|
||||
if ((error = remove_refs(repo, git_refspec_dst(refspec))) < 0)
|
||||
if ((error = remove_refs(repo, refspec)) < 0)
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user