diff options
author | Junio C Hamano <gitster@pobox.com> | 2021-04-30 13:50:26 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-04-30 13:50:26 +0900 |
commit | a1cac26cc60f611b2f94badfc9c8522a65e79dc1 (patch) | |
tree | 5bbbdc78161815ae9a3b68e3cb0469dbefbc998a /entry.c | |
parent | 59bb0aa93e6edaca44b2a5488fc915d468bae46f (diff) | |
parent | 68e66f2987724a639c896e7996ea347be62ef578 (diff) | |
download | git-a1cac26cc60f611b2f94badfc9c8522a65e79dc1.tar.gz |
Merge branch 'mt/parallel-checkout-part-2'
The checkout machinery has been taught to perform the actual
write-out of the files in parallel when able.
* mt/parallel-checkout-part-2:
parallel-checkout: add design documentation
parallel-checkout: support progress displaying
parallel-checkout: add configuration options
parallel-checkout: make it truly parallel
unpack-trees: add basic support for parallel checkout
Diffstat (limited to 'entry.c')
-rw-r--r-- | entry.c | 17 |
1 files changed, 15 insertions, 2 deletions
@@ -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) @@ -428,8 +429,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; @@ -538,6 +548,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); } |