• Show log

    Commit

  • Hash : a616fb16
    Author : Patrick Steinhardt
    Date : 2017-10-13T13:53:05

    indexer: check pack file connectivity
    
    When passing `--strict` to `git-unpack-objects`, core git will verify
    the pack file that is currently being read. In addition to the typical
    checksum verification, this will especially cause it to verify object
    connectivity of the received pack file. So it checks, for every received
    object, if all the objects it references are either part of the local
    object database or part of the pack file. In libgit2, we currently have
    no such mechanism, which leaves us unable to verify received pack files
    prior to writing them into our local object database.
    
    This commit introduce the concept of `expected_oids` to the indexer.
    When pack file verification is turned on by a new flag, the indexer will
    try to parse each received object first. If the object has any links to
    other objects, it will check if those links are already satisfied by
    known objects either part of the object database or objects it has
    already seen as part of that pack file. If not, it will add them to the
    list of `expected_oids`. Furthermore, the indexer will remove the
    current object from the `expected_oids` if it is currently being
    expected.
    
    Like this, we are able to verify whether all object links are being
    satisfied. As soon as we hit the end of the object stream and have
    resolved all objects as well as deltified objects, we assert that
    `expected_oids` is in fact empty. This should always be the case for a
    valid pack file with full connectivity.