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:
Junio C Hamano 2021-09-15 13:15:26 -07:00
commit c76fcf3e46
2 changed files with 66 additions and 0 deletions

21
apply.c
View File

@ -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);

View File

@ -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