git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 6/8] apply: fall back on three-way merge

From
Junio C Hamano <gitster@pobox.com>
Date
May 10, 2012, 15:10 UTC
Message-ID
<7v4nrooyv1.fsf@alter.siamese.dyndns.org>
In-Reply-To
<vpqy5p0bioh.fsf@bauges.imag.fr>
Matthieu Moy <Matthieu.Moy@grenoble-inp.fr> writes:
Show 8 quoted lines
> Junio C Hamano <gitster@pobox.com> writes:
>
>> +	/* Preimage the patch was prepared for */
>> +	if (get_sha1(patch->old_sha1_prefix, pre_sha1) ||
>> +	    read_blob_object(&buf, pre_sha1, patch->old_mode))
>> +		return error("repository lacks necessary blobs to fall back on 3-way merge.");
>
> What happens if there are multiple objects for the same pre_sha1?

We probably would not get anythning out of get_sha1() due to ambiguity and we would punt.

We could inroduce get_all_possible_sha1_among_ambigous_ones() to grab an array, try to apply and use the first one, but I do not know if it is really worth the effort. The usefulness of -3 is limited to only two cases in practice, and neither case gives you a big chance of seeing such a collision. Either you are applying a patch from others that was based on something you shared with them in the past, hence it is very likely that you and they shared a very similar set of objects that determined the length of the abbreviated object name shown on the "index" line, in which case the chance of ambiguity is not that great, or you are using the diff to apply pipeline in a workflow similar to the ones I recently described in messages in another thread, in which case the patch is taken from your own repository and the length of the abbreviated object name shown on the "index" line is determined not to be ambiguous in the first place.

If we happened to grab totally unrelated pre_sha1, the patch won't apply, and we would not cause any damage.

An interesting point that is worth noting is that if we happened to grab a pre_sha1 that is different from what the original patch was based on, it does not introduce a mis-apply risk, either. We only fall back to the merge after making sure the patch applies to the "original" (which may not be exactly what the patch was based on), which ensures that the preimage shown in the hunks of the patch match. Because the application of the patch to the "original" found will by definition only modify the part that is shown in the hunks of the patch, any difference between the preimage we find and the true preimage the patch was based on will cancel out in the three-way merge step.

Previous: Matthieu MoyNext: Matthieu Moy
Message 11 of 19 in “"git apply --threeway"”
  1. 0/8 "git apply --threeway"Junio C Hamano, May 10, 2012
  2. 1/8 apply: reformat commentJunio C Hamano, May 10, 2012
  3. 2/8 apply: accept --threeway command line optionJunio C Hamano, May 10, 2012
  4. Nguyen Thai Ngoc DuyMay 10, 2012
  5. Junio C HamanoMay 10, 2012
  6. 3/8 apply: split load_preimage() helper function outJunio C Hamano, May 10, 2012
  7. 4/8 apply: clear_image() clears things a bit moreJunio C Hamano, May 10, 2012
  8. 5/8 apply: refactor read_file_or_gitlink()Junio C Hamano, May 10, 2012
  9. 6/8 apply: fall back on three-way mergeJunio C Hamano, May 10, 2012
  10. Matthieu MoyMay 10, 2012
  11. Junio C HamanoMay 10, 2012
  12. Matthieu MoyMay 10, 2012
  13. Jeff KingMay 10, 2012
  14. Junio C HamanoMay 10, 2012
  15. Jeff KingMay 10, 2012
  16. 7/8 apply: plug the three-way merge logic inJunio C Hamano, May 10, 2012
  17. 8/8 apply: register conflicted stages to the indexJunio C Hamano, May 10, 2012
  18. Matthieu MoyMay 10, 2012
  19. Junio C HamanoMay 10, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.