Skip to content
  • Jeff King's avatar
    memoize common git-path "constant" files · f932729c
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    One of the most common uses of git_path() is to pass a
    constant, like git_path("MERGE_MSG"). This has two
    drawbacks:
    
      1. The return value is a static buffer, and the lifetime
         is dependent on other calls to git_path, etc.
    
      2. There's no compile-time checking of the pathname. This
         is OK for a one-off (after all, we have to spell it
         correctly at least once), but many of these constant
         strings appear throughout the code.
    
    This patch introduces a series of functions to "memoize"
    these strings, which are essentially globals for the
    lifetime of the program. We compute the value once, take
    ownership of the buffer, and return the cached value for
    subsequent calls.  cache.h provides a helper macro for
    defining these functions as one-liners, and defines a few
    common ones for global use.
    
    Using a macro is a little bit gross, but it does nicely
    document the purpose of the functions. If we need to touch
    them all later (e.g., because we learned how to change the
    git_dir variable at runtime, and need to invalidate all of
    the stored values), it will be much easier to have the
    complete list.
    
    Note that the shared-global functions have separate, manual
    declarations. We could do something clever with the macros
    (e.g., expand it to a declaration in some places, and a
    declaration _and_ a definition in path.c). But there aren't
    that many, and it's probably better to stay away from
    too-magical macros.
    
    Likewise, if we abandon the C preprocessor in favor of
    generating these with a script, we could get much fancier.
    E.g., normalizing "FOO/BAR-BAZ" into "git_path_foo_bar_baz".
    But the small amount of saved typing is probably not worth
    the resulting confusion to readers who want to grep for the
    function's definition.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    f932729c