aboutsummaryrefslogtreecommitdiff
path: root/tree-walk.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-02-03 14:16:06 -0800
committerJunio C Hamano <gitster@pobox.com>2016-02-03 14:16:06 -0800
commit201155cd1164572086a8a5fa1708b93d68b64f08 (patch)
tree8bf0b7ba5a89248b231704119fb4e8eea06303c0 /tree-walk.c
parente01c6b15c97e30baedc45021e6dcbd90140616cd (diff)
parenta6720955f19ea10bf9569d04480deed25b1bccf7 (diff)
downloadgit-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.c7
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;
}