diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2018-03-15T15·08+0100 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2018-03-15T15·08+0100 |
commit | 486872150638d56483c2bc429ba9e137d9974ee8 (patch) | |
tree | 469f6346618c2fbe1eb2e4282ef7e6cc90c01ff5 /src/libutil | |
parent | 7b8914825a6b02173976eae0ca59053085d4b20a (diff) |
Filter ANSI colors when not writing to a terminal
Fixes https://github.com/NixOS/nixpkgs/issues/37114.
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/logging.cc | 2 | ||||
-rw-r--r-- | src/libutil/util.cc | 4 | ||||
-rw-r--r-- | src/libutil/util.hh | 10 |
3 files changed, 9 insertions, 7 deletions
diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index e860b27d3d0b..799c6e1ae441 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -53,7 +53,7 @@ public: prefix = std::string("<") + c + ">"; } - writeToStderr(prefix + filterANSIEscapes(fs.s) + "\n"); + writeToStderr(prefix + filterANSIEscapes(fs.s, !tty) + "\n"); } void startActivity(ActivityId act, Verbosity lvl, ActivityType type, diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 2391e14a94bd..a60ba8508e31 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -1185,7 +1185,7 @@ void ignoreException() } -std::string filterANSIEscapes(const std::string & s, unsigned int width) +std::string filterANSIEscapes(const std::string & s, bool filterAll, unsigned int width) { std::string t, e; size_t w = 0; @@ -1210,7 +1210,7 @@ std::string filterANSIEscapes(const std::string & s, unsigned int width) if (i != s.end() && *i >= 0x40 && *i <= 0x5f) e += *i++; } - if (last == 'm') + if (!filterAll && last == 'm') t += e; } diff --git a/src/libutil/util.hh b/src/libutil/util.hh index c5c537ee63d8..500ab7811b93 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -391,11 +391,13 @@ void ignoreException(); #define ANSI_BLUE "\e[34;1m" -/* Truncate a string to 'width' printable characters. Certain ANSI - escape sequences (such as colour setting) are copied but not - included in the character count. Other ANSI escape sequences are - filtered. Also, tabs are expanded to spaces. */ +/* Truncate a string to 'width' printable characters. If 'filterAll' + is true, all ANSI escape sequences are filtered out. Otherwise, + some escape sequences (such as colour setting) are copied but not + included in the character count. Also, tabs are expanded to + spaces. */ std::string filterANSIEscapes(const std::string & s, + bool filterAll = false, unsigned int width = std::numeric_limits<unsigned int>::max()); |