Merge "Apply kati output rewriting to dumpvars"
diff --git a/ui/build/context.go b/ui/build/context.go
index 52a337d..0636631 100644
--- a/ui/build/context.go
+++ b/ui/build/context.go
@@ -103,6 +103,13 @@
 	return false
 }
 
+func (c ContextImpl) IsErrTerminal() bool {
+	if term, ok := os.LookupEnv("TERM"); ok {
+		return term != "dumb" && isTerminal(c.Stderr())
+	}
+	return false
+}
+
 func (c ContextImpl) TermWidth() (int, bool) {
 	return termWidth(c.Stdout())
 }
diff --git a/ui/build/dumpvars.go b/ui/build/dumpvars.go
index 96f2274..a0e1eca 100644
--- a/ui/build/dumpvars.go
+++ b/ui/build/dumpvars.go
@@ -42,6 +42,7 @@
 		config.PrebuiltBuildTool("ckati"),
 		"-f", "build/make/core/config.mk",
 		"--color_warnings",
+		"--kati_stats",
 		"dump-many-vars",
 		"MAKECMDGOALS="+strings.Join(goals, " "))
 	cmd.Environment.Set("CALLED_FROM_SETUP", "true")
@@ -51,15 +52,19 @@
 	}
 	cmd.Environment.Set("DUMP_MANY_VARS", strings.Join(vars, " "))
 	cmd.Sandbox = dumpvarsSandbox
-	// TODO: error out when Stderr contains any content
-	cmd.Stderr = ctx.Stderr()
-	output, err := cmd.Output()
+	output := bytes.Buffer{}
+	cmd.Stdout = &output
+	pipe, err := cmd.StderrPipe()
 	if err != nil {
-		return nil, err
+		ctx.Fatalln("Error getting output pipe for ckati:", err)
 	}
+	cmd.StartOrFatal()
+	// TODO: error out when Stderr contains any content
+	katiRewriteOutput(ctx, pipe)
+	cmd.WaitOrFatal()
 
 	ret := make(map[string]string, len(vars))
-	for _, line := range strings.Split(string(output), "\n") {
+	for _, line := range strings.Split(output.String(), "\n") {
 		if len(line) == 0 {
 			continue
 		}
diff --git a/ui/build/kati.go b/ui/build/kati.go
index 7bb721d..e4715bb 100644
--- a/ui/build/kati.go
+++ b/ui/build/kati.go
@@ -115,6 +115,7 @@
 func katiRewriteOutput(ctx Context, pipe io.ReadCloser) {
 	haveBlankLine := true
 	smartTerminal := ctx.IsTerminal()
+	errSmartTerminal := ctx.IsErrTerminal()
 
 	scanner := bufio.NewScanner(pipe)
 	for scanner.Scan() {
@@ -155,7 +156,7 @@
 			// that message instead of overwriting it.
 			fmt.Fprintln(ctx.Stdout())
 			haveBlankLine = true
-		} else if !smartTerminal {
+		} else if !errSmartTerminal {
 			// Most editors display these as garbage, so strip them out.
 			line = string(stripAnsiEscapes([]byte(line)))
 		}