Skip to content
  • Jeff King's avatar
    list-objects: convert name_path to a strbuf · f3badaed
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    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: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    f3badaed