Files
GitPilot/internal/git/client.go
2026-03-06 18:22:58 +08:00

49 lines
1.1 KiB
Go

package git
import (
"bytes"
"context"
"fmt"
"os/exec"
"time"
"github.com/zhuy1228/GitPilot/internal"
)
type GitClient struct {
Enabled bool
Proxy string
Timeout time.Duration
}
func NewGitClient() *GitClient {
proxy, _ := internal.GetCurrentProxy()
return &GitClient{
Enabled: proxy.Enabled,
Proxy: proxy.Protocol + "://" + proxy.Server,
}
}
// Run 执行 git 命令,支持超时和代理设置
func (g *GitClient) Run(path string, args ...string) (string, error) {
ctx, cancel := context.WithTimeout(context.Background(), g.Timeout)
defer cancel()
header := []string{"-C", path, "git"}
if g.Enabled {
header = append(header, "-c", "http.proxy="+g.Proxy, "-c", "https.proxy="+g.Proxy)
}
argsArr := append(header, args...)
cmd := exec.CommandContext(ctx, "git", argsArr...)
var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
if ctx.Err() == context.DeadlineExceeded {
return "", fmt.Errorf("git command timeout: git %v", args)
}
if err != nil {
return "", fmt.Errorf("git command error: %v, stderr: %s", err, stderr.String())
}
return stdout.String(), nil
}