Consolidate repeated pathspec matches on the same paths, while
fixing a bug in "git checkout dir/" code started from an unmerged
index.
* nd/checkout-paths-reduce-match-pathspec-calls:
checkout: avoid unnecessary match_pathspec calls
@ -118,7 +118,7 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
@@ -118,7 +118,7 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
struct cache_entry *ce;
struct string_list_item *item;
struct resolve_undo_info *ru;
int i, err = 0;
int i, err = 0, matched;
if (!istate->resolve_undo)
return pos;
@ -137,6 +137,7 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
@@ -137,6 +137,7 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
ru = item->util;
if (!ru)
return pos;
matched = ce->ce_flags & CE_MATCHED;
remove_index_entry_at(istate, pos);
for (i = 0; i < 3; i++) {
struct cache_entry *nce;
@ -144,6 +145,8 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
@@ -144,6 +145,8 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
continue;
nce = make_cache_entry(ru->mode[i], ru->sha1[i],
ce->name, i + 1, 0);
if (matched)
nce->ce_flags |= CE_MATCHED;
if (add_index_entry(istate, nce, ADD_CACHE_OK_TO_ADD)) {
err = 1;
error("cannot unmerge '%s'", ce->name);
@ -156,6 +159,20 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
@@ -156,6 +159,20 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
@ -39,4 +39,26 @@ test_expect_success 'checking out paths out of a tree does not clobber unrelated
@@ -39,4 +39,26 @@ test_expect_success 'checking out paths out of a tree does not clobber unrelated
test_cmp expect.next2 dir/next2
'
test_expect_success 'do not touch unmerged entries matching $path but not in $tree' '