Enable plain TTY logging mode + loose-data processing

This commit is contained in:
2026-05-14 15:11:08 +02:00
parent 2cef662e8e
commit 9384d905d1
5 changed files with 115 additions and 28 deletions
+17 -3
View File
@@ -139,6 +139,20 @@ func isInteractiveTTY(w io.Writer) bool {
return (info.Mode() & os.ModeCharDevice) != 0
}
func spinnerEnabledFor(w io.Writer, level logLevel) bool {
mode := strings.TrimSpace(strings.ToLower(os.Getenv("SOW_TOOLS_TTY_MODE")))
switch mode {
case "plain", "off", "0", "false", "no":
return false
case "spinner", "on", "1", "true", "yes":
return level == logLevelNormal && isInteractiveTTY(w)
case "", "auto":
return isInteractiveTTY(w) && strings.TrimSpace(os.Getenv("CI")) == "" && level == logLevelNormal
default:
return isInteractiveTTY(w) && strings.TrimSpace(os.Getenv("CI")) == "" && level == logLevelNormal
}
}
var commands = []command{
{
name: "build",
@@ -605,7 +619,7 @@ func newProjectConsole(ctx context, p *project.Project, commandName string) *pro
commandName: commandName,
commandLabel: projectCommandLabel(commandName),
level: ctx.logLevel,
spinnerEnabled: isInteractiveTTY(ctx.stderr) && strings.TrimSpace(os.Getenv("CI")) == "" && ctx.logLevel == logLevelNormal,
spinnerEnabled: spinnerEnabledFor(ctx.stderr, ctx.logLevel),
}
}
@@ -787,7 +801,7 @@ func newBuildHAKConsole(ctx context, p *project.Project, opts buildHAKOptions) *
projectName: p.Config.Module.Name,
planOnly: opts.planOnly,
level: opts.logLevel,
spinnerEnabled: isInteractiveTTY(ctx.stderr) && strings.TrimSpace(os.Getenv("CI")) == "" && opts.logLevel == logLevelNormal,
spinnerEnabled: spinnerEnabledFor(ctx.stderr, opts.logLevel),
}
}
@@ -962,7 +976,7 @@ func newTopdataConsole(ctx context, p *project.Project, commandName string) *top
commandName: commandName,
commandLabel: topdataCommandLabel(commandName),
level: ctx.logLevel,
spinnerEnabled: isInteractiveTTY(ctx.stderr) && strings.TrimSpace(os.Getenv("CI")) == "" && ctx.logLevel == logLevelNormal,
spinnerEnabled: spinnerEnabledFor(ctx.stderr, ctx.logLevel),
}
}
+21 -2
View File
@@ -35,8 +35,7 @@ topdata:
sourceTime := time.Now().Add(-2 * time.Hour)
outputTime := time.Now().Add(-1 * time.Hour)
setFileTime(t, filepath.Join(root, "topdata", "assets", "gui", "testicon.png"), sourceTime)
setFileTime(t, filepath.Join(root, "topdata", "data", "repadjust", "base.json"), sourceTime)
setTreeTime(t, filepath.Join(root, "topdata"), sourceTime)
setFileTime(t, filepath.Join(root, ".cache", "2da", "repadjust.2da"), outputTime)
setFileTime(t, filepath.Join(root, "build", "sow_tlk.tlk"), outputTime)
@@ -130,6 +129,19 @@ haks:
}
}
func setTreeTime(t *testing.T, root string, modTime time.Time) {
t.Helper()
err := filepath.WalkDir(root, func(path string, d os.DirEntry, walkErr error) error {
if walkErr != nil {
return walkErr
}
return os.Chtimes(path, modTime, modTime)
})
if err != nil {
t.Fatalf("set tree time under %s: %v", root, err)
}
}
func TestRunBuildHAKsVerboseListsMappings(t *testing.T) {
root := t.TempDir()
mkdirAll(t, filepath.Join(root, "assets", "envi", "music", "westgate"))
@@ -212,6 +224,13 @@ func TestTopdataConsoleSuppressesProgressInNormalMode(t *testing.T) {
}
}
func TestSpinnerEnabledForHonorsPlainTTYMode(t *testing.T) {
t.Setenv("SOW_TOOLS_TTY_MODE", "plain")
if spinnerEnabledFor(&bytes.Buffer{}, logLevelNormal) {
t.Fatal("expected plain tty mode to disable spinner output")
}
}
func TestTopdataConsoleDebugProgressAndRelativePaths(t *testing.T) {
var stdout bytes.Buffer
console := &topdataConsole{