From 954188af2747e796eb4428c493db9aa06ed1af38 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 20 Aug 2014 14:17:07 +0200 Subject: [PATCH] Filter Nix-specific ANSI escape sequences from stderr The Nixpkgs stdenv prints some custom escape sequences to denote nesting and stuff like that. Most terminals (e.g. xterm, konsole) ignore them, but some do not (e.g. xfce4-terminal). So for the benefit of the latter, filter them out. --- src/libstore/build.cc | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/libstore/build.cc b/src/libstore/build.cc index aa539a1fa..ef0a304de 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -2441,6 +2441,42 @@ void DerivationGoal::deleteTmpDir(bool force) } +/* Filter out the special ANSI escape codes generated by Nixpkgs' + stdenv (used to denote nesting etc.). */ +static string filterNixEscapes(const string & s) +{ + string t, r; + enum { stTop, stEscape, stCSI } state = stTop; + for (auto c : s) { + if (state == stTop) { + if (c == '\e') { + state = stEscape; + r = c; + } else + t += c; + } else if (state == stEscape) { + r += c; + if (c == '[') + state = stCSI; + else { + t += r; + state = stTop; + } + } else { + r += c; + if (c >= 0x40 && c != 0x7e) { + if (c != 'p' && c != 'q' && c != 's' && c != 'a' && c != 'b') + t += r; + state = stTop; + r.clear(); + } + } + } + t += r; + return t; +} + + void DerivationGoal::handleChildOutput(int fd, const string & data) { if ((hook && fd == hook->builderOut.readSide) || @@ -2455,7 +2491,7 @@ void DerivationGoal::handleChildOutput(int fd, const string & data) return; } if (verbosity >= settings.buildVerbosity) - writeToStderr(data); + writeToStderr(filterNixEscapes(data)); if (bzLogFile) { int err; BZ2_bzWrite(&err, bzLogFile, (unsigned char *) data.data(), data.size());