merge-recursive: add/add really is modify/modify with an empty base
Unify the handling for cases C (add/add) and D (modify/modify). Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
8042ed1ceb
commit
f953831e03
@ -610,6 +610,12 @@ static void fill_mm(const unsigned char *sha1, mmfile_t *mm)
|
|||||||
unsigned long size;
|
unsigned long size;
|
||||||
char type[20];
|
char type[20];
|
||||||
|
|
||||||
|
if (!hashcmp(sha1, null_sha1)) {
|
||||||
|
mm->ptr = xstrdup("");
|
||||||
|
mm->size = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mm->ptr = read_sha1_file(sha1, type, &size);
|
mm->ptr = read_sha1_file(sha1, type, &size);
|
||||||
if (!mm->ptr || strcmp(type, blob_type))
|
if (!mm->ptr || strcmp(type, blob_type))
|
||||||
die("unable to read blob object %s", sha1_to_hex(sha1));
|
die("unable to read blob object %s", sha1_to_hex(sha1));
|
||||||
@ -1045,38 +1051,17 @@ static int process_entry(const char *path, struct stage_data *entry,
|
|||||||
output("Adding %s", path);
|
output("Adding %s", path);
|
||||||
update_file(1, sha, mode, path);
|
update_file(1, sha, mode, path);
|
||||||
}
|
}
|
||||||
} else if (!o_sha && a_sha && b_sha) {
|
} else if (a_sha && b_sha) {
|
||||||
/* Case C: Added in both (check for same permissions). */
|
/* Case C: Added in both (check for same permissions) and */
|
||||||
if (sha_eq(a_sha, b_sha)) {
|
|
||||||
if (a_mode != b_mode) {
|
|
||||||
clean_merge = 0;
|
|
||||||
output("CONFLICT: File %s added identically in both branches, "
|
|
||||||
"but permissions conflict %06o->%06o",
|
|
||||||
path, a_mode, b_mode);
|
|
||||||
output("CONFLICT: adding with permission: %06o", a_mode);
|
|
||||||
update_file(0, a_sha, a_mode, path);
|
|
||||||
} else {
|
|
||||||
/* This case is handled by git-read-tree */
|
|
||||||
assert(0 && "This case must be handled by git-read-tree");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const char *new_path1, *new_path2;
|
|
||||||
clean_merge = 0;
|
|
||||||
new_path1 = unique_path(path, branch1);
|
|
||||||
new_path2 = unique_path(path, branch2);
|
|
||||||
output("CONFLICT (add/add): File %s added non-identically "
|
|
||||||
"in both branches. Adding as %s and %s instead.",
|
|
||||||
path, new_path1, new_path2);
|
|
||||||
remove_file(0, path, 0);
|
|
||||||
update_file(0, a_sha, a_mode, new_path1);
|
|
||||||
update_file(0, b_sha, b_mode, new_path2);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (o_sha && a_sha && b_sha) {
|
|
||||||
/* case D: Modified in both, but differently. */
|
/* case D: Modified in both, but differently. */
|
||||||
|
const char *reason = "content";
|
||||||
struct merge_file_info mfi;
|
struct merge_file_info mfi;
|
||||||
struct diff_filespec o, a, b;
|
struct diff_filespec o, a, b;
|
||||||
|
|
||||||
|
if (!o_sha) {
|
||||||
|
reason = "add/add";
|
||||||
|
o_sha = (unsigned char *)null_sha1;
|
||||||
|
}
|
||||||
output("Auto-merging %s", path);
|
output("Auto-merging %s", path);
|
||||||
o.path = a.path = b.path = (char *)path;
|
o.path = a.path = b.path = (char *)path;
|
||||||
hashcpy(o.sha1, o_sha);
|
hashcpy(o.sha1, o_sha);
|
||||||
@ -1093,7 +1078,8 @@ static int process_entry(const char *path, struct stage_data *entry,
|
|||||||
update_file(1, mfi.sha, mfi.mode, path);
|
update_file(1, mfi.sha, mfi.mode, path);
|
||||||
else {
|
else {
|
||||||
clean_merge = 0;
|
clean_merge = 0;
|
||||||
output("CONFLICT (content): Merge conflict in %s", path);
|
output("CONFLICT (%s): Merge conflict in %s",
|
||||||
|
reason, path);
|
||||||
|
|
||||||
if (index_only)
|
if (index_only)
|
||||||
update_file(0, mfi.sha, mfi.mode, path);
|
update_file(0, mfi.sha, mfi.mode, path);
|
||||||
|
12
t/t6024-recursive-merge.sh
Executable file → Normal file
12
t/t6024-recursive-merge.sh
Executable file → Normal file
@ -58,9 +58,19 @@ GIT_AUTHOR_DATE="2006-12-12 23:00:08" git commit -m F
|
|||||||
|
|
||||||
test_expect_failure "combined merge conflicts" "git merge -m final G"
|
test_expect_failure "combined merge conflicts" "git merge -m final G"
|
||||||
|
|
||||||
|
cat > expect << EOF
|
||||||
|
<<<<<<< HEAD/a1
|
||||||
|
F
|
||||||
|
=======
|
||||||
|
G
|
||||||
|
>>>>>>> 26f86b677eb03d4d956dbe108b29cb77061c1e73/a1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success "result contains a conflict" "diff -u expect a1"
|
||||||
|
|
||||||
git ls-files --stage > out
|
git ls-files --stage > out
|
||||||
cat > expect << EOF
|
cat > expect << EOF
|
||||||
100644 f70f10e4db19068f79bc43844b49f3eece45c4e8 1 a1
|
100644 f16f906ab60483c100d1241dfc39868de9ec9fcb 1 a1
|
||||||
100644 cf84443e49e1b366fac938711ddf4be2d4d1d9e9 2 a1
|
100644 cf84443e49e1b366fac938711ddf4be2d4d1d9e9 2 a1
|
||||||
100644 fd7923529855d0b274795ae3349c5e0438333979 3 a1
|
100644 fd7923529855d0b274795ae3349c5e0438333979 3 a1
|
||||||
EOF
|
EOF
|
||||||
|
Loading…
Reference in New Issue
Block a user