1diff --git a/pkg/git/git.go b/pkg/git/git.go
2index 95355f39daf9f06f2be40b80e9c63682d5336b14..83f3f936313921c0a80fcace1b2a90b56df585c9 100644
3--- a/pkg/git/git.go
4+++ b/pkg/git/git.go
5@@ -8,12 +8,10 @@ "errors"
6 "fmt"
7 "io"
8 "io/fs"
9- "log"
10 "log/slog"
11 "os/exec"
12 "path"
13 "sort"
14- "syscall"
15 "time"
16
17 "github.com/go-git/go-git/v5"
18@@ -447,10 +445,14 @@ ".",
19 )
20
21 cmd.Dir = g.path
22- cmd.Stdout = w
23+ cmd.Env = []string{
24+ // TODO: get this from header.
25+ "GIT_PROTOCOL=version=2",
26+ }
27
28- var buff bytes.Buffer
29- cmd.Stderr = &buff
30+ var errBuff bytes.Buffer
31+ cmd.Stderr = &errBuff
32+ cmd.Stdout = w
33
34 err := packLine(w, "# service=git-upload-pack\n")
35 if err != nil {
36@@ -464,7 +466,7 @@ }
37
38 err = cmd.Run()
39 if err != nil {
40- slog.Error("Error upload pack refs", "message", buff.String())
41+ slog.Error("Error upload pack refs", "message", errBuff.String())
42 return err
43 }
44 return nil
45@@ -478,19 +480,17 @@ "--stateless-rpc",
46 ".",
47 )
48 cmd.Dir = g.Path()
49- cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
50- var buff bytes.Buffer
51- cmd.Stderr = &buff
52- cmd.Stdin = r
53- cmd.Stdout = w
54-
55- if err := cmd.Start(); err != nil {
56- log.Printf("git: failed to start git-upload-pack: %s", err)
57- return err
58+ cmd.Env = []string{
59+ // TODO: get this from header.
60+ "GIT_PROTOCOL=version=2",
61 }
62+ var errBuff bytes.Buffer
63+ cmd.Stderr = &errBuff
64+ cmd.Stdout = w
65+ cmd.Stdin = r
66
67- if err := cmd.Wait(); err != nil {
68- log.Printf("git: failed to wait for git-upload-pack: %s", buff.String())
69+ if err := cmd.Run(); err != nil {
70+ slog.ErrorContext(ctx, "Git upload pack failed", "error", err, "message", errBuff.String())
71 return err
72 }
73
74@@ -694,8 +694,16 @@ r io.Reader
75 }
76
77 func (d *debugReader) Read(p []byte) (n int, err error) {
78- fmt.Printf("READ: %x\n", p)
79- return d.r.Read(p)
80+ r, err := d.r.Read(p)
81+ if err != nil {
82+ if errors.Is(io.EOF, err) {
83+ fmt.Printf("READ: EOF\n")
84+ }
85+ return r, err
86+ }
87+
88+ fmt.Printf("READ: %s\n", p[:r])
89+ return r, nil
90 }
91
92 type debugWriter struct {
93@@ -703,6 +711,6 @@ w io.Writer
94 }
95
96 func (d *debugWriter) Write(p []byte) (n int, err error) {
97- fmt.Printf("WRITE: %x\n", p)
98+ fmt.Printf("WRITE: %s\n", p)
99 return d.w.Write(p)
100 }
101diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go
102index 61765bba9771841dbf6d4987c3d75c8e84801522..e409ed719abfd178be266731832d7469075ef611 100644
103--- a/pkg/handler/git/handler.go
104+++ b/pkg/handler/git/handler.go
105@@ -141,7 +141,8 @@
106 reader := r.Body
107
108 if r.Header.Get("Content-Encoding") == "gzip" {
109- reader, err := gzip.NewReader(r.Body)
110+ var err error
111+ reader, err = gzip.NewReader(r.Body)
112 if err != nil {
113 return err
114 }