summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Marti <vicent@github.com>2014-06-01 16:26:44 +0200
committerVicent Marti <vicent@github.com>2014-06-01 16:26:44 +0200
commit2f6f6ebc9937220302875de96ce129919296670a (patch)
tree3a7925b6855b79c1c62a0e165200291050839477
parent9bc2813bef35ad69dd2a1d491b953ab4d5bf6137 (diff)
parent8a9419aae185204c9f727285643ab99b1b968610 (diff)
downloadlibgit2-2f6f6ebc9937220302875de96ce129919296670a.tar.gz
Merge pull request #2392 from libgit2/cmn/remote-delete
remote: build up the list of refs to remove
-rw-r--r--src/remote.c42
1 files changed, 34 insertions, 8 deletions
diff --git a/src/remote.c b/src/remote.c
index f2e2e2f7a..b56bf3b24 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;
}