Skip to content

Commit e393a21

Browse files
committed
fix: Curl download print process --bug=1
1 parent 8a0cac7 commit e393a21

1 file changed

Lines changed: 31 additions & 3 deletions

File tree

pkg/executor/executor.go

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,31 @@ func (e *Executor) ExecuteWithOutput(command string, stdin string) (string, erro
133133
cmd.Stdin = strings.NewReader(stdin)
134134
}
135135

136+
// 检测 stdout 和 stderr 是否连接到终端(TTY)
137+
// 如果是 TTY,直接连接以支持进度条等交互式输出
138+
// 否则使用 MultiWriter 捕获输出
139+
stdoutIsTTY := isTerminal(os.Stdout)
140+
stderrIsTTY := isTerminal(os.Stderr)
141+
136142
// 创建输出缓冲区
137143
var stdout bytes.Buffer
138144
var stderr bytes.Buffer
139145

140-
// 使用 MultiWriter 同时写入缓冲区和终端
141-
cmd.Stdout = io.MultiWriter(&stdout, os.Stdout)
142-
cmd.Stderr = io.MultiWriter(&stderr, os.Stderr)
146+
if stdoutIsTTY {
147+
// 直接连接到终端,支持进度条等特性
148+
cmd.Stdout = os.Stdout
149+
} else {
150+
// 使用 MultiWriter 同时写入缓冲区和终端
151+
cmd.Stdout = io.MultiWriter(&stdout, os.Stdout)
152+
}
153+
154+
if stderrIsTTY {
155+
// 直接连接到终端,支持进度条等特性
156+
cmd.Stderr = os.Stderr
157+
} else {
158+
// 使用 MultiWriter 同时写入缓冲区和终端
159+
cmd.Stderr = io.MultiWriter(&stderr, os.Stderr)
160+
}
143161

144162
// 执行命令
145163
err := cmd.Run()
@@ -159,6 +177,16 @@ func (e *Executor) ExecuteWithOutput(command string, stdin string) (string, erro
159177
return output, nil
160178
}
161179

180+
// isTerminal 检测文件是否是终端(TTY)
181+
func isTerminal(f *os.File) bool {
182+
stat, err := f.Stat()
183+
if err != nil {
184+
return false
185+
}
186+
// 检查文件模式是否为字符设备(终端)
187+
return (stat.Mode() & os.ModeCharDevice) != 0
188+
}
189+
162190
// GetShell 返回当前使用的 Shell 信息
163191
func (e *Executor) GetShell() *ShellAdapter {
164192
return e.shell

0 commit comments

Comments
 (0)