Signed-off-by: Jaime Soriano Pastor <[email protected]>
---
 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to