Skip to content
  • Elijah Newren's avatar
    builtin/merge.c: fix a bug with trivial merges · 40d71940
    Elijah Newren authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    If read_tree_trivial() succeeds and produces a tree that is already
    in the object store, then the index is not written to disk, leaving
    it out-of-sync with both HEAD and the working tree.
    
    In order to write the index back out to disk after a merge,
    write_index_locked() needs to be called.  For most merge strategies, this
    is done from try_merge_strategy().  For fast forward updates, this is
    done from checkout_fast_forward().  When trivial merges work, the call to
    write_index_locked() is buried a little deeper:
    
      merge_trivial()
      -> write_tree_trivial()
         -> write_cache_as_tree()
            -> write_index_as_tree()
               -> write_locked_index()
    
    However, it is only called when !cache_tree_fully_valid(), which is how
    this bug is triggered.  But that also shows why this bug doesn't affect
    any other merge strategies or cases.
    
    Add a direct call to write_index_locked() from merge_trivial() to fix
    this issue.  Since the indirect call to write_locked_index() was
    conditional on cache_tree_fully_valid(), it won't be written twice.
    
    Signed-off-by: default avatarElijah Newren <newren@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    40d71940