|
|
|
@ -964,58 +964,55 @@ static void conflict_rename_delete(struct merge_options *o,
@@ -964,58 +964,55 @@ static void conflict_rename_delete(struct merge_options *o,
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void conflict_rename_rename_1to2(struct merge_options *o, |
|
|
|
|
struct diff_filepair *pair1, |
|
|
|
|
const char *branch1, |
|
|
|
|
struct diff_filepair *pair2, |
|
|
|
|
const char *branch2) |
|
|
|
|
struct rename_conflict_info *ci) |
|
|
|
|
{ |
|
|
|
|
/* One file was renamed in both branches, but to different names. */ |
|
|
|
|
struct diff_filespec *one = ci->pair1->one; |
|
|
|
|
struct diff_filespec *a = ci->pair1->two; |
|
|
|
|
struct diff_filespec *b = ci->pair2->two; |
|
|
|
|
const char *dst_name_a = a->path; |
|
|
|
|
const char *dst_name_b = b->path; |
|
|
|
|
char *del[2]; |
|
|
|
|
int delp = 0; |
|
|
|
|
const char *src = pair1->one->path; |
|
|
|
|
const char *ren1_dst = pair1->two->path; |
|
|
|
|
const char *ren2_dst = pair2->two->path; |
|
|
|
|
const char *dst_name1 = ren1_dst; |
|
|
|
|
const char *dst_name2 = ren2_dst; |
|
|
|
|
|
|
|
|
|
output(o, 1, "CONFLICT (rename/rename): " |
|
|
|
|
"Rename \"%s\"->\"%s\" in branch \"%s\" " |
|
|
|
|
"rename \"%s\"->\"%s\" in \"%s\"%s", |
|
|
|
|
src, pair1->two->path, branch1, |
|
|
|
|
src, pair2->two->path, branch2, |
|
|
|
|
one->path, a->path, ci->branch1, |
|
|
|
|
one->path, b->path, ci->branch2, |
|
|
|
|
o->call_depth ? " (left unresolved)" : ""); |
|
|
|
|
if (dir_in_way(ren1_dst, !o->call_depth)) { |
|
|
|
|
dst_name1 = del[delp++] = unique_path(o, ren1_dst, branch1); |
|
|
|
|
if (dir_in_way(a->path, !o->call_depth)) { |
|
|
|
|
dst_name_a = del[delp++] = unique_path(o, a->path, ci->branch1); |
|
|
|
|
output(o, 1, "%s is a directory in %s adding as %s instead", |
|
|
|
|
ren1_dst, branch2, dst_name1); |
|
|
|
|
a->path, ci->branch2, dst_name_a); |
|
|
|
|
} |
|
|
|
|
if (dir_in_way(ren2_dst, !o->call_depth)) { |
|
|
|
|
dst_name2 = del[delp++] = unique_path(o, ren2_dst, branch2); |
|
|
|
|
if (dir_in_way(b->path, !o->call_depth)) { |
|
|
|
|
dst_name_b = del[delp++] = unique_path(o, b->path, ci->branch2); |
|
|
|
|
output(o, 1, "%s is a directory in %s adding as %s instead", |
|
|
|
|
ren2_dst, branch1, dst_name2); |
|
|
|
|
b->path, ci->branch1, dst_name_b); |
|
|
|
|
} |
|
|
|
|
if (o->call_depth) { |
|
|
|
|
struct merge_file_info mfi; |
|
|
|
|
mfi = merge_file(o, src, |
|
|
|
|
pair1->one->sha1, pair1->one->mode, |
|
|
|
|
pair1->two->sha1, pair1->two->mode, |
|
|
|
|
pair2->two->sha1, pair2->two->mode, |
|
|
|
|
branch1, branch2); |
|
|
|
|
mfi = merge_file(o, one->path, |
|
|
|
|
one->sha1, one->mode, |
|
|
|
|
a->sha1, a->mode, |
|
|
|
|
b->sha1, b->mode, |
|
|
|
|
ci->branch1, ci->branch2); |
|
|
|
|
/* |
|
|
|
|
* FIXME: For rename/add-source conflicts (if we could detect |
|
|
|
|
* such), this is wrong. We should instead find a unique |
|
|
|
|
* pathname and then either rename the add-source file to that |
|
|
|
|
* unique path, or use that unique path instead of src here. |
|
|
|
|
*/ |
|
|
|
|
update_file(o, 0, mfi.sha, mfi.mode, src); |
|
|
|
|
remove_file_from_cache(ren1_dst); |
|
|
|
|
remove_file_from_cache(ren2_dst); |
|
|
|
|
update_file(o, 0, mfi.sha, mfi.mode, one->path); |
|
|
|
|
remove_file_from_cache(a->path); |
|
|
|
|
remove_file_from_cache(b->path); |
|
|
|
|
} else { |
|
|
|
|
update_stages(ren1_dst, NULL, pair1->two, NULL); |
|
|
|
|
update_stages(ren2_dst, NULL, NULL, pair2->two); |
|
|
|
|
update_stages(a->path, NULL, a, NULL); |
|
|
|
|
update_stages(b->path, NULL, NULL, b); |
|
|
|
|
|
|
|
|
|
update_file(o, 0, pair1->two->sha1, pair1->two->mode, dst_name1); |
|
|
|
|
update_file(o, 0, pair2->two->sha1, pair2->two->mode, dst_name2); |
|
|
|
|
update_file(o, 0, a->sha1, a->mode, dst_name_a); |
|
|
|
|
update_file(o, 0, b->sha1, b->mode, dst_name_b); |
|
|
|
|
} |
|
|
|
|
while (delp--) |
|
|
|
|
free(del[delp]); |
|
|
|
@ -1503,10 +1500,7 @@ static int process_entry(struct merge_options *o,
@@ -1503,10 +1500,7 @@ static int process_entry(struct merge_options *o,
|
|
|
|
|
break; |
|
|
|
|
case RENAME_ONE_FILE_TO_TWO: |
|
|
|
|
clean_merge = 0; |
|
|
|
|
conflict_rename_rename_1to2(o, conflict_info->pair1, |
|
|
|
|
conflict_info->branch1, |
|
|
|
|
conflict_info->pair2, |
|
|
|
|
conflict_info->branch2); |
|
|
|
|
conflict_rename_rename_1to2(o, conflict_info); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
entry->processed = 0; |
|
|
|
|