···
Stdout http.ResponseWriter
24
+
func (c *ServiceCommand) RunService(cmd *exec.Cmd) error {
25
+
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
27
+
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
29
+
var stderr bytes.Buffer
30
+
cmd.Stderr = &stderr
32
+
stdoutPipe, err := cmd.StdoutPipe()
34
+
return fmt.Errorf("failed to create stdout pipe: %w", err)
37
+
stdinPipe, err := cmd.StdinPipe()
39
+
return fmt.Errorf("failed to create stdin pipe: %w", err)
42
+
if err := cmd.Start(); err != nil {
43
+
return fmt.Errorf("failed to start '%s': %w", cmd.String(), err)
46
+
var wg sync.WaitGroup
52
+
defer stdinPipe.Close()
53
+
io.Copy(stdinPipe, c.Stdin)
57
+
if c.Stdout != nil {
61
+
io.Copy(newWriteFlusher(c.Stdout), stdoutPipe)
68
+
if err := cmd.Wait(); err != nil {
69
+
return fmt.Errorf("'%s' failed: %w, stderr: %s", cmd.String(), err, stderr.String())
func (c *ServiceCommand) InfoRefs() error {
cmd := exec.Command("git", []string{
···
"--http-backend-info-refs",
31
-
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
33
-
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
34
-
stdoutPipe, _ := cmd.StdoutPipe()
35
-
cmd.Stderr = cmd.Stdout
37
-
if err := cmd.Start(); err != nil {
38
-
log.Printf("git: failed to start git-upload-pack (info/refs): %s", err)
if !strings.Contains(c.GitProtocol, "version=2") {
if err := packLine(c.Stdout, "# service=git-upload-pack\n"); err != nil {
···
54
-
buf := bytes.Buffer{}
55
-
if _, err := io.Copy(&buf, stdoutPipe); err != nil {
56
-
log.Printf("git: failed to copy stdout to tmp buffer: %s", err)
60
-
if err := cmd.Wait(); err != nil {
61
-
out := strings.Builder{}
62
-
_, _ = io.Copy(&out, &buf)
63
-
log.Printf("git: failed to run git-upload-pack; err: %s; output: %s", err, out.String())
67
-
if _, err := io.Copy(c.Stdout, &buf); err != nil {
68
-
log.Printf("git: failed to copy stdout: %s", err)
95
+
return c.RunService(cmd)
func (c *ServiceCommand) UploadPack() error {
75
-
var stderr bytes.Buffer
cmd := exec.Command("git", []string{
"-c", "uploadpack.allowFilter=true",
···
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
88
-
stdoutPipe, err := cmd.StdoutPipe()
90
-
return fmt.Errorf("failed to create stdout pipe: %w", err)
93
-
cmd.Stderr = &stderr
95
-
stdinPipe, err := cmd.StdinPipe()
97
-
return fmt.Errorf("failed to create stdin pipe: %w", err)
100
-
if err := cmd.Start(); err != nil {
101
-
return fmt.Errorf("failed to start git-upload-pack: %w", err)
104
-
var wg sync.WaitGroup
109
-
defer stdinPipe.Close()
110
-
io.Copy(stdinPipe, c.Stdin)
116
-
io.Copy(newWriteFlusher(c.Stdout), stdoutPipe)
122
-
if err := cmd.Wait(); err != nil {
123
-
return fmt.Errorf("git-upload-pack failed: %w, stderr: %s", err, stderr.String())
110
+
return c.RunService(cmd)
func packLine(w io.Writer, s string) error {