Merge pull request #2392 from libgit2/cmn/remote-delete remote: build up the list of refs to remove
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 65 66 67 68 69 70 71
diff --git a/src/remote.c b/src/remote.c
index f2e2e2f..b56bf3b 100644
--- a/src/remote.c
+++ b/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 ((error = git_reference_remove(repo, name)) < 0)
- break;
- }
- git_reference_iterator_free(iter);
+ 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);
+ 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;
}