summaryrefslogtreecommitdiff
path: root/revision.h
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2016-02-11 17:26:18 -0500
committerJunio C Hamano <gitster@pobox.com>2016-02-12 12:51:10 -0800
commit13528ab37cadb4d4f7384d0449489760912904b8 (patch)
tree24a892295985ce93909721dde49147ab3d6a02c6 /revision.h
parentf9fb9d0e3caebe97c54c101d8235e6529d5a1273 (diff)
downloadgit-13528ab37cadb4d4f7384d0449489760912904b8.tar.gz
list-objects: convert name_path to a strbuf
The "struct name_path" data is examined in only two places: we generate it in process_tree(), and we convert it to a single string in path_name(). Everyone else just passes it through to those functions. We can further note that process_tree() already keeps a single strbuf with the leading tree path, for use with tree_entry_interesting(). Instead of building a separate name_path linked list, let's just use the one we already build in "base". This reduces the amount of code (especially tricky code in path_name() which did not check for integer overflows caused by deep or large pathnames). It is also more efficient in some instances. Any time we were using tree_entry_interesting, we were building up the strbuf anyway, so this is an immediate and obvious win there. In cases where we were not, we trade off storing "pathname/" in a strbuf on the heap for each level of the path, instead of two pointers and an int on the stack (with one pointer into the tree object). On a 64-bit system, the latter is 20 bytes; so if path components are less than that on average, this has lower peak memory usage. In practice it probably doesn't matter either way; we are already holding in memory all of the tree objects leading up to each pathname, and for normal-depth pathnames, we are only talking about hundreds of bytes. This patch leaves "struct name_path" as a thin wrapper around the strbuf, to avoid disrupting callbacks. We should fix them, but leaving it out makes this diff easier to view. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'revision.h')
-rw-r--r--revision.h4
1 files changed, 1 insertions, 3 deletions
diff --git a/revision.h b/revision.h
index 23857c0ed1..2a26310d6c 100644
--- a/revision.h
+++ b/revision.h
@@ -258,9 +258,7 @@ extern void mark_parents_uninteresting(struct commit *commit);
extern void mark_tree_uninteresting(struct tree *tree);
struct name_path {
- struct name_path *up;
- int elem_len;
- const char *elem;
+ struct strbuf *base;
};
char *path_name(const struct name_path *path, const char *name);