Skip to content
  • Jonathan Tan's avatar
    sha1_file: support lazily fetching missing objects · 8b4c0103
    Jonathan Tan authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    Teach sha1_file to fetch objects from the remote configured in
    extensions.partialclone whenever an object is requested but missing.
    
    The fetching of objects can be suppressed through a global variable.
    This is used by fsck and index-pack.
    
    However, by default, such fetching is not suppressed. This is meant as a
    temporary measure to ensure that all Git commands work in such a
    situation. Future patches will update some commands to either tolerate
    missing objects (without fetching them) or be more efficient in fetching
    them.
    
    In order to determine the code changes in sha1_file.c necessary, I
    investigated the following:
     (1) functions in sha1_file.c that take in a hash, without the user
         regarding how the object is stored (loose or packed)
     (2) functions in packfile.c (because I need to check callers that know
         about the loose/packed distinction and operate on both differently,
         and ensure that they can handle the concept of objects that are
         neither loose nor packed)
    
    (1) is handled by the modification to sha1_object_info_extended().
    
    For (2), I looked at for_each_packed_object and others.  For
    for_each_packed_object, the callers either already work or are fixed in
    this patch:
     - reachable - only to find recent objects
     - builtin/fsck - already knows about missing objects
     - builtin/cat-file - warning message added in this commit
    
    Callers of the other functions do not need to be changed:
     - parse_pack_index
       - http - indirectly from http_get_info_packs
       - find_pack_entry_one
         - this searches a single pack that is provided as an argument; the
           caller already knows (through other means) that the sought object
           is in a specific pack
     - find_sha1_pack
       - fast-import - appears to be an optimization to not store a file if
         it is already in a pack
       - http-walker - to search through a struct alt_base
       - http-push - to search through remote packs
     - has_sha1_pack
       - builtin/fsck - already knows about promisor objects
       - builtin/count-objects - informational purposes only (check if loose
         object is also packed)
       - builtin/prune-packed - check if object to be pruned is packed (if
         not, don't prune it)
       - revision - used to exclude packed objects if requested by user
       - diff - just for optimization
    
    Signed-off-by: default avatarJonathan Tan <jonathantanmy@google.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    8b4c0103