diff options
author | Jens Lindström <jl@opera.com> | 2014-05-23 12:30:25 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-05-27 12:30:47 -0700 |
commit | e6bea66db6229a0975ebba510a1d2827bf09cb7f (patch) | |
tree | b81289073f96aae1f89492b519083c7ccb2ed44b /builtin/remote.c | |
parent | c9e768bb77762765f739fffb5c09d0888f3de20e (diff) | |
download | git-e6bea66db6229a0975ebba510a1d2827bf09cb7f.tar.gz |
remote prune: optimize "dangling symref" check/warningjl/remote-rm-prune
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/remote.c')
-rw-r--r-- | builtin/remote.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/builtin/remote.c b/builtin/remote.c index d33abe6598..9b3e368983 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; } |