Browse Source

git-config --get-color: get configured color

This new option allows scripts to grab color setting from the user
configuration, translated to ANSI color escape sequence.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 17 years ago
parent
commit
9ce0352258
  1. 16
      Documentation/git-config.txt
  2. 55
      builtin-config.c

16
Documentation/git-config.txt

@ -20,6 +20,7 @@ SYNOPSIS @@ -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>>. @@ -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 @@ -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[]


55
builtin-config.c

@ -1,8 +1,9 @@ @@ -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) @@ -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) @@ -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++;

Loading…
Cancel
Save