diff options
author | Junio C Hamano <gitster@pobox.com> | 2023-08-01 00:44:04 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2023-08-01 00:46:18 +0200 |
commit | fe83269e16c1fd57df42c2a22a2b9ee621175a75 (patch) | |
tree | 9df9f4313c4bde3d4a823a12ef894ce03ef5b4f0 /resolve-undo.h | |
parent | update-index: do not read HEAD and MERGE_HEAD unconditionally (diff) | |
download | git-fe83269e16c1fd57df42c2a22a2b9ee621175a75.tar.xz git-fe83269e16c1fd57df42c2a22a2b9ee621175a75.zip |
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>
Diffstat (limited to 'resolve-undo.h')
-rw-r--r-- | resolve-undo.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/resolve-undo.h b/resolve-undo.h index c5deafc92f..1ae321c88b 100644 --- a/resolve-undo.h +++ b/resolve-undo.h @@ -18,6 +18,7 @@ void resolve_undo_write(struct strbuf *, struct string_list *); struct string_list *resolve_undo_read(const char *, unsigned long); void resolve_undo_clear_index(struct index_state *); int unmerge_index_entry_at(struct index_state *, int); +int unmerge_index_entry(struct index_state *, const char *, struct resolve_undo_info *); void unmerge_index(struct index_state *, const struct pathspec *); void unmerge_marked_index(struct index_state *); |