From 756ba40fbbb9a605d2612848e246e6ef71e1c31e Mon Sep 17 00:00:00 2001 From: ycc Date: Tue, 15 Oct 2024 17:37:37 +0200 Subject: [PATCH] fix bin cleaning and run logs --- .vscode/launch.json | 2 +- cmd/localbuild.go | 2 +- cmd/runtutils.go | 59 ++++++++++++++++++++++++++++++++++----------- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 6ff66c1..b0b9c5e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "request": "launch", "mode": "auto", "program": "main.go", - "args": ["localbuild"] + "args": ["localbuild", "-p"] }, { "name": "localrun", diff --git a/cmd/localbuild.go b/cmd/localbuild.go index 25797f7..80fee3d 100644 --- a/cmd/localbuild.go +++ b/cmd/localbuild.go @@ -37,7 +37,7 @@ to quickly create a Cobra application.`, } else { fmt.Println("Repository deleted successfully") } - //err := deleteFolderIfExists(binPath) + err = deleteFolderIfExists(binPath) if err != nil { fmt.Println("Error:", err) } else { diff --git a/cmd/runtutils.go b/cmd/runtutils.go index 62cb30a..cff4715 100644 --- a/cmd/runtutils.go +++ b/cmd/runtutils.go @@ -1,7 +1,7 @@ package cmd import ( - "bytes" + "bufio" "context" "fmt" "io" @@ -29,9 +29,8 @@ func walkFolder(folderPath string, ctx context.Context, wg *sync.WaitGroup) { for _, file := range files { // Check if filename starts with "oc-" - if strings.HasPrefix(file.Name(), "oc-") { + if strings.HasPrefix(file.Name(), "oc-") && (!strings.Contains(file.Name(), ".") || strings.Contains(file.Name(), ".exe")) { // Prepare the command to start the process - wg.Add(1) go startProcess(ctx, file.Name(), wg) } @@ -47,38 +46,70 @@ func walkFolder(folderPath string, ctx context.Context, wg *sync.WaitGroup) { } } -// startProcess runs the given program and stores a reference to it for later control func startProcess(ctx context.Context, program string, wg *sync.WaitGroup, args ...string) { defer wg.Done() + // Create log file + logFile, err := os.Create(program + ".log") + if err != nil { + log.Printf("Failed to create log file: %v", err) + return + } + cmd := exec.CommandContext(ctx, program, args...) mu.Lock() processes = append(processes, cmd) mu.Unlock() - var outBuf, errBuf bytes.Buffer - cmd.Stdout = &outBuf - cmd.Stderr = &errBuf - err := cmd.Start() + // Create pipes to capture the output in real-time + stdoutPipe, err := cmd.StdoutPipe() if err != nil { + log.Printf("Failed to get stdout pipe: %v", err) + return + } + + stderrPipe, err := cmd.StderrPipe() + if err != nil { + log.Printf("Failed to get stderr pipe: %v", err) + return + } + + // Start the command + if err := cmd.Start(); err != nil { log.Printf("Failed to start process: %s", program) return } log.Printf("Started process: %s", program) - fmt.Print(outBuf.String()) - fmt.Print(errBuf.String()) + // Create goroutines to read stdout and stderr concurrently + go func() { + scanner := bufio.NewScanner(stdoutPipe) + for scanner.Scan() { + fmt.Fprintln(logFile, scanner.Text()) // Print each line from stdout as it arrives + } + if err := scanner.Err(); err != nil { + log.Printf("Error reading stdout: %v", err) + } + }() - err = cmd.Wait() - if err != nil { + go func() { + scanner := bufio.NewScanner(stderrPipe) + for scanner.Scan() { + fmt.Fprintln(logFile, scanner.Text()) // Print each line from stderr as it arrives + } + if err := scanner.Err(); err != nil { + log.Printf("Error reading stderr: %v", err) + } + }() + + // Wait for the process to finish + if err := cmd.Wait(); err != nil { log.Printf("Process finished with error: %v", err) } else { log.Printf("Process finished successfully: %s", program) } - fmt.Print(outBuf.String()) - fmt.Print(errBuf.String()) } // stopAllProcesses stops all the started processes