When a merge left unmerged entries, git add failed to pick up the file mode from the index, when core.filemode == 0. Noticed by Johannes Sixt. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- On Thu, 28 Jun 2007, Johannes Sixt wrote: > Johannes Sixt wrote: > > The deficiency is not in merge-recursive, but in 'git add'. The > problem is that after a conflicted merge of an executable file > 'git add' loses the +x bit even if core.filemode=false. How's that? read-cache.c | 6 ++++++ t/t3700-add.sh | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 0 deletions(-) diff --git a/read-cache.c b/read-cache.c index 4362b11..a74e4a7 100644 --- a/read-cache.c +++ b/read-cache.c @@ -382,6 +382,12 @@ int add_file_to_index(struct index_state *istate, const char *path, int verbose) struct cache_entry *ent; int pos = index_name_pos(istate, path, namelen); + /* might be unmerged */ + if (pos < 0 && 1-pos < istate->cache_nr && + namelen == ce_namelen(istate->cache[1-pos]) && + !memcmp(path, istate->cache[1-pos]->name, + namelen)) + pos = 1-pos; ent = (0 <= pos) ? istate->cache[pos] : NULL; ce->ce_mode = ce_mode_from_stat(ent, st.st_mode); } diff --git a/t/t3700-add.sh b/t/t3700-add.sh index ad8cc7d..d75970b 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -110,4 +110,18 @@ test_expect_success 'check correct prefix detection' ' git add 1/2/a 1/3/b 1/2/c ' +test_expect_success 'git add and filemode=0 with unmerged entries' ' + echo 1 > stage1 && + echo 2 > stage2 && + echo 3 > stage3 && + for s in 1 2 3 + do + echo "100755 $(git hash-object -w stage$s) $s file" + done | git update-index --index-info && + git config core.filemode 0 && + echo new > file && + git add file && + git ls-files --stage | grep "^100755 .* 0 file$" +' + test_done -- 1.5.2.2.3228.g16a27 - 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