Signed-off-by: Jaime Soriano Pastor <jsorianopastor@xxxxxxxxx> --- builtin/update-index.c | 1 + cache.h | 1 + read-cache.c | 3 ++- t/t9904-unmerged-file-with-merged-entry.sh | 14 +++++++++++--- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/builtin/update-index.c b/builtin/update-index.c index ebea285..509fae7 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -239,6 +239,7 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1, ce->ce_flags |= CE_VALID; option = allow_add ? ADD_CACHE_OK_TO_ADD : 0; option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0; + option |= ADD_CACHE_OK_TO_REPLACE_MERGED; if (add_cache_entry(ce, option)) return error("%s: cannot add to the index - missing --add option?", path); diff --git a/cache.h b/cache.h index c708062..ecac41c 100644 --- a/cache.h +++ b/cache.h @@ -474,6 +474,7 @@ extern int index_name_pos(const struct index_state *, const char *name, int name #define ADD_CACHE_SKIP_DFCHECK 4 /* Ok to skip DF conflict checks */ #define ADD_CACHE_JUST_APPEND 8 /* Append only; tree.c::read_tree() */ #define ADD_CACHE_NEW_ONLY 16 /* Do not replace existing ones */ +#define ADD_CACHE_OK_TO_REPLACE_MERGED 32 /* Ok to replace even if a merged entry exists */ extern int add_index_entry(struct index_state *, struct cache_entry *ce, int option); extern void rename_index_entry_at(struct index_state *, int pos, const char *new_name); extern int remove_index_entry_at(struct index_state *, int pos); diff --git a/read-cache.c b/read-cache.c index d549d0b..c4ddefe 100644 --- a/read-cache.c +++ b/read-cache.c @@ -933,6 +933,7 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e int pos; int ok_to_add = option & ADD_CACHE_OK_TO_ADD; int ok_to_replace = option & ADD_CACHE_OK_TO_REPLACE; + int ok_to_replace_merged = option & ADD_CACHE_OK_TO_REPLACE_MERGED; int skip_df_check = option & ADD_CACHE_SKIP_DFCHECK; int new_only = option & ADD_CACHE_NEW_ONLY; int replaced = 0; @@ -955,7 +956,7 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e */ if (pos < istate->cache_nr && ce_stage(ce) == 0) { while (ce_same_name(istate->cache[pos], ce)) { - if (replaced) + if (replaced && !ok_to_replace_merged) die("Merged and unmerged entries found for " "'%s', check 'git ls-files -s \"%s\"'", ce->name, ce->name); diff --git a/t/t9904-unmerged-file-with-merged-entry.sh b/t/t9904-unmerged-file-with-merged-entry.sh index 945bc1c..9138821 100755 --- a/t/t9904-unmerged-file-with-merged-entry.sh +++ b/t/t9904-unmerged-file-with-merged-entry.sh @@ -28,11 +28,11 @@ setup_stage_state() { test_expect_success 'setup - two branches with conflicting files' ' setup_repository && - setup_stage_state && + git merge master git ls-files -s conflict > output && - test_line_count = 4 output && + test_line_count = 3 output && git ls-files -s conflict2 > output && - test_line_count = 4 output && + test_line_count = 3 output && rm output ' @@ -83,4 +83,12 @@ test_expect_success 'git reset --hard' ' test_cmp expected current ' +test_expect_success 'git update-index --cacheinfo to select a stage to use' ' + setup_stage_state && + git cat-file blob :1:conflict > conflict && + git update-index --cacheinfo 100644,`git hash-object conflict`,conflict + git ls-files -s conflict > output && + test_line_count = 1 output +' + test_done -- 2.0.4.4.gaf54b2b -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html