]> git.ipfire.org Git - thirdparty/git.git/blobdiff - entry.c
unpack-trees: add basic support for parallel checkout
[thirdparty/git.git] / entry.c
diff --git a/entry.c b/entry.c
index 2dc94ba5cc2a53502c4b6b1dc579cee659671287..d7ed38aa407990b3a14f1a3598cecc4b5e8ddd8b 100644 (file)
--- a/entry.c
+++ b/entry.c
@@ -7,6 +7,7 @@
 #include "progress.h"
 #include "fsmonitor.h"
 #include "entry.h"
+#include "parallel-checkout.h"
 
 static void create_directories(const char *path, int path_len,
                               const struct checkout *state)
@@ -426,8 +427,17 @@ static void mark_colliding_entries(const struct checkout *state,
        for (i = 0; i < state->istate->cache_nr; i++) {
                struct cache_entry *dup = state->istate->cache[i];
 
-               if (dup == ce)
-                       break;
+               if (dup == ce) {
+                       /*
+                        * Parallel checkout doesn't create the files in index
+                        * order. So the other side of the collision may appear
+                        * after the given cache_entry in the array.
+                        */
+                       if (parallel_checkout_status() == PC_RUNNING)
+                               continue;
+                       else
+                               break;
+               }
 
                if (dup->ce_flags & (CE_MATCHED | CE_VALID | CE_SKIP_WORKTREE))
                        continue;
@@ -536,6 +546,9 @@ int checkout_entry_ca(struct cache_entry *ce, struct conv_attrs *ca,
                ca = &ca_buf;
        }
 
+       if (!enqueue_checkout(ce, ca))
+               return 0;
+
        return write_entry(ce, path.buf, ca, state, 0);
 }