• Jonathan Tan's avatar
    fetch-pack: write shallow, then check connectivity · cf1e7c07
    Jonathan Tan authored
    When fetching, connectivity is checked after the shallow file is
    updated. There are 2 issues with this: (1) the connectivity check is
    only performed up to ancestors of existing refs (which is not thorough
    enough if we were deepening an existing ref in the first place), and (2)
    there is no rollback of the shallow file if the connectivity check
    fails.
    
    To solve (1), update the connectivity check to check the ancestry chain
    completely in the case of a deepening fetch by refraining from passing
    "--not --all" when invoking rev-list in connected.c.
    
    To solve (2), have fetch_pack() perform its own connectivity check
    before updating the shallow file. To support existing use cases in which
    "git fetch-pack" is used to download objects without much regard as to
    the connectivity of the resulting objects with respect to the existing
    repository, the connectivity check is only done if necessary (that is,
    the fetch is not a clone, and the fetch involves shallow/deepen
    functionality). "git fetch" still performs its own connectivity check,
    preserving correctness but sometimes performing redundant work. This
    redundancy is mitigated by the fact that fetch_pack() reports if it has
    performed a connectivity check itself, and if the transport supports
    connect or stateless-connect, it will bubble up that report so that "git
    fetch" knows not to perform the connectivity check in such a case.
    
    This was noticed when a user tried to deepen an existing repository by
    fetching with --no-shallow from a server that did not send all necessary
    objects - the connectivity check as run by "git fetch" succeeded, but a
    subsequent "git fsck" failed.
    Signed-off-by: 's avatarJonathan Tan <jonathantanmy@google.com>
    Signed-off-by: 's avatarJunio C Hamano <gitster@pobox.com>
    cf1e7c07
connected.c 3.18 KB