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