Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- read-cache.c | 2 +- resolve-undo.c | 36 +++++++++++++++++++++++++++++++++++- resolve-undo.h | 4 +++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/read-cache.c b/read-cache.c index eec030b3bb..3b5c63f53a 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1701,7 +1701,7 @@ static int read_index_extension(struct index_state *istate, istate->cache_tree = cache_tree_read(data, sz); break; case CACHE_EXT_RESOLVE_UNDO: - istate->resolve_undo = resolve_undo_read(data, sz); + istate->resolve_undo = resolve_undo_read(data, sz, istate->jw); break; case CACHE_EXT_LINK: if (read_link_extension(istate, data, sz)) diff --git a/resolve-undo.c b/resolve-undo.c index 236320f179..999020bc40 100644 --- a/resolve-undo.c +++ b/resolve-undo.c @@ -1,5 +1,6 @@ #include "cache.h" #include "dir.h" +#include "json-writer.h" #include "resolve-undo.h" #include "string-list.h" @@ -49,7 +50,8 @@ void resolve_undo_write(struct strbuf *sb, struct string_list *resolve_undo) } } -struct string_list *resolve_undo_read(const char *data, unsigned long size) +struct string_list *resolve_undo_read(const char *data, unsigned long size, + struct json_writer *jw) { struct string_list *resolve_undo; size_t len; @@ -59,6 +61,11 @@ struct string_list *resolve_undo_read(const char *data, unsigned long size) resolve_undo = xcalloc(1, sizeof(*resolve_undo)); resolve_undo->strdup_strings = 1; + if (jw) { + jw_object_inline_begin_object(jw, "resolve-undo"); + jw_object_intmax(jw, "ext-size", size); + jw_object_inline_begin_array(jw, "entries"); + } while (size) { struct string_list_item *lost; @@ -94,6 +101,33 @@ struct string_list *resolve_undo_read(const char *data, unsigned long size) size -= rawsz; data += rawsz; } + + if (jw) { + struct strbuf sb = STRBUF_INIT; + + jw_array_inline_begin_object(jw); + jw_object_string(jw, "path", lost->string); + + jw_object_inline_begin_array(jw, "mode"); + for (i = 0; i < 3; i++) { + strbuf_addf(&sb, "%06o", ui->mode[i]); + jw_array_string(jw, sb.buf); + strbuf_reset(&sb); + } + jw_end(jw); + + jw_object_inline_begin_array(jw, "oid"); + for (i = 0; i < 3; i++) + jw_array_string(jw, oid_to_hex(&ui->oid[i])); + jw_end(jw); + + jw_end(jw); + strbuf_release(&sb); + } + } + if (jw) { + jw_end(jw); /* entries */ + jw_end(jw); /* resolve-undo */ } return resolve_undo; diff --git a/resolve-undo.h b/resolve-undo.h index 2b3f0f901e..46b4e93a7e 100644 --- a/resolve-undo.h +++ b/resolve-undo.h @@ -3,6 +3,8 @@ #include "cache.h" +struct json_writer; + struct resolve_undo_info { unsigned int mode[3]; struct object_id oid[3]; @@ -10,7 +12,7 @@ struct resolve_undo_info { void record_resolve_undo(struct index_state *, struct cache_entry *); void resolve_undo_write(struct strbuf *, struct string_list *); -struct string_list *resolve_undo_read(const char *, unsigned long); +struct string_list *resolve_undo_read(const char *, unsigned long, struct json_writer *); void resolve_undo_clear_index(struct index_state *); int unmerge_index_entry_at(struct index_state *, int); void unmerge_index(struct index_state *, const struct pathspec *); -- 2.22.0.rc0.322.g2b0371e29a