Skip to content

Commit

Permalink
git config --get-colorbool
Browse files Browse the repository at this point in the history
This adds an option to help scripts find out color settings from
the configuration file.

    git config --get-colorbool color.diff

inspects color.diff variable, and exits with status 0 (i.e. success) if
color is to be used.  It exits with status 1 otherwise.

If a script wants "true"/"false" answer to the standard output of the
command, it can pass an additional boolean parameter to its command
line, telling if its standard output is a terminal, like this:

    git config --get-colorbool color.diff true

When called like this, the command outputs "true" to its standard output
if color is to be used (i.e. "color.diff" says "always", "auto", or
"true"), and "false" otherwise.

Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
gitster committed Dec 6, 2007
1 parent cec99d8 commit 0f6f5a4
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 7 deletions.
10 changes: 10 additions & 0 deletions Documentation/git-config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ SYNOPSIS
'git-config' [<file-option>] --remove-section name
'git-config' [<file-option>] [-z|--null] -l | --list
'git-config' [<file-option>] --get-color name [default]
'git-config' [<file-option>] --get-colorbool name [stdout-is-tty]

DESCRIPTION
-----------
Expand Down Expand Up @@ -135,6 +136,15 @@ See also <<FILES>>.
output without getting confused e.g. by values that
contain line breaks.

--get-colorbool name [stdout-is-tty]::

Find the color setting for `name` (e.g. `color.diff`) and output
"true" or "false". `stdout-is-tty` should be either "true" or
"false", and is taken into account when configuration says
"auto". If `stdout-is-tty` is missing, then checks the standard
output of the command itself, and exits with status 0 if color
is to be used, or exits with status 1 otherwise.

--get-color name default::

Find the color configured for `name` (e.g. `color.diff.new`) and
Expand Down
2 changes: 1 addition & 1 deletion builtin-branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ static int parse_branch_color_slot(const char *var, int ofs)
static int git_branch_config(const char *var, const char *value)
{
if (!strcmp(var, "color.branch")) {
branch_use_color = git_config_colorbool(var, value);
branch_use_color = git_config_colorbool(var, value, -1);
return 0;
}
if (!prefixcmp(var, "color.branch.")) {
Expand Down
41 changes: 40 additions & 1 deletion builtin-config.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include "color.h"

static const char git_config_set_usage[] =
"git-config [ --global | --system | [ -f | --file ] config-file ] [ --bool | --int ] [ -z | --null ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --remove-section name | --list | --get-color var [default]";
"git-config [ --global | --system | [ -f | --file ] config-file ] [ --bool | --int ] [ -z | --null ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --remove-section name | --list | --get-color var [default] | --get-colorbool name [stdout-is-tty]";

static char *key;
static regex_t *key_regexp;
Expand Down Expand Up @@ -208,6 +208,43 @@ static int get_color(int argc, const char **argv)
return 0;
}

static int stdout_is_tty;
static int get_colorbool_found;
static int git_get_colorbool_config(const char *var, const char *value)
{
if (!strcmp(var, get_color_slot))
get_colorbool_found =
git_config_colorbool(var, value, stdout_is_tty);
return 0;
}

static int get_colorbool(int argc, const char **argv)
{
/*
* git config --get-colorbool <slot> [<stdout-is-tty>]
*
* returns "true" or "false" depending on how <slot>
* is configured.
*/

if (argc == 2)
stdout_is_tty = git_config_bool("command line", argv[1]);
else if (argc == 1)
stdout_is_tty = isatty(1);
else
usage(git_config_set_usage);
get_colorbool_found = 0;
get_color_slot = argv[0];
git_config(git_get_colorbool_config);

if (argc == 1) {
return get_colorbool_found ? 0 : 1;
} else {
printf("%s\n", get_colorbool_found ? "true" : "false");
return 0;
}
}

int cmd_config(int argc, const char **argv, const char *prefix)
{
int nongit = 0;
Expand Down Expand Up @@ -283,6 +320,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
return 0;
} else if (!strcmp(argv[1], "--get-color")) {
return get_color(argc-2, argv+2);
} else if (!strcmp(argv[1], "--get-colorbool")) {
return get_colorbool(argc-2, argv+2);
} else
break;
argc--;
Expand Down
6 changes: 4 additions & 2 deletions color.c
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ void color_parse(const char *value, const char *var, char *dst)
die("bad config value '%s' for variable '%s'", value, var);
}

int git_config_colorbool(const char *var, const char *value)
int git_config_colorbool(const char *var, const char *value, int stdout_is_tty)
{
if (value) {
if (!strcasecmp(value, "never"))
Expand All @@ -133,7 +133,9 @@ int git_config_colorbool(const char *var, const char *value)

/* any normal truth value defaults to 'auto' */
auto_color:
if (isatty(1) || (pager_in_use && pager_use_color)) {
if (stdout_is_tty < 0)
stdout_is_tty = isatty(1);
if (stdout_is_tty || (pager_in_use && pager_use_color)) {
char *term = getenv("TERM");
if (term && strcmp(term, "dumb"))
return 1;
Expand Down
2 changes: 1 addition & 1 deletion color.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
/* "\033[1;38;5;2xx;48;5;2xxm\0" is 23 bytes */
#define COLOR_MAXLEN 24

int git_config_colorbool(const char *var, const char *value);
int git_config_colorbool(const char *var, const char *value, int stdout_is_tty);
void color_parse(const char *var, const char *value, char *dst);
int color_fprintf(FILE *fp, const char *color, const char *fmt, ...);
int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...);
Expand Down
2 changes: 1 addition & 1 deletion diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ int git_diff_ui_config(const char *var, const char *value)
return 0;
}
if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) {
diff_use_color_default = git_config_colorbool(var, value);
diff_use_color_default = git_config_colorbool(var, value, -1);
return 0;
}
if (!strcmp(var, "diff.renames")) {
Expand Down
2 changes: 1 addition & 1 deletion wt-status.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ void wt_status_print(struct wt_status *s)
int git_status_config(const char *k, const char *v)
{
if (!strcmp(k, "status.color") || !strcmp(k, "color.status")) {
wt_status_use_color = git_config_colorbool(k, v);
wt_status_use_color = git_config_colorbool(k, v, -1);
return 0;
}
if (!prefixcmp(k, "status.color.") || !prefixcmp(k, "color.status.")) {
Expand Down

0 comments on commit 0f6f5a4

Please sign in to comment.