From patchwork Tue Feb 11 19:36:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Junio C Hamano X-Patchwork-Id: 11376811 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3D85A1580 for ; Tue, 11 Feb 2020 19:36:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 17824246AB for ; Tue, 11 Feb 2020 19:36:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=pobox.com header.i=@pobox.com header.b="uD83Slkh" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730964AbgBKTgh (ORCPT ); Tue, 11 Feb 2020 14:36:37 -0500 Received: from pb-smtp20.pobox.com ([173.228.157.52]:52973 "EHLO pb-smtp20.pobox.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728849AbgBKTgh (ORCPT ); Tue, 11 Feb 2020 14:36:37 -0500 Received: from pb-smtp20.pobox.com (unknown [127.0.0.1]) by pb-smtp20.pobox.com (Postfix) with ESMTP id 57FA89986E; Tue, 11 Feb 2020 14:36:32 -0500 (EST) (envelope-from gitster@pobox.com) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=pobox.com; h=from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; s=sasl; bh=g3KKKYINOzlCKk6OOgznzmYDO Ak=; b=uD83Slkh3PchzXA03vYF7AG/dPLFbnhHY6xWimvSZB0aEbhLUvk+Z9YAa qT9CJdkdRrfb2pGizuV7MyachdBMrb2jQFNtnv8OgQKNLqY9S38NTVTQI7dDiLHY b1VHgl80ROk1sysoY6CqE1X1N7xqM2PRIYUDZ5S7JhaBTg7bfg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=pobox.com; h=from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; q=dns; s=sasl; b=nIoJlZUV7S+ZchKXMkA q+Z16M0sgZapJYVuih9H0arb3NPBthoyI9BKFAFYwZ0Nfw3JQXJpXjHSMHjdDfPn Fmm0PBlM6UlhH0cG3JUPfDryifGzkHfOlclilzlgt2xDQG6qfCFA3aSkkRbmtmzT miHNUSjvEqTfwsMj/Je/sdNw= Received: from pb-smtp20.sea.icgroup.com (unknown [127.0.0.1]) by pb-smtp20.pobox.com (Postfix) with ESMTP id 4FFCC9986D; Tue, 11 Feb 2020 14:36:32 -0500 (EST) (envelope-from gitster@pobox.com) Received: from pobox.com (unknown [34.76.80.147]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by pb-smtp20.pobox.com (Postfix) with ESMTPSA id 7E1079986B; Tue, 11 Feb 2020 14:36:29 -0500 (EST) (envelope-from gitster@pobox.com) From: Junio C Hamano To: git@vger.kernel.org Cc: Eyal Soha , Jeff King Subject: [PATCH v3 1/3] color.c: refactor color_output arguments Date: Tue, 11 Feb 2020 11:36:23 -0800 Message-Id: <20200211193625.231492-2-gitster@pobox.com> X-Mailer: git-send-email 2.25.0-453-g769eb9f0f1 In-Reply-To: <20200211193625.231492-1-gitster@pobox.com> References: <20200121165623.151880-1-shawarmakarma@gmail.com> <20200211193625.231492-1-gitster@pobox.com> MIME-Version: 1.0 X-Pobox-Relay-ID: CCDADF8A-4D05-11EA-8722-B0405B776F7B-77302942!pb-smtp20.pobox.com Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Eyal Soha color_output() takes a "type" parameter, which is either '3' or '4', and that byte is shown in front of '0'-'7' to form "30"-"37" or "40"-"47" in ANSI output mode for fore-ground and back-ground colors. Clarify the purpose of the parameter by renaming it to the "background" that is a boolean. Also, change the .value field in the color struct from storing 0-7 for basic 8 colors to storing 30-37 for ANSI colors. This aligns the code to show ANSI colors to the code for the 256 color scheme, which already uses the actual value to be sent to the terminal. Signed-off-by: Eyal Soha Signed-off-by: Junio C Hamano --- color.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/color.c b/color.c index ebb222ec33..4ee690bd4e 100644 --- a/color.c +++ b/color.c @@ -24,6 +24,13 @@ const char *column_colors_ansi[] = { GIT_COLOR_RESET, }; +enum { + COLOR_BACKGROUND_OFFSET = 10, + COLOR_FOREGROUND_ANSI = 30, + COLOR_FOREGROUND_RGB = 38, + COLOR_FOREGROUND_256 = 38, +}; + /* Ignore the RESET at the end when giving the size */ const int column_colors_ansi_max = ARRAY_SIZE(column_colors_ansi) - 1; @@ -92,7 +99,7 @@ static int parse_color(struct color *out, const char *name, int len) for (i = 0; i < ARRAY_SIZE(color_names); i++) { if (match_word(name, len, color_names[i])) { out->type = COLOR_ANSI; - out->value = i; + out->value = i + COLOR_FOREGROUND_ANSI; return 0; } } @@ -112,7 +119,7 @@ static int parse_color(struct color *out, const char *name, int len) /* Rewrite low numbers as more-portable standard colors. */ } else if (val < 8) { out->type = COLOR_ANSI; - out->value = val; + out->value = val + COLOR_FOREGROUND_ANSI; return 0; } else if (val < 256) { out->type = COLOR_256; @@ -166,23 +173,26 @@ int color_parse(const char *value, char *dst) * already have the ANSI escape code in it. "out" should have enough * space in it to fit any color. */ -static char *color_output(char *out, int len, const struct color *c, char type) +static char *color_output(char *out, int len, const struct color *c, int background) { + int offset = 0; + + if (background) + offset = COLOR_BACKGROUND_OFFSET; switch (c->type) { case COLOR_UNSPECIFIED: case COLOR_NORMAL: break; case COLOR_ANSI: - if (len < 2) - BUG("color parsing ran out of space"); - *out++ = type; - *out++ = '0' + c->value; + out += xsnprintf(out, len, "%d", c->value + offset); break; case COLOR_256: - out += xsnprintf(out, len, "%c8;5;%d", type, c->value); + out += xsnprintf(out, len, "%d;5;%d", COLOR_FOREGROUND_256 + offset, + c->value); break; case COLOR_RGB: - out += xsnprintf(out, len, "%c8;2;%d;%d;%d", type, + out += xsnprintf(out, len, "%d;2;%d;%d;%d", + COLOR_FOREGROUND_RGB + offset, c->red, c->green, c->blue); break; } @@ -279,14 +289,12 @@ int color_parse_mem(const char *value, int value_len, char *dst) if (!color_empty(&fg)) { if (sep++) OUT(';'); - /* foreground colors are all in the 3x range */ - dst = color_output(dst, end - dst, &fg, '3'); + dst = color_output(dst, end - dst, &fg, 0); } if (!color_empty(&bg)) { if (sep++) OUT(';'); - /* background colors are all in the 4x range */ - dst = color_output(dst, end - dst, &bg, '4'); + dst = color_output(dst, end - dst, &bg, 1); } OUT('m'); } From patchwork Tue Feb 11 19:36:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Junio C Hamano X-Patchwork-Id: 11376807 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9604D924 for ; Tue, 11 Feb 2020 19:36:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 72293246A6 for ; Tue, 11 Feb 2020 19:36:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=pobox.com header.i=@pobox.com header.b="hTg/jWi0" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730963AbgBKTgg (ORCPT ); Tue, 11 Feb 2020 14:36:36 -0500 Received: from pb-smtp1.pobox.com ([64.147.108.70]:54630 "EHLO pb-smtp1.pobox.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730003AbgBKTgg (ORCPT ); Tue, 11 Feb 2020 14:36:36 -0500 Received: from pb-smtp1.pobox.com (unknown [127.0.0.1]) by pb-smtp1.pobox.com (Postfix) with ESMTP id 6A4124CE21; Tue, 11 Feb 2020 14:36:34 -0500 (EST) (envelope-from gitster@pobox.com) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=pobox.com; h=from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; s=sasl; bh=s/MJERWtabyYG+dBDj5O3KZdF Xw=; b=hTg/jWi0ZXGBg3Je2uY96S/O3mt7M+7IY//AVSAMnl7TnXAuC0y2qnbRX rjqTnnJeGrsjXEYitiEqDQrztqdg8rs7rweY664dtMgwIsrm2m5GuyZCuDsIgUbn aiShVecZjIo24cq0lthsWOGEyXJ+PNfbfT55Nb+QCyB97gyKRE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=pobox.com; h=from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; q=dns; s=sasl; b=ogQAdx1o+QH7JEm7DMf At3K65SrN01WBciDM25sbCTdCkBDXD+WgjV0M6HAdjB9apyNthN+jd6yEAYCc9EG SWRsDa10A8kDvDTntdZNBSHg+6A5/9PX7Sl8R4FvgkccG88ob1rlMkdLWp3pjHU+ 0QcscGCMuchu2QWhhiGQa94o= Received: from pb-smtp1.nyi.icgroup.com (unknown [127.0.0.1]) by pb-smtp1.pobox.com (Postfix) with ESMTP id 626C54CE20; Tue, 11 Feb 2020 14:36:34 -0500 (EST) (envelope-from gitster@pobox.com) Received: from pobox.com (unknown [34.76.80.147]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by pb-smtp1.pobox.com (Postfix) with ESMTPSA id 9EEF24CE1E; Tue, 11 Feb 2020 14:36:32 -0500 (EST) (envelope-from gitster@pobox.com) From: Junio C Hamano To: git@vger.kernel.org Cc: Eyal Soha , Jeff King Subject: [PATCH v3 2/3] color.c: support bright aixterm colors Date: Tue, 11 Feb 2020 11:36:24 -0800 Message-Id: <20200211193625.231492-3-gitster@pobox.com> X-Mailer: git-send-email 2.25.0-453-g769eb9f0f1 In-Reply-To: <20200211193625.231492-1-gitster@pobox.com> References: <20200121165623.151880-1-shawarmakarma@gmail.com> <20200211193625.231492-1-gitster@pobox.com> MIME-Version: 1.0 X-Pobox-Relay-ID: CEB9D4B4-4D05-11EA-B913-C28CBED8090B-77302942!pb-smtp1.pobox.com Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Eyal Soha 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 Signed-off-by: Junio C Hamano --- Documentation/config.txt | 4 +++- color.c | 36 ++++++++++++++++++++++++++++-------- t/t4026-color.sh | 8 ++++++++ 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 83e7bba872..08b13ba72b 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -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 4ee690bd4e..0c0ec4672f 100644 --- 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 */ diff --git a/t/t4026-color.sh b/t/t4026-color.sh index 671e951ee5..78c69de90a 100755 --- a/t/t4026-color.sh +++ b/t/t4026-color.sh @@ -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" ' From patchwork Tue Feb 11 19:36:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Junio C Hamano X-Patchwork-Id: 11376809 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C066D92A for ; Tue, 11 Feb 2020 19:36:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9DA83246A0 for ; Tue, 11 Feb 2020 19:36:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=pobox.com header.i=@pobox.com header.b="bHIDUfR2" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730968AbgBKTgi (ORCPT ); Tue, 11 Feb 2020 14:36:38 -0500 Received: from pb-smtp2.pobox.com ([64.147.108.71]:52590 "EHLO pb-smtp2.pobox.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730960AbgBKTgh (ORCPT ); Tue, 11 Feb 2020 14:36:37 -0500 Received: from pb-smtp2.pobox.com (unknown [127.0.0.1]) by pb-smtp2.pobox.com (Postfix) with ESMTP id 190B443A5A; Tue, 11 Feb 2020 14:36:36 -0500 (EST) (envelope-from gitster@pobox.com) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=pobox.com; h=from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; s=sasl; bh=P8bfxmlvXDpJ+Lj7jl1I5VlIK WM=; b=bHIDUfR2aoIvZvHVEtuoH1MxqKiaIM7eSDllFpp8FG/9I4DLCGOAblxdC k7E8aiN0XFiFKOw83w+6te/1k2R1Kz7X/xhjiQ+DNKvv6YSe3YYmPdPOfMtIBHo+ 0sqRcp76F78bsJ510obTRQxp41Kq7hO9h/oCH2SmT80/xBoyMw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=pobox.com; h=from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; q=dns; s=sasl; b=HrcJc1Md7ds4ts1iUuH TIEK5U+HRU/M88B2xEjvzEe+o338fZosxu8aFHfi3LLfeuijf/hActPOijY2q9Wq mjFOPPQs7RtDPKuiEaVMjoQYHTyuJndc11LzpH23FnV8obPC7ceFpiGvknv0U//t f79rx43g8CNS1VH2DnEIVBhw= Received: from pb-smtp2.nyi.icgroup.com (unknown [127.0.0.1]) by pb-smtp2.pobox.com (Postfix) with ESMTP id 065CB43A59; Tue, 11 Feb 2020 14:36:36 -0500 (EST) (envelope-from gitster@pobox.com) Received: from pobox.com (unknown [34.76.80.147]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by pb-smtp2.pobox.com (Postfix) with ESMTPSA id 6BD5C43A58; Tue, 11 Feb 2020 14:36:35 -0500 (EST) (envelope-from gitster@pobox.com) From: Junio C Hamano To: git@vger.kernel.org Cc: Eyal Soha , Jeff King Subject: [PATCH v3 3/3] color.c: alias RGB colors 8-15 to aixterm colors Date: Tue, 11 Feb 2020 11:36:25 -0800 Message-Id: <20200211193625.231492-4-gitster@pobox.com> X-Mailer: git-send-email 2.25.0-453-g769eb9f0f1 In-Reply-To: <20200211193625.231492-1-gitster@pobox.com> References: <20200121165623.151880-1-shawarmakarma@gmail.com> <20200211193625.231492-1-gitster@pobox.com> MIME-Version: 1.0 X-Pobox-Relay-ID: D0635D4E-4D05-11EA-9916-D1361DBA3BAF-77302942!pb-smtp2.pobox.com Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Eyal Soha This results in shorter output, and is _probably_ more portable. There is at least one environment (GitHub Actions) which supports 16-color mode but not 256-color mode. It's possible there are environments which go the other way, but it seems unlikely. Signed-off-by: Eyal Soha Signed-off-by: Junio C Hamano --- color.c | 7 ++++++- t/t4026-color.sh | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/color.c b/color.c index 0c0ec4672f..64f52a4f93 100644 --- a/color.c +++ b/color.c @@ -136,11 +136,16 @@ static int parse_color(struct color *out, const char *name, int len) else if (val < 0) { out->type = COLOR_NORMAL; return 0; - /* Rewrite low numbers as more-portable standard colors. */ + /* Rewrite 0-7 as more-portable standard colors. */ } else if (val < 8) { out->type = COLOR_ANSI; out->value = val + COLOR_FOREGROUND_ANSI; return 0; + /* Rewrite 8-15 as more-portable aixterm colors. */ + } else if (val < 16) { + out->type = COLOR_ANSI; + out->value = val - 8 + COLOR_FOREGROUND_BRIGHT_ANSI; + return 0; } else if (val < 256) { out->type = COLOR_256; out->value = val; diff --git a/t/t4026-color.sh b/t/t4026-color.sh index 78c69de90a..c0b642c1ab 100755 --- a/t/t4026-color.sh +++ b/t/t4026-color.sh @@ -82,6 +82,10 @@ test_expect_success '0-7 are aliases for basic ANSI color names' ' color "0 7" "[30;47m" ' +test_expect_success '8-15 are aliases for aixterm color names' ' + color "12 13" "[94;105m" +' + test_expect_success '256 colors' ' color "254 bold 255" "[1;38;5;254;48;5;255m" '