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.
This commit is contained in:
Eelco Dolstra 2014-08-20 14:17:07 +02:00
parent 029424d17d
commit 954188af27

View file

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