Skip to content
  • Jeff King's avatar
    make add_object_array_with_context interface more sane · 9e0c3c4f
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When you resolve a sha1, you can optionally keep any context
    found during the resolution, including the path and mode of
    a tree entry (e.g., when looking up "HEAD:subdir/file.c").
    
    The add_object_array_with_context function lets you then
    attach that context to an entry in a list. Unfortunately,
    the interface for doing so is horrible. The object_context
    structure is large and most object_array users do not use
    it. Therefore we keep a pointer to the structure to avoid
    burdening other users too much. But that means when we do
    use it that we must allocate the struct ourselves. And the
    struct contains a fixed PATH_MAX-sized buffer, which makes
    this wholly unsuitable for any large arrays.
    
    We can observe that there is only a single user of the
    "with_context" variant: builtin/grep.c. And in that use
    case, the only element we care about is the path. We can
    therefore store only the path as a pointer (the context's
    mode field was redundant with the object_array_entry itself,
    and nobody actually cared about the surrounding tree). This
    still requires a strdup of the pathname, but at least we are
    only consuming the minimum amount of memory for each string.
    
    We can also handle the copying ourselves in
    add_object_array_*, and free it as appropriate in
    object_array_release_entry.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    9e0c3c4f