Merge branch 'jc/maint-read-tree-multi'
[gitweb.git] / builtin-checkout.c
index ee1edd406ffde4b31bf2685a634a6d318407724f..15f0c32c7a7ed62afe31e3bafb2d7306ba4a3402 100644 (file)
@@ -5,6 +5,7 @@
 #include "commit.h"
 #include "tree.h"
 #include "tree-walk.h"
+#include "cache-tree.h"
 #include "unpack-trees.h"
 #include "dir.h"
 #include "run-command.h"
@@ -178,7 +179,7 @@ static int checkout_merged(int pos, struct checkout *state)
        /*
         * NEEDSWORK:
         * There is absolutely no reason to write this as a blob object
-        * and create a phoney cache entry just to leak.  This hack is
+        * and create a phony cache entry just to leak.  This hack is
         * primarily to get to the write_entry() machinery that massages
         * the contents to work-tree format and writes out which only
         * allows it for a cache entry.  The code in write_entry() needs
@@ -364,14 +365,17 @@ static int merge_working_tree(struct checkout_opts *opts,
        int ret;
        struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
        int newfd = hold_locked_index(lock_file, 1);
+       int reprime_cache_tree = 0;
 
        if (read_cache() < 0)
                return error("corrupt index file");
 
+       cache_tree_free(&active_cache_tree);
        if (opts->force) {
                ret = reset_tree(new->commit->tree, opts, 1);
                if (ret)
                        return ret;
+               reprime_cache_tree = 1;
        } else {
                struct tree_desc trees[2];
                struct tree *tree;
@@ -407,7 +411,9 @@ static int merge_working_tree(struct checkout_opts *opts,
                init_tree_desc(&trees[1], tree->buffer, tree->size);
 
                ret = unpack_trees(2, trees, &topts);
-               if (ret == -1) {
+               if (ret != -1) {
+                       reprime_cache_tree = 1;
+               } else {
                        /*
                         * Unpack couldn't do a trivial merge; either
                         * give up or do a real merge, depending on
@@ -451,6 +457,8 @@ static int merge_working_tree(struct checkout_opts *opts,
                }
        }
 
+       if (reprime_cache_tree)
+               prime_cache_tree(&active_cache_tree, new->commit->tree);
        if (write_cache(newfd, active_cache, active_nr) ||
            commit_locked_index(lock_file))
                die("unable to write new index file");