Skip to content
  • Junio C Hamano's avatar
    unpack_trees(): protect the handcrafted in-core index from read_cache() · 913e0e99
    Junio C Hamano authored
    
    
    unpack_trees() rebuilds the in-core index from scratch by allocating a new
    structure and finishing it off by copying the built one to the final
    index.
    
    The resulting in-core index is Ok for most use, but read_cache() does not
    recognize it as such.  The function is meant to be no-op if you already
    have loaded the index, until you call discard_cache().
    
    This change the way read_cache() detects an already initialized in-core
    index, by introducing an extra bit, and marks the handcrafted in-core
    index as initialized, to avoid this problem.
    
    A better fix in the longer term would be to change the read_cache() API so
    that it will always discard and re-read from the on-disk index to avoid
    confusion.  But there are higher level API that have relied on the current
    semantics, and they and their users all need to get converted, which is
    outside the scope of 'maint' track.
    
    An example of such a higher level API is write_cache_as_tree(), which is
    used by git-write-tree as well as later Porcelains like git-merge, revert
    and cherry-pick.  In the longer term, we should remove read_cache() from
    there and add one to cmd_write_tree(); other callers expect that the
    in-core index they prepared is what gets written as a tree so no other
    change is necessary for this particular codepath.
    
    The original version of this patch marked the index by pointing an
    otherwise wasted malloc'ed memory with o->result.alloc, but this version
    uses Linus's idea to use a new "initialized" bit, which is conceptually
    much cleaner.
    
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    913e0e99