summaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorJens Lindström <jl@opera.com>2014-05-23 10:30:25 (GMT)
committerJunio C Hamano <gitster@pobox.com>2014-05-27 19:30:47 (GMT)
commite6bea66db6229a0975ebba510a1d2827bf09cb7f (patch)
treeb81289073f96aae1f89492b519083c7ccb2ed44b /builtin
parentc9e768bb77762765f739fffb5c09d0888f3de20e (diff)
downloadgit-e6bea66db6229a0975ebba510a1d2827bf09cb7f.zip
git-e6bea66db6229a0975ebba510a1d2827bf09cb7f.tar.gz
git-e6bea66db6229a0975ebba510a1d2827bf09cb7f.tar.bz2
remote prune: optimize "dangling symref" check/warning
When 'git remote prune' was used to delete many refs in a repository with many refs, a lot of time was spent checking for (now) dangling symbolic refs pointing to the deleted ref, since warn_dangling_symref() was once per deleted ref to check all other refs in the repository. Avoid this using the new warn_dangling_symrefs() function which makes one pass over all refs and checks for all the deleted refs in one go, after they have all been deleted. Signed-off-by: Jens Lindström <jl@opera.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
-rw-r--r--builtin/remote.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/builtin/remote.c b/builtin/remote.c
index d33abe6..9b3e368 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -1313,6 +1313,7 @@ static int prune_remote(const char *remote, int dry_run)
{
int result = 0, i;
struct ref_states states;
+ struct string_list delete_refs_list = STRING_LIST_INIT_NODUP;
const char **delete_refs;
const char *dangling_msg = dry_run
? _(" %s will become dangling!")
@@ -1339,6 +1340,8 @@ static int prune_remote(const char *remote, int dry_run)
for (i = 0; i < states.stale.nr; i++) {
const char *refname = states.stale.items[i].util;
+ string_list_insert(&delete_refs_list, refname);
+
if (!dry_run)
result |= delete_ref(refname, NULL, 0);
@@ -1348,9 +1351,11 @@ static int prune_remote(const char *remote, int dry_run)
else
printf_ln(_(" * [pruned] %s"),
abbrev_ref(refname, "refs/remotes/"));
- warn_dangling_symref(stdout, dangling_msg, refname);
}
+ warn_dangling_symrefs(stdout, dangling_msg, &delete_refs_list);
+ string_list_clear(&delete_refs_list, 0);
+
free_remote_ref_states(&states);
return result;
}