Pádraig Brady wrote:
> > You could determine that programatically with something like:
> >
> > if os.system(r'{ tput bold || tput md; } >/dev/null 2>&1') == 0:
> > # enable bold output
Thanks for the hint. Use of 'tput bold' indeed activates bold-face
output on
- Linux console (TERM=linux),
- NetBSD console (TERM=wsvt25),
- OpenBSD console (TERM=vt220),
- Emacs *terminal* (TERM=eterm-color).
On the Solaris 11.4 I cannot get bold output; all text is bold there.
On the Solaris 11 OmniOS console (TERM=sun-color), one needs to use
'tput smso'. However, care needs to be taken to not use it on other
systems, including Solaris 11.4, because on most systems, 'tput smso'
activates reverse-video output, not bold output, and that is more
ugly than nothing.
I cannot see why 'tput md' would be useful. 'md' is a termcap capability
name, and termcap is deprecated for 25 years since it's inherently insecure.
Tested with
$ ./gnulib-tool --create-testdir --dir=aaa assert-h
2024-03-29 Bruno Haible <[email protected]>
gnulib-tool: Use bold output on Linux, NetBSD, OpenBSD, OmniOS consoles.
Reported by Pádraig Brady in
<https://lists.gnu.org/archive/html/bug-gnulib/2024-03/msg00399.html>.
* gnulib-tool.sh (func_show_module_list): Use 'tput' to determine the
"bold" capability of terminal types other than xterm*.
* pygnulib/constants.py (get_terminfo_string, bold_escapes): New
functions.
* pygnulib/GLTestDir.py (GLTestDir.execute): Invoke
constants.bold_escapes.
* pygnulib/GLImport.py (GLImport.prepare): Likewise.
diff --git a/gnulib-tool.sh b/gnulib-tool.sh
index e0c8cfafbd..6b12542adc 100755
--- a/gnulib-tool.sh
+++ b/gnulib-tool.sh
@@ -3260,13 +3260,30 @@ func_modules_transitive_closure ()
# - tmp pathname of a temporary directory
func_show_module_list ()
{
- if case "$TERM" in
- xterm*) test -t 1;;
- *) false;;
- esac; then
- # Assume xterm compatible escape sequences.
- bold_on=`printf '\033[1m'`
- bold_off=`printf '\033[0m'`
+ if test -n "$TERM" && test -t 1; then
+ case "$TERM" in
+ xterm*)
+ # Assume xterm compatible escape sequences.
+ bold_on=`printf '\033[1m'`
+ bold_off=`printf '\033[0m'`
+ ;;
+ *)
+ # Use the terminfo capability strings for "bold" and "sgr0".
+ if test "$TERM" = sun-color && test "`tput smso`" != "`tput rev`"; then
+ # Solaris 11 OmniOS: `tput smso` renders as bold,
+ # `tput rmso` is the same as `tput sgr0`.
+ bold_on=`tput smso 2>/dev/null`
+ bold_off=`tput rmso 2>/dev/null`
+ else
+ bold_on=`tput bold 2>/dev/null`
+ bold_off=`tput sgr0 2>/dev/null`
+ fi
+ if test -z "$bold_on" || test -z "$bold_off"; then
+ bold_on=
+ bold_off=
+ fi
+ ;;
+ esac
else
bold_on=
bold_off=
diff --git a/pygnulib/GLImport.py b/pygnulib/GLImport.py
index 84e1c08689..eb382cadac 100644
--- a/pygnulib/GLImport.py
+++ b/pygnulib/GLImport.py
@@ -847,12 +847,7 @@ AC_DEFUN([%s_FILE_LIST], [\n''' % macro_prefix
# Show final module list.
if verbose >= 0:
- bold_on = ''
- bold_off = ''
- term = os.getenv('TERM', '')
- if term.startswith('xterm') and os.isatty(1):
- bold_on = '\033[1m'
- bold_off = '\033[0m'
+ (bold_on, bold_off) = constants.bold_escapes()
print('Module list with included dependencies (indented):')
for module in final_modules:
if str(module) in self.config.getModules():
diff --git a/pygnulib/GLTestDir.py b/pygnulib/GLTestDir.py
index e395090b83..2a39eb3c5d 100644
--- a/pygnulib/GLTestDir.py
+++ b/pygnulib/GLTestDir.py
@@ -258,12 +258,7 @@ class GLTestDir(object):
# Show final module list.
if verbose >= 0:
- bold_on = ''
- bold_off = ''
- term = os.getenv('TERM', '')
- if term.startswith('xterm') and os.isatty(1):
- bold_on = '\033[1m'
- bold_off = '\033[0m'
+ (bold_on, bold_off) = constants.bold_escapes()
print('Module list with included dependencies (indented):')
specified_modules_set = { str(module)
for module in specified_modules }
diff --git a/pygnulib/constants.py b/pygnulib/constants.py
index 16a60d1d3d..a6ef32cb47 100644
--- a/pygnulib/constants.py
+++ b/pygnulib/constants.py
@@ -568,4 +568,42 @@ def combine_lines_matching(pattern: re.Pattern, text: str)
-> str:
return text
+def get_terminfo_string(capability: str) -> str:
+ '''Returns the value of a string-type terminfo capability for the current
value of $TERM.
+ Returns the empty string if not defined.'''
+ value = ''
+ try:
+ value = sp.run(['tput', capability], stdout=sp.PIPE,
stderr=sp.DEVNULL).stdout.decode('utf-8')
+ except Exception:
+ pass
+ return value
+
+
+def bold_escapes() -> tuple[str, str]:
+ '''Returns the escape sequences for turning bold-face on and off.'''
+ term = os.getenv('TERM', '')
+ if term != '' and os.isatty(1):
+ if term.startswith('xterm'):
+ # Assume xterm compatible escape sequences.
+ bold_on = '\033[1m'
+ bold_off = '\033[0m'
+ else:
+ # Use the terminfo capability strings for "bold" and "sgr0".
+ if term == 'sun-color' and get_terminfo_string('smso') !=
get_terminfo_string('rev'):
+ # Solaris 11 OmniOS: `tput smso` renders as bold,
+ # `tput rmso` is the same as `tput sgr0`.
+ bold_on = get_terminfo_string('smso')
+ bold_off = get_terminfo_string('rmso')
+ else:
+ bold_on = get_terminfo_string('bold')
+ bold_off = get_terminfo_string('sgr0')
+ if bold_on == '' or bold_off == '':
+ bold_on = ''
+ bold_off = ''
+ else:
+ bold_on = ''
+ bold_off = ''
+ return (bold_on, bold_off)
+
+
__all__ += ['APP', 'DIRS', 'MODES', 'UTILS']