Merge branch 'jc/color'

* jc/color:
  git-config --get-color: get configured color
  "color.diff = true" is not "always" anymore.
This commit is contained in:
Junio C Hamano 2007-12-02 22:49:58 -08:00
commit cd390763d4
3 changed files with 87 additions and 16 deletions

View File

@ -20,6 +20,7 @@ SYNOPSIS
'git-config' [<file-option>] --rename-section old_name new_name
'git-config' [<file-option>] --remove-section name
'git-config' [<file-option>] [-z|--null] -l | --list
'git-config' [<file-option>] --get-color name [default]
DESCRIPTION
-----------
@ -134,6 +135,12 @@ See also <<FILES>>.
output without getting confused e.g. by values that
contain line breaks.
--get-color name default::
Find the color configured for `name` (e.g. `color.diff.new`) and
output it as the ANSI color escape sequence to the standard
output. The optional `default` parameter is used instead, if
there is no color configured for `name`.
[[FILES]]
FILES
@ -292,6 +299,15 @@ To add a new proxy, without altering any of the existing ones, use
% git config core.gitproxy '"proxy-command" for example.com'
------------
An example to use customized color from the configuration in your
script:
------------
#!/bin/sh
WS=$(git config --get-color color.diff.whitespace "blue reverse")
RESET=$(git config --get-color "" "reset")
echo "${WS}your whitespace color or blue reverse${RESET}"
------------
include::config.txt[]

View File

@ -1,8 +1,9 @@
#include "builtin.h"
#include "cache.h"
#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";
"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]";
static char *key;
static regex_t *key_regexp;
@ -161,6 +162,53 @@ char *normalize_value(const char *key, const char *value)
return normalized;
}
static int get_color_found;
static const char *get_color_slot;
static char parsed_color[COLOR_MAXLEN];
static int git_get_color_config(const char *var, const char *value)
{
if (!strcmp(var, get_color_slot)) {
color_parse(value, var, parsed_color);
get_color_found = 1;
}
return 0;
}
static int get_color(int argc, const char **argv)
{
/*
* grab the color setting for the given slot from the configuration,
* or parse the default value if missing, and return ANSI color
* escape sequence.
*
* e.g.
* git config --get-color color.diff.whitespace "blue reverse"
*/
const char *def_color = NULL;
switch (argc) {
default:
usage(git_config_set_usage);
case 2:
def_color = argv[1];
/* fallthru */
case 1:
get_color_slot = argv[0];
break;
}
get_color_found = 0;
parsed_color[0] = '\0';
git_config(git_get_color_config);
if (!get_color_found && def_color)
color_parse(def_color, "command line", parsed_color);
fputs(parsed_color, stdout);
return 0;
}
int cmd_config(int argc, const char **argv, const char *prefix)
{
int nongit = 0;
@ -234,8 +282,9 @@ int cmd_config(int argc, const char **argv, const char *prefix)
return 1;
}
return 0;
}
else
} else if (!strcmp(argv[1], "--get-color")) {
return get_color(argc-2, argv+2);
} else
break;
argc--;
argv++;

32
color.c
View File

@ -118,21 +118,27 @@ bad:
int git_config_colorbool(const char *var, const char *value)
{
if (!value)
return 1;
if (!strcasecmp(value, "auto")) {
if (isatty(1) || (pager_in_use && pager_use_color)) {
char *term = getenv("TERM");
if (term && strcmp(term, "dumb"))
return 1;
}
return 0;
if (value) {
if (!strcasecmp(value, "never"))
return 0;
if (!strcasecmp(value, "always"))
return 1;
if (!strcasecmp(value, "auto"))
goto auto_color;
}
if (!strcasecmp(value, "never"))
/* Missing or explicit false to turn off colorization */
if (!git_config_bool(var, value))
return 0;
if (!strcasecmp(value, "always"))
return 1;
return git_config_bool(var, value);
/* any normal truth value defaults to 'auto' */
auto_color:
if (isatty(1) || (pager_in_use && pager_use_color)) {
char *term = getenv("TERM");
if (term && strcmp(term, "dumb"))
return 1;
}
return 0;
}
static int color_vfprintf(FILE *fp, const char *color, const char *fmt,