Binary file-friendly merge -Xours or -Xtheirs?

2012-09-07 Thread Stephen Bash
Hi all-

Helping a coworker resolve merge conflicts today I found I wanted a -Xtheirs 
that completely replaces conflicted binary files with the copy from the 
incoming branch.  In other words rather than doing

  $ git merge maint
  ... conflicts occur ...
  $ git checkout --theirs -- path/to/binary-file
  $ git add path/to/binary-file
  $ git commit

I'd like to do

  $ git merge -Xbinary_theirs maint
  ... binary conflicts are resolved automatically ...

From reading the docs it's obvious the current -Xours and -Xtheirs expect to 
work on hunks, so I (mostly) understand the current behavior, but as a user it 
feels like I'm telling you how to resolve conflicts, please do the same thing 
for binary files.

I am missing a solution that already exists?  Or is this perhaps an improvement 
that could be made?

Thanks,
Stephen
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Binary file-friendly merge -Xours or -Xtheirs?

2012-09-07 Thread Junio C Hamano
Stephen Bash b...@genarts.com writes:

 From reading the docs it's obvious the current -Xours and -Xtheirs
 expect to work on hunks, so I (mostly) understand the current
 behavior, but as a user it feels like I'm telling you how to
 resolve conflicts, please do the same thing for binary files.

Even though merge-recursive accepts -Xours/-Xtheirs, I do not think
the low-level merge machinery for anything but the text merge is
aware of the option.

It may be just the matter of something like this, though (completely
untested).



 ll-merge.c | 25 -
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git i/ll-merge.c w/ll-merge.c
index f3f7692..fee578f 100644
--- i/ll-merge.c
+++ w/ll-merge.c
@@ -46,16 +46,31 @@ static int ll_binary_merge(const struct ll_merge_driver 
*drv_unused,
assert(opts);
 
/*
-* The tentative merge result is ours for the final round,
-* or common ancestor for an internal merge.  Still return
-* conflicted merge status.
+* The tentative merge result is the or common ancestor for an internal 
merge.
 */
-   stolen = opts-virtual_ancestor ? orig : src1;
+   if (opts-virtual_ancestor) {
+   stolen = orig;
+   } else {
+   switch (opts-variant) {
+   default:
+   case XDL_MERGE_FAVOR_OURS:
+   stolen = src1;
+   break;
+   case XDL_MERGE_FAVOR_THEIRS:
+   stolen = src2;
+   break;
+   }
+   }
 
result-ptr = stolen-ptr;
result-size = stolen-size;
stolen-ptr = NULL;
-   return 1;
+
+   /*
+* With -Xtheirs or -Xours, we have cleanly merged;
+* otherwise we got a conflict.
+*/
+   return (opts-variant ? 0 : 1);
 }
 
 static int ll_xdl_merge(const struct ll_merge_driver *drv_unused,
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html