Merge branch 'jc/trivial-threeway-binary-merge'
The "git apply -3" code path learned not to bother the lower level merge machinery when the three-way merge can be trivially resolved without the content level merge. * jc/trivial-threeway-binary-merge: apply: resolve trivial merge without hitting ll-merge with "--3way"
This commit is contained in:
commit
c76fcf3e46
21
apply.c
21
apply.c
@ -3468,6 +3468,21 @@ static int load_preimage(struct apply_state *state,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int resolve_to(struct image *image, const struct object_id *result_id)
|
||||
{
|
||||
unsigned long size;
|
||||
enum object_type type;
|
||||
|
||||
clear_image(image);
|
||||
|
||||
image->buf = read_object_file(result_id, &type, &size);
|
||||
if (!image->buf || type != OBJ_BLOB)
|
||||
die("unable to read blob object %s", oid_to_hex(result_id));
|
||||
image->len = size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int three_way_merge(struct apply_state *state,
|
||||
struct image *image,
|
||||
char *path,
|
||||
@ -3479,6 +3494,12 @@ static int three_way_merge(struct apply_state *state,
|
||||
mmbuffer_t result = { NULL };
|
||||
int status;
|
||||
|
||||
/* resolve trivial cases first */
|
||||
if (oideq(base, ours))
|
||||
return resolve_to(image, theirs);
|
||||
else if (oideq(base, theirs) || oideq(ours, theirs))
|
||||
return resolve_to(image, ours);
|
||||
|
||||
read_mmblob(&base_file, base);
|
||||
read_mmblob(&our_file, ours);
|
||||
read_mmblob(&their_file, theirs);
|
||||
|
@ -230,4 +230,49 @@ test_expect_success 'apply with --3way --cached and conflicts' '
|
||||
test_cmp expect.diff actual.diff
|
||||
'
|
||||
|
||||
test_expect_success 'apply binary file patch' '
|
||||
git reset --hard main &&
|
||||
cp "$TEST_DIRECTORY/test-binary-1.png" bin.png &&
|
||||
git add bin.png &&
|
||||
git commit -m "add binary file" &&
|
||||
|
||||
cp "$TEST_DIRECTORY/test-binary-2.png" bin.png &&
|
||||
|
||||
git diff --binary >bin.diff &&
|
||||
git reset --hard &&
|
||||
|
||||
# Apply must succeed.
|
||||
git apply bin.diff
|
||||
'
|
||||
|
||||
test_expect_success 'apply binary file patch with 3way' '
|
||||
git reset --hard main &&
|
||||
cp "$TEST_DIRECTORY/test-binary-1.png" bin.png &&
|
||||
git add bin.png &&
|
||||
git commit -m "add binary file" &&
|
||||
|
||||
cp "$TEST_DIRECTORY/test-binary-2.png" bin.png &&
|
||||
|
||||
git diff --binary >bin.diff &&
|
||||
git reset --hard &&
|
||||
|
||||
# Apply must succeed.
|
||||
git apply --3way --index bin.diff
|
||||
'
|
||||
|
||||
test_expect_success 'apply full-index patch with 3way' '
|
||||
git reset --hard main &&
|
||||
cp "$TEST_DIRECTORY/test-binary-1.png" bin.png &&
|
||||
git add bin.png &&
|
||||
git commit -m "add binary file" &&
|
||||
|
||||
cp "$TEST_DIRECTORY/test-binary-2.png" bin.png &&
|
||||
|
||||
git diff --full-index >bin.diff &&
|
||||
git reset --hard &&
|
||||
|
||||
# Apply must succeed.
|
||||
git apply --3way --index bin.diff
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user