From 039247eceac806f21403480e6ffbb5678c51fb4a Mon Sep 17 00:00:00 2001 From: engigu Date: Fri, 27 Feb 2026 11:52:02 +0800 Subject: [PATCH] fix: reposync log format --- cmd/reposync/reposync.go | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/cmd/reposync/reposync.go b/cmd/reposync/reposync.go index cbe0ee3..771fe08 100644 --- a/cmd/reposync/reposync.go +++ b/cmd/reposync/reposync.go @@ -8,6 +8,7 @@ import ( "os" "os/exec" "path/filepath" + "regexp" "strings" "time" ) @@ -285,13 +286,36 @@ func getRepoName(url string) string { return filepath.Base(u) } +var ansiRegex = regexp.MustCompile(`\x1b\[[0-9;]*[a-zA-Z]`) + +type cleanWriter struct { + out io.Writer +} + +func (c *cleanWriter) Write(p []byte) (n int, err error) { + s := string(p) + // Strip ANSI escape sequences like \x1b[K + s = ansiRegex.ReplaceAllString(s, "") + // Replace \r with \n for better rendering in raw log views + s = strings.ReplaceAll(s, "\r\n", "\n") + s = strings.ReplaceAll(s, "\r", "\n") + // Clean up duplicate newlines that might arise from \r replacements + s = strings.ReplaceAll(s, "\n\n", "\n") + + _, err = c.out.Write([]byte(s)) + return len(p), err +} + func runCmd(args []string, dir string, env []string) { fmt.Printf(">> %s\n", strings.Join(args, " ")) cmd := exec.Command(args[0], args[1:]...) cmd.Dir = dir cmd.Env = env - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr + + cw := &cleanWriter{out: os.Stdout} + cmd.Stdout = cw + cmd.Stderr = cw + if err := cmd.Run(); err != nil { fmt.Printf("Command failed: %v\n", err) os.Exit(1)