]> git.ipfire.org Git - thirdparty/git.git/commitdiff
color.c: support bright aixterm colors
authorEyal Soha <shawarmakarma@gmail.com>
Tue, 21 Jan 2020 16:56:22 +0000 (08:56 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 11 Feb 2020 19:17:31 +0000 (11:17 -0800)
These colors are the bright variants of the 3-bit colors.  Instead of
30-37 range for the foreground and 40-47 range for the background,
they live in 90-97 and 100-107 range, respectively.

Signed-off-by: Eyal Soha <shawarmakarma@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
color.c
t/t4026-color.sh

index 83e7bba8729627d3e329f8a1934ecf46fb30ff1f..08b13ba72be53bf36e05f7095964c5206d795945 100644 (file)
@@ -263,7 +263,9 @@ color::
 +
 The basic colors accepted are `normal`, `black`, `red`, `green`, `yellow`,
 `blue`, `magenta`, `cyan` and `white`.  The first color given is the
-foreground; the second is the background.
+foreground; the second is the background.  All the basic colors except
+`normal` have a bright variant that can be speficied by prefixing the
+color with `bright`, like `brightred`.
 +
 Colors may also be given as numbers between 0 and 255; these use ANSI
 256-color mode (but note that not all terminals may support this).  If
diff --git a/color.c b/color.c
index 4ee690bd4e44ffa67212c0bcc9e382da2aae0ee4..0c0ec4672f344694bca3f23552831f27db736daf 100644 (file)
--- a/color.c
+++ b/color.c
@@ -29,6 +29,7 @@ enum {
        COLOR_FOREGROUND_ANSI = 30,
        COLOR_FOREGROUND_RGB = 38,
        COLOR_FOREGROUND_256 = 38,
+       COLOR_FOREGROUND_BRIGHT_ANSI = 90,
 };
 
 /* Ignore the RESET at the end when giving the size */
@@ -68,15 +69,38 @@ static int get_hex_color(const char *in, unsigned char *out)
        return 0;
 }
 
-static int parse_color(struct color *out, const char *name, int len)
+/*
+ * If an ANSI color is recognized in "name", fill "out" and return 0.
+ * Otherwise, leave out unchanged and return -1.
+ */
+static int parse_ansi_color(struct color *out, const char *name, int len)
 {
        /* Positions in array must match ANSI color codes */
        static const char * const color_names[] = {
                "black", "red", "green", "yellow",
                "blue", "magenta", "cyan", "white"
        };
-       char *end;
        int i;
+       int color_offset = COLOR_FOREGROUND_ANSI;
+
+       if (strncasecmp(name, "bright", 6) == 0) {
+               color_offset = COLOR_FOREGROUND_BRIGHT_ANSI;
+               name += 6;
+               len -= 6;
+       }
+       for (i = 0; i < ARRAY_SIZE(color_names); i++) {
+               if (match_word(name, len, color_names[i])) {
+                       out->type = COLOR_ANSI;
+                       out->value = i + color_offset;
+                       return 0;
+               }
+       }
+       return -1;
+}
+
+static int parse_color(struct color *out, const char *name, int len)
+{
+       char *end;
        long val;
 
        /* First try the special word "normal"... */
@@ -96,12 +120,8 @@ static int parse_color(struct color *out, const char *name, int len)
        }
 
        /* Then pick from our human-readable color names... */
-       for (i = 0; i < ARRAY_SIZE(color_names); i++) {
-               if (match_word(name, len, color_names[i])) {
-                       out->type = COLOR_ANSI;
-                       out->value = i + COLOR_FOREGROUND_ANSI;
-                       return 0;
-               }
+       if (parse_ansi_color(out, name, len) == 0) {
+               return 0;
        }
 
        /* And finally try a literal 256-color-mode number */
index 671e951ee5498c7691c5e996c9dfd75dac3e8861..78c69de90a2da5c25590cff08b4bbcfadf0da35c 100755 (executable)
@@ -30,6 +30,14 @@ test_expect_success 'attribute before color name' '
        color "bold red" "[1;31m"
 '
 
+test_expect_success 'aixterm bright fg color' '
+       color "brightred" "[91m"
+'
+
+test_expect_success 'aixterm bright bg color' '
+       color "green brightblue" "[32;104m"
+'
+
 test_expect_success 'color name before attribute' '
        color "red bold" "[1;31m"
 '