Add support for using the new structured output modes for outputting status information. Signed-off-by: Julian Phillips <julian@xxxxxxxxxxxxxxxxx> --- builtin/commit.c | 12 +++++++++ wt-status.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ wt-status.h | 2 + 3 files changed, 87 insertions(+), 0 deletions(-) diff --git a/builtin/commit.c b/builtin/commit.c index c5ab683..77464d3 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -25,6 +25,7 @@ #include "rerere.h" #include "unpack-trees.h" #include "quote.h" +#include "output.h" static const char * const builtin_commit_usage[] = { "git commit [options] [--] <filepattern>...", @@ -68,6 +69,7 @@ static int all, edit_flag, also, interactive, only, amend, signoff; static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship; static int no_post_rewrite; static char *untracked_files_arg, *force_date; +static char *structured_output_arg; /* * The default commit message cleanup mode will remove the lines * beginning with # (shell comments) and leading and trailing @@ -91,6 +93,7 @@ static enum { STATUS_FORMAT_LONG, STATUS_FORMAT_SHORT, STATUS_FORMAT_PORCELAIN, + STATUS_FORMAT_STRUCTURED, } status_format = STATUS_FORMAT_LONG; static int opt_parse_m(const struct option *opt, const char *arg, int unset) @@ -1018,6 +1021,7 @@ int cmd_status(int argc, const char **argv, const char *prefix) { struct wt_status s; unsigned char sha1[20]; + enum output_style output_style; static struct option builtin_status_options[] = { OPT__VERBOSE(&verbose), OPT_SET_INT('s', "short", &status_format, @@ -1031,6 +1035,7 @@ int cmd_status(int argc, const char **argv, const char *prefix) "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, + OPT_OUTPUT(0, "structured-output", &structured_output_arg), OPT_END(), }; @@ -1045,6 +1050,10 @@ int cmd_status(int argc, const char **argv, const char *prefix) builtin_status_usage, 0); handle_untracked_files_arg(&s); + output_style = handle_output_arg(structured_output_arg); + if (output_style != OUTPUT_NORMAL) + status_format = STATUS_FORMAT_STRUCTURED; + if (*argv) s.pathspec = get_pathspec(prefix, argv); @@ -1068,6 +1077,9 @@ int cmd_status(int argc, const char **argv, const char *prefix) case STATUS_FORMAT_PORCELAIN: wt_porcelain_print(&s, null_termination); break; + case STATUS_FORMAT_STRUCTURED: + wt_structured_print(&s, output_style); + break; case STATUS_FORMAT_LONG: s.verbose = verbose; wt_status_print(&s); diff --git a/wt-status.c b/wt-status.c index 8ca59a2..162f719 100644 --- a/wt-status.c +++ b/wt-status.c @@ -750,3 +750,76 @@ void wt_porcelain_print(struct wt_status *s, int null_termination) s->prefix = NULL; wt_shortstatus_print(s, null_termination); } + +static void wt_structured_unmerged(struct string_list_item *it, + struct output_context *oc) +{ + struct wt_status_change_data *d = it->util; + char *ours = "?", *theirs = "?"; + + switch (d->stagemask) { + case 1: ours = "D"; theirs = "D"; break; /* both deleted */ + case 2: ours = "A"; theirs = "U"; break; /* added by us */ + case 3: ours = "U"; theirs = "D"; break; /* deleted by them */ + case 4: ours = "U"; theirs = "A"; break; /* added by them */ + case 5: ours = "D"; theirs = "U"; break; /* deleted by us */ + case 6: ours = "A"; theirs = "A"; break; /* both added */ + case 7: ours = "U"; theirs = "U"; break; /* both modified */ + } + + output_start_object(oc, "entry"); + output_str(oc, "name", it->string); + output_str(oc, "ours", ours); + output_str(oc, "theirs", theirs); + output_end_current(oc); +} + +static void wt_structured_status(struct string_list_item *it, + struct output_context *oc) +{ + struct wt_status_change_data *d = it->util; + char index = '-', worktree = '-'; + + if (d->index_status) + index = d->index_status; + if (d->worktree_status) + worktree = d->worktree_status; + + output_start_object(oc, "entry"); + output_str(oc, "name", it->string); + if (d->head_path) + output_str(oc, "orig_name", d->head_path); + output_strf(oc, "index", "%c", index); + output_strf(oc, "worktree", "%c", worktree); + output_end_current(oc); +} + +void wt_structured_print(struct wt_status *s, enum output_style style) +{ + int i; + struct output_context *oc = output_start(style); + + output_start_array(oc, "entries"); + + for (i = 0; i < s->change.nr; i++) { + struct wt_status_change_data *d; + struct string_list_item *it; + + it = &(s->change.items[i]); + d = it->util; + if (d->stagemask) + wt_structured_unmerged(it, oc); + else + wt_structured_status(it, oc); + } + + for (i = 0; i < s->untracked.nr; i++) { + output_start_object(oc, "entry"); + output_str(oc, "name", s->untracked.items[i].string); + output_str(oc, "index", "?"); + output_str(oc, "worktree", "?"); + output_end_current(oc); + } + + output_end(oc); +} diff --git a/wt-status.h b/wt-status.h index 9120673..d5b1342 100644 --- a/wt-status.h +++ b/wt-status.h @@ -4,6 +4,7 @@ #include <stdio.h> #include "string-list.h" #include "color.h" +#include "output.h" enum color_wt_status { WT_STATUS_HEADER = 0, @@ -61,5 +62,6 @@ void wt_status_collect(struct wt_status *s); void wt_shortstatus_print(struct wt_status *s, int null_termination); void wt_porcelain_print(struct wt_status *s, int null_termination); +void wt_structured_print(struct wt_status *s, enum output_style style); #endif /* STATUS_H */ -- 1.7.0.4 -- 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