git config --get-colorbool
authorJunio C Hamano <gitster@pobox.com>
Thu, 6 Dec 2007 01:26:11 +0000 (17:26 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 6 Dec 2007 01:57:11 +0000 (17:57 -0800)
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 <gitster@pobox.com>
Documentation/git-config.txt
builtin-branch.c
builtin-config.c
color.c
color.h
diff.c
wt-status.c
index 7640450787064aac7211b5a3d5504275b62119ff..98509b4f441abc7671645ece78c9ba83a8dac4c0 100644 (file)
@@ -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
 -----------
@@ -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
index c64768beb2c112fc32a65fb4070f01331ebf1540..089cae59299659b20359b7249e57ddc3a43ded06 100644 (file)
@@ -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.")) {
index 6175dc37382833ed1578f352dbeda004f540be0c..d10b03f50cbcecd10b3a82a3fea53293c3e50806 100644 (file)
@@ -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;
@@ -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;
@@ -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--;
diff --git a/color.c b/color.c
index 97cfbda31ac02b7e4fe747052c28821a34ee0165..7bd424a8f6012859f40f2aa6210e7d4ce7686dc0 100644 (file)
--- a/color.c
+++ b/color.c
@@ -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"))
@@ -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;
diff --git a/color.h b/color.h
index 68098006ed057552370ec27359eb776e139bec5e..ff63513d39b1553e65230ef98583549506670950 100644 (file)
--- a/color.h
+++ b/color.h
@@ -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, ...);
diff --git a/diff.c b/diff.c
index 6b54959610db604bfabc15e6edd2b212f16d0c62..be6cf687a4421acdc127df73aafef4aa9cf4daac 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -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")) {
index d35386dae19287a28ef7086d886bdfb3941d18b1..02dbb751db86b1c10a018cfb234f267e22d73894 100644 (file)
@@ -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.")) {