diff options
author | Junio C Hamano <gitster@pobox.com> | 2016-02-03 14:16:06 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-02-03 14:16:06 -0800 |
commit | 201155cd1164572086a8a5fa1708b93d68b64f08 (patch) | |
tree | 8bf0b7ba5a89248b231704119fb4e8eea06303c0 /tree-walk.c | |
parent | e01c6b15c97e30baedc45021e6dcbd90140616cd (diff) | |
parent | a6720955f19ea10bf9569d04480deed25b1bccf7 (diff) | |
download | git-201155cd1164572086a8a5fa1708b93d68b64f08.tar.gz git-201155cd1164572086a8a5fa1708b93d68b64f08.tar.xz |
Merge branch 'dt/unpack-compare-entry-optim'
"git checkout $branch" (and other operations that share the same
underlying machinery) has been optimized.
* dt/unpack-compare-entry-optim:
unpack-trees: fix accidentally quadratic behavior
do_compare_entry: use already-computed path
Diffstat (limited to 'tree-walk.c')
-rw-r--r-- | tree-walk.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/tree-walk.c b/tree-walk.c index 6dccd2d5d..cd4bb2c38 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -320,6 +320,7 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info) struct tree_desc_x *tx = xcalloc(n, sizeof(*tx)); struct strbuf base = STRBUF_INIT; int interesting = 1; + char *traverse_path; for (i = 0; i < n; i++) tx[i].d = t[i]; @@ -329,7 +330,11 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info) make_traverse_path(base.buf, info->prev, &info->name); base.buf[info->pathlen-1] = '/'; strbuf_setlen(&base, info->pathlen); + traverse_path = xstrndup(base.buf, info->pathlen); + } else { + traverse_path = xstrndup(info->name.path, info->pathlen); } + info->traverse_path = traverse_path; for (;;) { int trees_used; unsigned long mask, dirmask; @@ -411,6 +416,8 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info) for (i = 0; i < n; i++) free_extended_entry(tx + i); free(tx); + free(traverse_path); + info->traverse_path = NULL; strbuf_release(&base); return error; } |