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());