Make git read the resolve-undo data from the index. Since the resolve-undo data is joined with the conflicts in the ondisk format of the index file version 5, conflicts and resolved data is read at the same time, and the resolve-undo data is then converted to the in-memory format. Helped-by: Thomas Rast <trast@xxxxxxxxxxxxxxx> Signed-off-by: Thomas Gummerer <t.gummerer@xxxxxxxxx> --- read-cache-v5.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/read-cache-v5.c b/read-cache-v5.c index 2031969..fb549de 100644 --- a/read-cache-v5.c +++ b/read-cache-v5.c @@ -1,5 +1,6 @@ #include "cache.h" #include "read-cache.h" +#include "string-list.h" #include "resolve-undo.h" #include "cache-tree.h" @@ -447,6 +448,42 @@ static int read_conflicts(struct conflict_entry **head, return 0; } +static void resolve_undo_convert_v5(struct index_state *istate, + struct conflict_entry *ce) +{ + int i; + + while (ce) { + struct string_list_item *lost; + struct resolve_undo_info *ui; + struct conflict_part *cp; + + if (ce->entries && (ce->entries->flags & CONFLICT_CONFLICTED) != 0) { + ce = ce->next; + continue; + } + if (!istate->resolve_undo) { + istate->resolve_undo = xcalloc(1, sizeof(struct string_list)); + istate->resolve_undo->strdup_strings = 1; + } + + lost = string_list_insert(istate->resolve_undo, ce->name); + if (!lost->util) + lost->util = xcalloc(1, sizeof(*ui)); + ui = lost->util; + + cp = ce->entries; + for (i = 0; i < 3; i++) + ui->mode[i] = 0; + while (cp) { + ui->mode[conflict_stage(cp) - 1] = cp->entry_mode; + hashcpy(ui->sha1[conflict_stage(cp) - 1], cp->sha1); + cp = cp->next; + } + ce = ce->next; + } +} + static int read_entries(struct index_state *istate, struct directory_entry **de, unsigned long *entry_offset, void **mmap, unsigned long mmap_size, int *nr, @@ -460,6 +497,7 @@ static int read_entries(struct index_state *istate, struct directory_entry **de, conflict_queue = NULL; if (read_conflicts(&conflict_queue, *de, mmap, mmap_size) < 0) return -1; + resolve_undo_convert_v5(istate, conflict_queue); for (i = 0; i < (*de)->de_nfiles; i++) { if (read_entry(&ce, *de, -- 1.7.11.2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html