Skip to content
  • Jeff King's avatar
    resolve_gitlink_ref: ignore non-repository paths · a2d5156c
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When we want to look up a submodule ref, we use
    get_ref_cache(path) to find or auto-create its ref cache.
    But if we feed a path that isn't actually a git repository,
    we blindly create the ref cache, and then may die deeper in
    the code when we try to access it. This is a problem because
    many callers speculatively feed us a path that looks vaguely
    like a repository, and expect us to tell them when it is
    not.
    
    This patch teaches resolve_gitlink_ref to reject
    non-repository paths without creating a ref_cache. This
    avoids the die(), and also performs better if you have a
    large number of these faux-submodule directories (because
    the ref_cache lookup is linear, under the assumption that
    there won't be a large number of submodules).
    
    To accomplish this, we also break get_ref_cache into two
    pieces: the lookup and auto-creation (the latter is lumped
    into create_ref_cache). This lets us first cheaply ask our
    cache "is it a submodule we know about?" If so, we can avoid
    repeating our filesystem lookup. So lookups of real
    submodules are not penalized; they examine the submodule's
    .git directory only once.
    
    The test in t3000 demonstrates a case where this improves
    correctness (we used to just die). The new perf case in
    p7300 shows off the speed improvement in an admittedly
    pathological repository:
    
    Test                  HEAD^               HEAD
    ----------------------------------------------------------------
    7300.4: ls-files -o   66.97(66.15+0.87)   0.33(0.08+0.24) -99.5%
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    a2d5156c