diff options
author | Julian Phillips <julian@quantumfyre.co.uk> | 2011-09-27 01:00:09 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-09-26 18:30:38 -0700 |
commit | b4f223c6367bb7aefa00c746c808f5afa7b85331 (patch) | |
tree | a2b48efb2e16f45ae72b6535e661708942b81484 /refs.c | |
parent | 7ed863a85a6ce2c4ac4476848310b8f917ab41f9 (diff) | |
download | git-b4f223c6367bb7aefa00c746c808f5afa7b85331.tar.gz |
Don't sort ref_list too early
get_ref_dir is called recursively for subdirectories, which means that
we were calling sort_ref_list for each directory of refs instead of
once for all the refs. This is a massive wast of processing, so now
just call sort_ref_list on the result of the top-level get_ref_dir, so
that the sort is only done once.
In the common case of only a few different directories of refs the
difference isn't very noticable, but it becomes very noticeable when
you have a large number of direcotries containing refs (e.g. as
created by Gerrit).
Reported by Martin Fick.
Signed-off-by: Julian Phillips <julian@quantumfyre.co.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs.c')
-rw-r--r-- | refs.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -319,7 +319,7 @@ static struct ref_list *get_ref_dir(const char *submodule, const char *base, free(ref); closedir(dir); } - return sort_ref_list(list); + return list; } struct warn_if_dangling_data { @@ -361,11 +361,13 @@ static struct ref_list *get_loose_refs(const char *submodule) if (submodule) { free_ref_list(submodule_refs.loose); submodule_refs.loose = get_ref_dir(submodule, "refs", NULL); + submodule_refs.loose = sort_ref_list(submodule_refs.loose); return submodule_refs.loose; } if (!cached_refs.did_loose) { cached_refs.loose = get_ref_dir(NULL, "refs", NULL); + cached_refs.loose = sort_ref_list(cached_refs.loose); cached_refs.did_loose = 1; } return cached_refs.loose; |