All output from ls-tree now goes through the output library - even the regular output. Signed-off-by: Julian Phillips <julian@xxxxxxxxxxxxxxxxx> --- builtin/ls-tree.c | 51 +++++++++++++++++++++++++++++++++------------------ 1 files changed, 33 insertions(+), 18 deletions(-) diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c index dc86b0d..7e19d19 100644 --- a/builtin/ls-tree.c +++ b/builtin/ls-tree.c @@ -10,8 +10,8 @@ #include "quote.h" #include "builtin.h" #include "parse-options.h" +#include "output.h" -static int line_termination = '\n'; #define LS_RECURSIVE 1 #define LS_TREE_ONLY 2 #define LS_SHOW_TREES 4 @@ -22,6 +22,7 @@ static int ls_options; static const char **pathspec; static int chomp_prefix; static const char *ls_tree_prefix; +static struct output_context *oc; static const char * const ls_tree_usage[] = { "git ls-tree [<options>] <tree-ish> [path...]", @@ -90,27 +91,32 @@ static int show_tree(const unsigned char *sha1, const char *base, int baselen, (baselen < chomp_prefix || memcmp(ls_tree_prefix, base, chomp_prefix))) return 0; + output_start_object(oc, "entry"); if (!(ls_options & LS_NAME_ONLY)) { + output_strf(oc, "mode", "%06o", mode); + output_token(oc, " "); + output_str(oc, "type", type); + output_token(oc, " "); + output_str(oc, "hash", find_unique_abbrev(sha1, abbrev)); if (ls_options & LS_SHOW_SIZE) { - char size_text[24]; - if (!strcmp(type, blob_type)) { + if (strcmp(type, blob_type)) { + output_token(oc, " -"); + } else { unsigned long size; + output_token(oc, " "); + output_next_directive(oc, "7"); if (sha1_object_info(sha1, &size) == OBJ_BAD) - strcpy(size_text, "BAD"); + output_str(oc, "size", "BAD"); else - snprintf(size_text, sizeof(size_text), - "%lu", size); - } else - strcpy(size_text, "-"); - printf("%06o %s %s %7s\t", mode, type, - find_unique_abbrev(sha1, abbrev), - size_text); - } else - printf("%06o %s %s\t", mode, type, - find_unique_abbrev(sha1, abbrev)); + output_uint(oc, "size", size); + } + } + output_token(oc, "\t"); } - write_name_quotedpfx(base + chomp_prefix, baselen - chomp_prefix, - pathname, stdout, line_termination); + output_strf(oc, "path", "%.*s%s", baselen - chomp_prefix, + base + chomp_prefix, pathname); + output_newline(oc); + output_end_current(oc); return retval; } @@ -119,6 +125,8 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix) unsigned char sha1[20]; struct tree *tree; int full_tree = 0; + char *structured_output_arg = NULL; + enum output_style output_style; const struct option ls_tree_options[] = { OPT_BIT('d', NULL, &ls_options, "only show trees", LS_TREE_ONLY), @@ -126,8 +134,6 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix) LS_RECURSIVE), OPT_BIT('t', NULL, &ls_options, "show trees when recursing", LS_SHOW_TREES), - OPT_SET_INT('z', NULL, &line_termination, - "terminate entries with NUL byte", 0), OPT_BIT('l', "long", &ls_options, "include object size", LS_SHOW_SIZE), OPT_BIT(0, "name-only", &ls_options, "list only filenames", @@ -140,6 +146,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix) "list entire tree; not just current directory " "(implies --full-name)"), OPT__ABBREV(&abbrev), + OPT_OUTPUT('z', "output", &structured_output_arg), OPT_END() }; @@ -159,6 +166,8 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix) ((LS_TREE_ONLY|LS_RECURSIVE) & ls_options)) ls_options |= LS_SHOW_TREES; + output_style = handle_output_arg(structured_output_arg); + if (argc < 1) usage_with_options(ls_tree_usage, ls_tree_options); if (get_sha1(argv[0], sha1)) @@ -168,7 +177,13 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix) tree = parse_tree_indirect(sha1); if (!tree) die("not a tree object"); + + oc = output_start(output_style); + output_start_array(oc, "entries"); + read_tree_recursive(tree, "", 0, 0, pathspec, show_tree, NULL); + output_end(oc); + return 0; } -- 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