aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2018-03-15 16:08:07 +0100
committerEelco Dolstra <edolstra@gmail.com>2018-03-15 16:08:07 +0100
commit486872150638d56483c2bc429ba9e137d9974ee8 (patch)
tree469f6346618c2fbe1eb2e4282ef7e6cc90c01ff5 /src
parent7b8914825a6b02173976eae0ca59053085d4b20a (diff)
Filter ANSI colors when not writing to a terminal
Fixes https://github.com/NixOS/nixpkgs/issues/37114.
Diffstat (limited to 'src')
-rw-r--r--src/libutil/logging.cc2
-rw-r--r--src/libutil/util.cc4
-rw-r--r--src/libutil/util.hh10
-rw-r--r--src/nix/progress-bar.cc2
4 files changed, 10 insertions, 8 deletions
diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc
index e860b27d3..799c6e1ae 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 2391e14a9..a60ba8508 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 c5c537ee6..500ab7811 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());
diff --git a/src/nix/progress-bar.cc b/src/nix/progress-bar.cc
index e6553c06f..40b905ba3 100644
--- a/src/nix/progress-bar.cc
+++ b/src/nix/progress-bar.cc
@@ -308,7 +308,7 @@ public:
auto width = getWindowSize().second;
if (width <= 0) std::numeric_limits<decltype(width)>::max();
- writeToStderr("\r" + filterANSIEscapes(line, width) + "\e[K");
+ writeToStderr("\r" + filterANSIEscapes(line, false, width) + "\e[K");
}
std::string getStatus(State & state)