Bazel client, Windows: support colorful output

See https://github.com/bazelbuild/bazel/issues/2107

--
PiperOrigin-RevId: 150314355
MOS_MIGRATED_REVID=150314355
diff --git a/src/main/cpp/blaze_util_windows.cc b/src/main/cpp/blaze_util_windows.cc
index 15d39a5..0aa0954 100644
--- a/src/main/cpp/blaze_util_windows.cc
+++ b/src/main/cpp/blaze_util_windows.cc
@@ -1122,6 +1122,19 @@
       // with bizarre things like stdout going to the lock file, etc.
       _open("NUL", (i == 0) ? _O_RDONLY : _O_WRONLY);
     }
+    DWORD mode = 0;
+    if (i > 0 && handle != INVALID_HANDLE_VALUE && handle != NULL &&
+        ::GetConsoleMode(handle, &mode)) {
+      DWORD newmode = mode | ENABLE_PROCESSED_OUTPUT |
+                      ENABLE_WRAP_AT_EOL_OUTPUT |
+                      ENABLE_VIRTUAL_TERMINAL_PROCESSING;
+      if (mode != newmode) {
+        // We don't care about the success of this. Worst that can happen if
+        // this method fails is that the console won't understand control
+        // characters like color change or carriage return.
+        ::SetConsoleMode(handle, newmode);
+      }
+    }
   }
 #else  // not COMPILER_MSVC
   // Set non-buffered output mode for stderr/stdout. The server already
@@ -1313,9 +1326,18 @@
 // environment variables).
 bool IsStandardTerminal() {
 #ifdef COMPILER_MSVC
-  // TODO(bazel-team): Implement this method properly. We may return true if
-  // stdout and stderr are not redirected.
-  return false;
+  for (DWORD i : {STD_OUTPUT_HANDLE, STD_ERROR_HANDLE}) {
+    DWORD mode = 0;
+    HANDLE handle = ::GetStdHandle(i);
+    // handle may be invalid when std{out,err} is redirected
+    if (handle == INVALID_HANDLE_VALUE || !::GetConsoleMode(handle, &mode) ||
+        !(mode & ENABLE_PROCESSED_OUTPUT) ||
+        !(mode & ENABLE_WRAP_AT_EOL_OUTPUT) ||
+        !(mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING)) {
+      return false;
+    }
+  }
+  return true;
 #else  // not COMPILER_MSVC
   string term = GetEnv("TERM");
   if (term.empty() || term == "dumb" || term == "emacs" ||