All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Bagas Sanjaya <bagasdotme@gmail.com>
Cc: Jan Kratochvil <jan@jankratochvil.net>, git@vger.kernel.org
Subject: Re: bugreport: git apply -3 confusing "lacks the necessary blob"
Date: Fri, 20 Aug 2021 10:40:12 -0700	[thread overview]
Message-ID: <xmqqtujkui9v.fsf@gitster.g> (raw)
In-Reply-To: <73a31988-d298-0168-43d5-849f91366d7d@gmail.com> (Bagas Sanjaya's message of "Fri, 20 Aug 2021 16:19:39 +0700")

Bagas Sanjaya <bagasdotme@gmail.com> writes:

> On 19/08/21 01.17, Jan Kratochvil wrote:
>> reproducer:
>> (set -ex;: rm -rf gitgit;mkdir gitgit;cd gitgit;git init;echo a >x;git add x;git commit -am.;git checkout -b b;echo b >x;git commit -am.;git checkout master;echo c >x;git commit -am.;git diff master^..b|grep -v ^index >b.diff;git apply -3 b.diff || cat b.diff)
>
> I can reproduce your issue on latest Git (2.33.0).
>
> It seems like you remove `index` line, which **may** contain blob hash
> information required for three-way merge with git apply -3.
>
> But if you don't remove it when generating patch that way, you will
> get expected conflict when git applying.

You make it sound like an "it hurts when I do this, doctor. ---do
not do it, then" exchange ;-).

But I think Jan is talking about the case where users get a patch
that lacks the "index" information out of other people's "diff"
implementation and try to "apply -3" without realizing that it is
not Git's "diff" output.

Perhaps something like the attached patch would be a good start.

There is another place that relies on the index line (application of
binary patch), but the code rejects any patch that does not have the
full-length object name with "... without full index line".  This
message was originally meant to reject patches with abbreviated
object names on the index line, but it would equally apply to one
without the index line (perhaps by accident), so there is no need to
touch that one.


 apply.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git i/apply.c w/apply.c
index 44bc31d6eb..9972ada57e 100644
--- i/apply.c
+++ w/apply.c
@@ -3566,6 +3566,8 @@ static int try_threeway(struct apply_state *state,
 	/* Preimage the patch was prepared for */
 	if (patch->is_new)
 		write_object_file("", 0, blob_type, &pre_oid);
+	else if (!*patch->old_oid_prefix && !*patch->new_oid_prefix)
+		return error(_("cannot 'apply -3' a patch without the index line"));
 	else if (get_oid(patch->old_oid_prefix, &pre_oid) ||
 		 read_blob_object(&buf, &pre_oid, patch->old_mode))
 		return error(_("repository lacks the necessary blob to perform 3-way merge."));


  parent reply	other threads:[~2021-08-20 17:40 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-18 18:17 bugreport: git apply -3 confusing "lacks the necessary blob" Jan Kratochvil
2021-08-20  9:19 ` Bagas Sanjaya
2021-08-20  9:26   ` Jan Kratochvil
2021-08-20 17:40   ` Junio C Hamano [this message]
2021-08-20 18:30     ` Jan Kratochvil
2021-08-27 15:15     ` Jan Kratochvil
2021-08-27 17:14       ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqtujkui9v.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=bagasdotme@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=jan@jankratochvil.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.