Force dumpvars into dumb terminal mode and move log files

Force soong_ui in dumpvars mode to use a dumb terminal so that it
doesn't print an empty status table.  Also move the logs to files
that are prefixed with "dumpvars-" so that they don't rotate the
real build logs.

Fixes: 139307849
Test: lunch
Change-Id: If92421af07731fedc9ca42670f309e95922a2224
This commit is contained in:
Colin Cross 2019-09-23 12:44:54 -07:00
parent f0b987ecba
commit c0b9f6b9d2
4 changed files with 45 additions and 24 deletions

View file

@ -158,7 +158,7 @@ type mpContext struct {
func main() { func main() {
stdio := terminal.StdioImpl{} stdio := terminal.StdioImpl{}
output := terminal.NewStatusOutput(stdio.Stdout(), "", output := terminal.NewStatusOutput(stdio.Stdout(), "", false,
build.OsEnvironment().IsEnvTrue("ANDROID_QUIET_BUILD")) build.OsEnvironment().IsEnvTrue("ANDROID_QUIET_BUILD"))
log := logger.New(output) log := logger.New(output)
@ -391,7 +391,7 @@ func buildProduct(mpctx *mpContext, product string) {
Thread: mpctx.Tracer.NewThread(product), Thread: mpctx.Tracer.NewThread(product),
Status: &status.Status{}, Status: &status.Status{},
}} }}
ctx.Status.AddOutput(terminal.NewStatusOutput(ctx.Writer, "", ctx.Status.AddOutput(terminal.NewStatusOutput(ctx.Writer, "", false,
build.OsEnvironment().IsEnvTrue("ANDROID_QUIET_BUILD"))) build.OsEnvironment().IsEnvTrue("ANDROID_QUIET_BUILD")))
config := build.NewConfig(ctx, flag.Args()...) config := build.NewConfig(ctx, flag.Args()...)

View file

@ -41,6 +41,12 @@ type command struct {
// description for the flag (to display when running help) // description for the flag (to display when running help)
description string description string
// Forces the status output into dumb terminal mode.
forceDumbOutput bool
// Sets a prefix string to use for filenames of log files.
logsPrefix string
// Creates the build configuration based on the args and build context. // Creates the build configuration based on the args and build context.
config func(ctx build.Context, args ...string) build.Config config func(ctx build.Context, args ...string) build.Config
@ -66,12 +72,16 @@ var commands []command = []command{
}, { }, {
flag: "--dumpvar-mode", flag: "--dumpvar-mode",
description: "print the value of the legacy make variable VAR to stdout", description: "print the value of the legacy make variable VAR to stdout",
forceDumbOutput: true,
logsPrefix: "dumpvars-",
config: dumpVarConfig, config: dumpVarConfig,
stdio: customStdio, stdio: customStdio,
run: dumpVar, run: dumpVar,
}, { }, {
flag: "--dumpvars-mode", flag: "--dumpvars-mode",
description: "dump the values of one or more legacy make variables, in shell syntax", description: "dump the values of one or more legacy make variables, in shell syntax",
forceDumbOutput: true,
logsPrefix: "dumpvars-",
config: dumpVarConfig, config: dumpVarConfig,
stdio: customStdio, stdio: customStdio,
run: dumpVars, run: dumpVars,
@ -113,7 +123,7 @@ func main() {
os.Exit(1) os.Exit(1)
} }
output := terminal.NewStatusOutput(c.stdio().Stdout(), os.Getenv("NINJA_STATUS"), output := terminal.NewStatusOutput(c.stdio().Stdout(), os.Getenv("NINJA_STATUS"), c.forceDumbOutput,
build.OsEnvironment().IsEnvTrue("ANDROID_QUIET_BUILD")) build.OsEnvironment().IsEnvTrue("ANDROID_QUIET_BUILD"))
log := logger.New(output) log := logger.New(output)
@ -157,14 +167,14 @@ func main() {
} }
os.MkdirAll(logsDir, 0777) os.MkdirAll(logsDir, 0777)
log.SetOutput(filepath.Join(logsDir, "soong.log")) log.SetOutput(filepath.Join(logsDir, c.logsPrefix+"soong.log"))
trace.SetOutput(filepath.Join(logsDir, "build.trace")) trace.SetOutput(filepath.Join(logsDir, c.logsPrefix+"build.trace"))
stat.AddOutput(status.NewVerboseLog(log, filepath.Join(logsDir, "verbose.log"))) stat.AddOutput(status.NewVerboseLog(log, filepath.Join(logsDir, c.logsPrefix+"verbose.log")))
stat.AddOutput(status.NewErrorLog(log, filepath.Join(logsDir, "error.log"))) stat.AddOutput(status.NewErrorLog(log, filepath.Join(logsDir, c.logsPrefix+"error.log")))
stat.AddOutput(status.NewProtoErrorLog(log, filepath.Join(logsDir, "build_error"))) stat.AddOutput(status.NewProtoErrorLog(log, filepath.Join(logsDir, c.logsPrefix+"build_error")))
stat.AddOutput(status.NewCriticalPath(log)) stat.AddOutput(status.NewCriticalPath(log))
defer met.Dump(filepath.Join(logsDir, "soong_metrics")) defer met.Dump(filepath.Join(logsDir, c.logsPrefix+"soong_metrics"))
if start, ok := os.LookupEnv("TRACE_BEGIN_SOONG"); ok { if start, ok := os.LookupEnv("TRACE_BEGIN_SOONG"); ok {
if !strings.HasSuffix(start, "N") { if !strings.HasSuffix(start, "N") {

View file

@ -26,10 +26,10 @@ import (
// //
// statusFormat takes nearly all the same options as NINJA_STATUS. // statusFormat takes nearly all the same options as NINJA_STATUS.
// %c is currently unsupported. // %c is currently unsupported.
func NewStatusOutput(w io.Writer, statusFormat string, quietBuild bool) status.StatusOutput { func NewStatusOutput(w io.Writer, statusFormat string, forceDumbOutput, quietBuild bool) status.StatusOutput {
formatter := newFormatter(statusFormat, quietBuild) formatter := newFormatter(statusFormat, quietBuild)
if isSmartTerminal(w) { if !forceDumbOutput && isSmartTerminal(w) {
return NewSmartStatusOutput(w, formatter) return NewSmartStatusOutput(w, formatter)
} else { } else {
return NewDumbStatusOutput(w, formatter) return NewDumbStatusOutput(w, formatter)

View file

@ -94,7 +94,7 @@ func TestStatusOutput(t *testing.T) {
t.Run("smart", func(t *testing.T) { t.Run("smart", func(t *testing.T) {
smart := &fakeSmartTerminal{termWidth: 40} smart := &fakeSmartTerminal{termWidth: 40}
stat := NewStatusOutput(smart, "", false) stat := NewStatusOutput(smart, "", false, false)
tt.calls(stat) tt.calls(stat)
stat.Flush() stat.Flush()
@ -105,7 +105,7 @@ func TestStatusOutput(t *testing.T) {
t.Run("dumb", func(t *testing.T) { t.Run("dumb", func(t *testing.T) {
dumb := &bytes.Buffer{} dumb := &bytes.Buffer{}
stat := NewStatusOutput(dumb, "", false) stat := NewStatusOutput(dumb, "", false, false)
tt.calls(stat) tt.calls(stat)
stat.Flush() stat.Flush()
@ -113,6 +113,17 @@ func TestStatusOutput(t *testing.T) {
t.Errorf("want:\n%q\ngot:\n%q", w, g) t.Errorf("want:\n%q\ngot:\n%q", w, g)
} }
}) })
t.Run("force dumb", func(t *testing.T) {
smart := &fakeSmartTerminal{termWidth: 40}
stat := NewStatusOutput(smart, "", true, false)
tt.calls(stat)
stat.Flush()
if g, w := smart.String(), tt.dumb; g != w {
t.Errorf("want:\n%q\ngot:\n%q", w, g)
}
})
}) })
} }
} }
@ -258,7 +269,7 @@ func TestSmartStatusOutputWidthChange(t *testing.T) {
os.Setenv(tableHeightEnVar, "") os.Setenv(tableHeightEnVar, "")
smart := &fakeSmartTerminal{termWidth: 40} smart := &fakeSmartTerminal{termWidth: 40}
stat := NewStatusOutput(smart, "", false) stat := NewStatusOutput(smart, "", false, false)
smartStat := stat.(*smartStatusOutput) smartStat := stat.(*smartStatusOutput)
smartStat.sigwinchHandled = make(chan bool) smartStat.sigwinchHandled = make(chan bool)