Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Documentation/config.txt | 4 ++++ Documentation/git-status.txt | 7 +++++++ Makefile | 2 +- builtin/commit.c | 13 +++++++++++-- wt-status.c | 38 ++++++++++++++++++++++++++++++++------ wt-status.h | 2 +- 6 files changed, 56 insertions(+), 10 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index c14db27..ebb210c 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -851,6 +851,10 @@ column.branch:: Specify whether to output branch listing in `git branch` in columns. See `column.ui` for details. +column.status:: + Specify whether to output untracked files in `git status` in columns. + See `column.ui` for details. + commit.status:: A boolean to enable/disable inclusion of status information in the commit message template when using an editor to prepare the commit diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt index 3d51717..2f87207 100644 --- a/Documentation/git-status.txt +++ b/Documentation/git-status.txt @@ -77,6 +77,13 @@ configuration variable documented in linkgit:git-config[1]. Terminate entries with NUL, instead of LF. This implies the `--porcelain` output format if no other format is given. +--column[=<options>]:: +--no-column:: + Display untracked files in columns. See configuration variable + column.status for option syntax.`--column` and `--no-column` + without options are equivalent to 'always' and 'never' + respectively. + OUTPUT ------ diff --git a/Makefile b/Makefile index 061f6e5..b2644bc 100644 --- a/Makefile +++ b/Makefile @@ -2116,7 +2116,7 @@ builtin/prune.o builtin/reflog.o reachable.o: reachable.h builtin/commit.o builtin/revert.o wt-status.o: wt-status.h builtin/tar-tree.o archive-tar.o: tar.h connect.o transport.o url.o http-backend.o: url.h -builtin/branch.o column.o help.o pager.o: column.h +builtin/branch.o builtin/commit.o column.o help.o pager.o: column.h http-fetch.o http-walker.o remote-curl.o transport.o walker.o: walker.h http.o http-walker.o http-push.o http-fetch.o remote-curl.o: http.h url.h diff --git a/builtin/commit.c b/builtin/commit.c index eba1377..8ce6a18 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -27,6 +27,7 @@ #include "quote.h" #include "submodule.h" #include "gpg-interface.h" +#include "column.h" static const char * const builtin_commit_usage[] = { "git commit [options] [--] <filepattern>...", @@ -88,6 +89,7 @@ static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship; static int no_post_rewrite, allow_empty_message; static char *untracked_files_arg, *force_date, *ignore_submodule_arg; static char *sign_commit; +static int colopts; /* * The default commit message cleanup mode will remove the lines @@ -519,7 +521,7 @@ static int run_status(FILE *fp, const char *index_file, const char *prefix, int wt_porcelain_print(s, null_termination); break; case STATUS_FORMAT_LONG: - wt_status_print(s); + wt_status_print(s, 0); break; } @@ -1138,7 +1140,11 @@ static int parse_status_slot(const char *var, int offset) static int git_status_config(const char *k, const char *v, void *cb) { struct wt_status *s = cb; + int status; + status = git_column_config(k, v, "status", &colopts); + if (status <= 0) + return status; if (!strcmp(k, "status.submodulesummary")) { int is_bool; s->submodule_summary = git_config_bool_or_int(k, v, &is_bool); @@ -1204,6 +1210,7 @@ int cmd_status(int argc, const char **argv, const char *prefix) { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when", "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, + OPT_COLUMN(0, "column", &colopts, "list untracked files in columns" ), OPT_END(), }; @@ -1213,6 +1220,8 @@ int cmd_status(int argc, const char **argv, const char *prefix) wt_status_prepare(&s); gitmodules_config(); git_config(git_status_config, &s); + if (!colopts) + colopts = git_colopts | COL_ANSI; determine_whence(&s); argc = parse_options(argc, argv, prefix, builtin_status_options, @@ -1251,7 +1260,7 @@ int cmd_status(int argc, const char **argv, const char *prefix) case STATUS_FORMAT_LONG: s.verbose = verbose; s.ignore_submodule_arg = ignore_submodule_arg; - wt_status_print(&s); + wt_status_print(&s, colopts); break; } return 0; diff --git a/wt-status.c b/wt-status.c index 9ffc535..86291e9 100644 --- a/wt-status.c +++ b/wt-status.c @@ -11,6 +11,7 @@ #include "remote.h" #include "refs.h" #include "submodule.h" +#include "column.h" static char default_wt_status_colors[][COLOR_MAXLEN] = { GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */ @@ -637,10 +638,13 @@ static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitt static void wt_status_print_other(struct wt_status *s, struct string_list *l, const char *what, - const char *how) + const char *how, + int colopts) { int i; struct strbuf buf = STRBUF_INIT; + static struct string_list output = STRING_LIST_INIT_DUP; + struct column_options copts; if (!l->nr) return; @@ -649,12 +653,32 @@ static void wt_status_print_other(struct wt_status *s, for (i = 0; i < l->nr; i++) { struct string_list_item *it; + const char *path; it = &(l->items[i]); + path = quote_path(it->string, strlen(it->string), + &buf, s->prefix); + if (colopts & COL_ENABLED) { + add_cell_to_list(&output, colopts, path); + continue; + } status_printf(s, color(WT_STATUS_HEADER, s), "\t"); status_printf_more(s, color(WT_STATUS_UNTRACKED, s), - "%s\n", quote_path(it->string, strlen(it->string), - &buf, s->prefix)); + "%s\n", path); } + + strbuf_release(&buf); + if ((colopts & COL_ENABLED) == 0) + return; + + strbuf_addf(&buf, "%s#\t%s", + color(WT_STATUS_HEADER,s), + color(WT_STATUS_UNTRACKED, s)); + memset(&copts, 0, sizeof(copts)); + copts.padding = 1; + copts.indent = buf.buf; + copts.nl = GIT_COLOR_RESET "\n"; + print_columns(&output, colopts, &copts); + string_list_clear(&output, 0); strbuf_release(&buf); } @@ -704,7 +728,7 @@ static void wt_status_print_tracking(struct wt_status *s) color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s), "#"); } -void wt_status_print(struct wt_status *s) +void wt_status_print(struct wt_status *s, int colopts) { const char *branch_color = color(WT_STATUS_ONBRANCH, s); const char *branch_status_color = color(WT_STATUS_HEADER, s); @@ -742,9 +766,11 @@ void wt_status_print(struct wt_status *s) wt_status_print_submodule_summary(s, 1); /* unstaged */ } if (s->show_untracked_files) { - wt_status_print_other(s, &s->untracked, _("Untracked"), "add"); + wt_status_print_other(s, &s->untracked, + _("Untracked"), "add", colopts); if (s->show_ignored_files) - wt_status_print_other(s, &s->ignored, _("Ignored"), "add -f"); + wt_status_print_other(s, &s->ignored, + _("Ignored"), "add -f", colopts); } else if (s->commitable) status_printf_ln(s, GIT_COLOR_NORMAL, _("Untracked files not listed%s"), advice_status_hints diff --git a/wt-status.h b/wt-status.h index 682b4c8..4ab2799 100644 --- a/wt-status.h +++ b/wt-status.h @@ -69,7 +69,7 @@ struct wt_status { }; void wt_status_prepare(struct wt_status *s); -void wt_status_print(struct wt_status *s); +void wt_status_print(struct wt_status *s, int colopts); void wt_status_collect(struct wt_status *s); void wt_shortstatus_print(struct wt_status *s, int null_termination, int show_branch); -- 1.7.8.36.g69ee2 -- 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