diff options
author | Junio C Hamano <gitster@pobox.com> | 2007-08-14 15:33:07 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-08-14 22:20:01 -0700 |
commit | b798671fa935492ce511766bc99fb26b2892499b (patch) | |
tree | 6a28de76dea881193189cee59a6c499a254d4767 /merge-recursive.c | |
parent | 9fa3465d6be83c08ed24762c82eb33cb005729f3 (diff) | |
download | git-b798671fa935492ce511766bc99fb26b2892499b.tar.gz |
merge-recursive: do not rudely die on binary merge
When you try to merge a path that involves binary file-level
merge, merge-recursive died rudely without cleaning up its own
mess. A files added by the merge were left in the working tree,
but the index was not written out (because it just punted and
died), so it was cumbersome for the user to retry it by first
running "git reset --hard".
This changes merge-recursive to still warn but do the "binary"
merge for such a path; leave the "our" version in the working
tree, but still keep the path unmerged so that the user can sort
it out.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'merge-recursive.c')
-rw-r--r-- | merge-recursive.c | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/merge-recursive.c b/merge-recursive.c index f7d1b84999..5326d7c97a 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -677,6 +677,26 @@ struct ll_merge_driver { /* * Built-in low-levels */ +static int ll_binary_merge(const struct ll_merge_driver *drv_unused, + const char *path_unused, + mmfile_t *orig, + mmfile_t *src1, const char *name1, + mmfile_t *src2, const char *name2, + mmbuffer_t *result) +{ + /* + * The tentative merge result is "ours" for the final round, + * or common ancestor for an internal merge. Still return + * "conflicted merge" status. + */ + mmfile_t *stolen = index_only ? orig : src1; + + result->ptr = stolen->ptr; + result->size = stolen->size; + stolen->ptr = NULL; + return 1; +} + static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, const char *path_unused, mmfile_t *orig, @@ -687,10 +707,15 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, xpparam_t xpp; if (buffer_is_binary(orig->ptr, orig->size) || - buffer_is_binary(src1->ptr, src1->size) || - buffer_is_binary(src2->ptr, src2->size)) - return error("Cannot merge binary files: %s vs. %s\n", + buffer_is_binary(src1->ptr, src1->size) || + buffer_is_binary(src2->ptr, src2->size)) { + warning("Cannot merge binary files: %s vs. %s\n", name1, name2); + return ll_binary_merge(drv_unused, path_unused, + orig, src1, name1, + src2, name2, + result); + } memset(&xpp, 0, sizeof(xpp)); return xdl_merge(orig, @@ -743,26 +768,6 @@ static int ll_union_merge(const struct ll_merge_driver *drv_unused, return 0; } -static int ll_binary_merge(const struct ll_merge_driver *drv_unused, - const char *path_unused, - mmfile_t *orig, - mmfile_t *src1, const char *name1, - mmfile_t *src2, const char *name2, - mmbuffer_t *result) -{ - /* - * The tentative merge result is "ours" for the final round, - * or common ancestor for an internal merge. Still return - * "conflicted merge" status. - */ - mmfile_t *stolen = index_only ? orig : src1; - - result->ptr = stolen->ptr; - result->size = stolen->size; - stolen->ptr = NULL; - return 1; -} - #define LL_BINARY_MERGE 0 #define LL_TEXT_MERGE 1 #define LL_UNION_MERGE 2 |