Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Documentation/config.txt | 26 ++++++++++++++++++++++++++ Documentation/git-column.txt | 6 +++++- builtin/column.c | 23 +++++++++++++++++++++++ column.c | 36 ++++++++++++++++++++++++++++++++++++ column.h | 4 ++++ 5 files changed, 94 insertions(+), 1 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index abeb82b..5216598 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -821,6 +821,32 @@ color.ui:: `never` if you prefer git commands not to use color unless enabled explicitly with some other configuration or the `--color` option. +column.ui:: + Specify whether supported commands should output in columns. + This variable consists of a list of tokens separated by spaces + or commas: ++ +-- +`always`;; + always show in columns +`never`;; + never show in columns +`auto`;; + show in columns if the output is to the terminal +`column`;; + fill columns before rows (default) +`row`;; + fill rows before columns +`dense`;; + make unequal size columns to utilize more space +`nodense`;; + make equal size columns +`color`;; + input contains ANSI escape sequence for coloring +-- ++ + This option defaults to 'never'. + 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-column.txt b/Documentation/git-column.txt index 508b85f..94fd7ac 100644 --- a/Documentation/git-column.txt +++ b/Documentation/git-column.txt @@ -8,7 +8,7 @@ git-column - Display data in columns SYNOPSIS -------- [verse] -'git column' [--mode=<mode> | --rawmode=<n>] [--width=<width>] +'git column' [--command=<name>] [--[raw]mode=<mode>] [--width=<width>] [--indent=<string>] [--nl=<string>] [--pading=<n>] DESCRIPTION @@ -17,6 +17,10 @@ This command formats its input into multiple columns. OPTIONS ------- +--command=<name>:: + Look up layout mode using configuration variable column.<name> and + column.ui. + --mode=<mode>:: Specify layout mode. See configuration variable column.ui for option syntax. diff --git a/builtin/column.c b/builtin/column.c index c4a0431..c4e1fe4 100644 --- a/builtin/column.c +++ b/builtin/column.c @@ -11,12 +11,19 @@ static const char * const builtin_column_usage[] = { }; static int colopts; +static int column_config(const char *var, const char *value, void *cb) +{ + return git_column_config(var, value, cb, &colopts); +} + int cmd_column(int argc, const char **argv, const char *prefix) { struct string_list list = STRING_LIST_INIT_DUP; struct strbuf sb = STRBUF_INIT; struct column_options copts; + const char *command = NULL, *real_command = NULL; struct option options[] = { + OPT_STRING(0, "command", &real_command, "name", "lookup config vars"), OPT_COLUMN(0, "mode", &colopts, "layout to use"), OPT_INTEGER(0, "rawmode", &colopts, "layout to use"), OPT_INTEGER(0, "width", &copts.width, "Maximum width"), @@ -26,6 +33,17 @@ int cmd_column(int argc, const char **argv, const char *prefix) OPT_END() }; + /* This one is special and must be the first one */ + if (argc > 1 && !prefixcmp(argv[1], "--command=")) { + int nonitok = 0; + setup_git_directory_gently(&nonitok); + + command = argv[1] + 10; + git_config(column_config, (void*)command); + if (!colopts) + colopts = git_colopts; + } + memset(&copts, 0, sizeof(copts)); copts.width = term_columns(); copts.padding = 1; @@ -33,6 +51,11 @@ int cmd_column(int argc, const char **argv, const char *prefix) if (argc) usage_with_options(builtin_column_usage, options); + if (real_command || command) { + if (!real_command || !command || strcmp(real_command, command)) + die(_("--command must be the first argument")); + } + while (!strbuf_getline(&sb, stdin, '\n')) string_list_append(&list, sb.buf); diff --git a/column.c b/column.c index 0f658d9..671ee5d 100644 --- a/column.c +++ b/column.c @@ -2,6 +2,7 @@ #include "column.h" #include "string-list.h" #include "parse-options.h" +#include "color.h" #include "utf8.h" #define MODE(mode) ((mode) & COL_MODE) @@ -22,6 +23,8 @@ struct column_data { int *width; /* index to the longest row in column */ }; +int git_colopts; + /* return length of 's' in letters, ANSI escapes stripped */ static int item_length(int mode, const char *s) { @@ -371,6 +374,39 @@ int git_config_column(int *mode, const char *value, return 0; } +static int column_config(const char *var, const char *value, + const char *key, int *colopts) +{ + if (!strcmp(var, key)) { + int ret = git_config_column(colopts, value, -1); + if (ret) + die("invalid %s mode %s", key, value); + return 0; + } + return 1; /* go on */ +} + +int git_column_config(const char *var, const char *value, + const char *command, int *colopts) +{ + int ret; + + ret = column_config(var, value, "column.ui", &git_colopts); + if (ret <= 0) + return ret; + + if (command) { + struct strbuf sb = STRBUF_INIT; + strbuf_addf(&sb, "column.%s", command); + ret = column_config(var, value, sb.buf, colopts); + strbuf_release(&sb); + if (ret <= 0) + return ret; + } + + return 1; /* go on */ +} + int parseopt_column_callback(const struct option *opt, const char *arg, int unset) { diff --git a/column.h b/column.h index 1912cb0..afdafc4 100644 --- a/column.h +++ b/column.h @@ -17,6 +17,8 @@ struct column_options { const char *nl; }; +extern int git_colopts; + extern int term_columns(void); extern struct string_list_item *add_cell_to_list(struct string_list *list, int mode, @@ -26,6 +28,8 @@ extern void print_cell(struct string_list *list, int mode, const char *string); extern void print_columns(const struct string_list *list, int mode, struct column_options *opts); extern int git_config_column(int *mode, const char *value, int stdout_is_tty); +extern int git_column_config(const char *var, const char *value, + const char *command, int *colopts); struct option; extern int parseopt_column_callback(const struct option *opt, -- 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