• Jeff King's avatar
    logmsg_reencode: lazily load missing commit buffers · be5c9fb9
    Jeff King authored
    Usually a commit that makes it to logmsg_reencode will have
    been parsed, and the commit->buffer struct member will be
    valid. However, some code paths will free commit buffers
    after having used them (for example, the log traversal
    machinery will do so to keep memory usage down).
    
    Most of the time this is fine; log should only show a commit
    once, and then exits. However, there are some code paths
    where this does not work. At least two are known:
    
      1. A commit may be shown as part of a regular ref, and
         then it may be shown again as part of a submodule diff
         (e.g., if a repo contains refs to both the superproject
         and subproject).
    
      2. A notes-cache commit may be shown during "log --all",
         and then later used to access a textconv cache during a
         diff.
    
    Lazily loading in logmsg_reencode does not necessarily catch
    all such cases, but it should catch most of them. Users of
    the commit buffer tend to be either parsing for structure
    (in which they will call parse_commit, and either we will
    already have parsed, or we will load commit->buffer lazily
    there), or outputting (either to the user, or fetching a
    part of the commit message via format_commit_message). In
    the latter case, we should always be using logmsg_reencode
    anyway (and typically we do so via the pretty-print
    machinery).
    
    If there are any cases that this misses, we can fix them up
    to use logmsg_reencode (or handle them on a case-by-case
    basis if that is inappropriate).
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    be5c9fb9
t4042-diff-textconv-caching.sh 2.75 KB