chainlint: sidestep impoverished macOS "terminfo"

Although the macOS Terminal.app is "xterm"-compatible, its corresponding
"terminfo" entries -- such as "xterm", "xterm-256color", and
"xterm-new"[1] -- neglect to mention capabilities which Terminal.app
actually supports (such as "dim text"). This oversight on Apple's part
ends up penalizing users of "good citizen" console programs which
consult "terminfo" to tailor their output based upon reported terminal
capabilities (as opposed to programs which assume that the terminal
supports ANSI codes). The same problem is present in other Apple
"terminfo" entries, such as "nsterm"[2], with which macOS Terminal.app
may be configured.

Sidestep this Apple problem by imbuing get_colors() with specific
knowledge of capabilities common to "xterm" and "nsterm", rather than
trusting "terminfo" to report them correctly. Although hard-coding such
knowledge is ugly, "xterm" support is nearly ubiquitous these days, and
Git itself sets precedence by assuming support for ANSI color codes. For
other terminal types, fall back to querying "terminfo" via `tput` as
usual.

FOOTNOTES

[1] iTerm2 FAQ suggests "xterm-new": https://iterm2.com/faq.html

[2] Neovim documentation recommends terminal type "nsterm" with
    Terminal.app: https://neovim.io/doc/user/term.html#terminfo

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
This commit is contained in:
Eric Sunshine 2022-11-11 07:34:52 +00:00 коммит произвёл Taylor Blau
Родитель 3a79a8085b
Коммит 5451877f87
1 изменённых файлов: 23 добавлений и 12 удалений

Просмотреть файл

@ -653,21 +653,32 @@ my @NOCOLORS = (bold => '', rev => '', reset => '', blue => '', green => '', red
my %COLORS = ();
sub get_colors {
return \%COLORS if %COLORS;
if (exists($ENV{NO_COLOR}) ||
system("tput sgr0 >/dev/null 2>&1") != 0 ||
system("tput bold >/dev/null 2>&1") != 0 ||
system("tput rev >/dev/null 2>&1") != 0 ||
system("tput setaf 1 >/dev/null 2>&1") != 0) {
if (exists($ENV{NO_COLOR})) {
%COLORS = @NOCOLORS;
return \%COLORS;
}
%COLORS = (bold => `tput bold`,
rev => `tput rev`,
reset => `tput sgr0`,
blue => `tput setaf 4`,
green => `tput setaf 2`,
red => `tput setaf 1`);
chomp(%COLORS);
if ($ENV{TERM} =~ /xterm|xterm-\d+color|xterm-new|xterm-direct|nsterm|nsterm-\d+color|nsterm-direct/) {
%COLORS = (bold => "\e[1m",
rev => "\e[7m",
reset => "\e[0m",
blue => "\e[34m",
green => "\e[32m",
red => "\e[31m");
return \%COLORS;
}
if (system("tput sgr0 >/dev/null 2>&1") == 0 &&
system("tput bold >/dev/null 2>&1") == 0 &&
system("tput rev >/dev/null 2>&1") == 0 &&
system("tput setaf 1 >/dev/null 2>&1") == 0) {
%COLORS = (bold => `tput bold`,
rev => `tput rev`,
reset => `tput sgr0`,
blue => `tput setaf 4`,
green => `tput setaf 2`,
red => `tput setaf 1`);
return \%COLORS;
}
%COLORS = @NOCOLORS;
return \%COLORS;
}