49 lines
1.1 KiB
Go
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
|
|
}
|