summaryrefslogtreecommitdiff
path: root/merge-recursive.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2009-08-21 18:34:24 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-08-21 18:34:24 (GMT)
commit3a2dd481e51ed3ea01b84c7db4c661a0a3d5279c (patch)
tree91ce5e5495f5d022bebd77ea41bd51970e8ec3db /merge-recursive.c
parentd3ebb174ea0881ff1d801174d18271bfc50245e3 (diff)
parentc94736a27f89bfc268aed0de7264deecdc136a58 (diff)
downloadgit-3a2dd481e51ed3ea01b84c7db4c661a0a3d5279c.zip
git-3a2dd481e51ed3ea01b84c7db4c661a0a3d5279c.tar.gz
git-3a2dd481e51ed3ea01b84c7db4c661a0a3d5279c.tar.bz2
Merge branch 'jc/maint-merge-recursive-fix' into maint
* jc/maint-merge-recursive-fix: merge-recursive: don't segfault while handling rename clashes
Diffstat (limited to 'merge-recursive.c')
-rw-r--r--merge-recursive.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/merge-recursive.c b/merge-recursive.c
index d415c41..10d7913 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -952,9 +952,31 @@ static int process_renames(struct merge_options *o,
"%s added in %s",
ren1_src, ren1_dst, branch1,
ren1_dst, branch2);
- new_path = unique_path(o, ren1_dst, branch2);
- output(o, 1, "Adding as %s instead", new_path);
- update_file(o, 0, dst_other.sha1, dst_other.mode, new_path);
+ if (o->call_depth) {
+ struct merge_file_info mfi;
+ struct diff_filespec one, a, b;
+
+ one.path = a.path = b.path =
+ (char *)ren1_dst;
+ hashcpy(one.sha1, null_sha1);
+ one.mode = 0;
+ hashcpy(a.sha1, ren1->pair->two->sha1);
+ a.mode = ren1->pair->two->mode;
+ hashcpy(b.sha1, dst_other.sha1);
+ b.mode = dst_other.mode;
+ mfi = merge_file(o, &one, &a, &b,
+ branch1,
+ branch2);
+ output(o, 1, "Adding merged %s", ren1_dst);
+ update_file(o, 0,
+ mfi.sha,
+ mfi.mode,
+ ren1_dst);
+ } else {
+ new_path = unique_path(o, ren1_dst, branch2);
+ output(o, 1, "Adding as %s instead", new_path);
+ update_file(o, 0, dst_other.sha1, dst_other.mode, new_path);
+ }
} else if ((item = string_list_lookup(ren1_dst, renames2Dst))) {
ren2 = item->util;
clean_merge = 0;