folly: Symbolizer: don't colorize TERM="dumb" or TERM="" or TERM-undefined TTYs
authorLucian Grijincu <lucian@fb.com>
Fri, 16 Oct 2015 03:04:34 +0000 (20:04 -0700)
committerfacebook-github-bot-4 <folly-bot@fb.com>
Fri, 16 Oct 2015 05:20:22 +0000 (22:20 -0700)
Reviewed By: @dcolascione

Differential Revision: D2548486

fb-gh-sync-id: 6e2d7e84598eb5b05aba7a262b7c53532337dbe3

folly/experimental/symbolizer/Symbolizer.cpp

index cc98c12451b212b6b88e08bbd48022713677a4ee..416277615f75e17218832748d0d21160158fefee 100644 (file)
 
 #include <folly/experimental/symbolizer/Symbolizer.h>
 
-#include <limits.h>
 #include <cstdio>
+#include <cstdlib>
 #include <iostream>
+#include <limits.h>
 
 #ifdef __GNUC__
 #include <ext/stdio_filebuf.h>
@@ -417,16 +418,20 @@ int getFD(const std::ios& stream) {
   return -1;
 }
 
-bool isTty(int options, int fd) {
-  return ((options & SymbolizePrinter::TERSE) == 0 &&
-          (options & SymbolizePrinter::COLOR_IF_TTY) != 0 &&
-          fd >= 0 && ::isatty(fd));
+bool isColorfulTty(int options, int fd) {
+  if ((options & SymbolizePrinter::TERSE) != 0 ||
+      (options & SymbolizePrinter::COLOR_IF_TTY) == 0 ||
+      fd < 0 || !::isatty(fd)) {
+    return false;
+  }
+  auto term = ::getenv("TERM");
+  return !(term == nullptr || term[0] == '\0' || strcmp(term, "dumb") == 0);
 }
 
 }  // anonymous namespace
 
 OStreamSymbolizePrinter::OStreamSymbolizePrinter(std::ostream& out, int options)
-  : SymbolizePrinter(options, isTty(options, getFD(out))),
+  : SymbolizePrinter(options, isColorfulTty(options, getFD(out))),
     out_(out) {
 }
 
@@ -435,7 +440,7 @@ void OStreamSymbolizePrinter::doPrint(StringPiece sp) {
 }
 
 FDSymbolizePrinter::FDSymbolizePrinter(int fd, int options, size_t bufferSize)
-  : SymbolizePrinter(options, isTty(options, fd)),
+  : SymbolizePrinter(options, isColorfulTty(options, fd)),
     fd_(fd),
     buffer_(bufferSize ? IOBuf::create(bufferSize) : nullptr) {
 }
@@ -466,7 +471,7 @@ void FDSymbolizePrinter::flush() {
 }
 
 FILESymbolizePrinter::FILESymbolizePrinter(FILE* file, int options)
-  : SymbolizePrinter(options, isTty(options, fileno(file))),
+  : SymbolizePrinter(options, isColorfulTty(options, fileno(file))),
     file_(file) {
 }