]> git.ipfire.org Git - thirdparty/git.git/commit
resolve-undo: allow resurrecting conflicted state that resolved to deletion
authorJunio C Hamano <gitster@pobox.com>
Mon, 31 Jul 2023 22:44:04 +0000 (15:44 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 31 Jul 2023 22:46:18 +0000 (15:46 -0700)
commitfe83269e16c1fd57df42c2a22a2b9ee621175a75
tree9df9f4313c4bde3d4a823a12ef894ce03ef5b4f0
parent91e07058c5663d01d39a00418c91415d0227d53c
resolve-undo: allow resurrecting conflicted state that resolved to deletion

The resolve-undo index extension records up to three (mode, object
name) tuples for non-zero stages for each path that was resolved,
to be used to recreate the original conflicted state later when the
user requests.

The unmerge_index_entry_at() function uses the resolve-undo data to
do so, but it assumes that the path for which the conflicted state
needs to be recreated can be specified by the position in the
active_cache[] array.  This obviously cannot salvage the state of
conflicted paths that were resolved by removing them.  For example,
a delete-modify conflict, in which the change whose "modify" side
made is a trivial typofix, may legitimately be resolved to remove
the path, and resolve-undo extension does record the two (mode,
object name) tuples for the common ancestor version and their
version, lacking our version.  But after recording such a removal of
the path, you should be able to use resolve-undo data to recreate
the conflicted state.

Introduce a new unmerge_index_entry() helper function that takes the
path (which does not necessarily have to exist in the active_cache[]
array) and resolve-undo data, and use it to reimplement unmerge_index()
public function that is used by "git rerere".

The limited interface is still kept for now, as it is used by "git
checkout -m" and "git update-index --unmerge", but these two codepaths
will be updated to lift the assumption to allow conflicts that resolved
to deletion can be recreated.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
resolve-undo.c
resolve-undo.h