diff options
-rw-r--r-- | pkg/git/git.go | 48 | ||||
-rw-r--r-- | pkg/handler/git/handler.go | 3 |
2 files changed, 30 insertions, 21 deletions
diff --git a/pkg/git/git.go b/pkg/git/git.go index 95355f3..83f3f93 100644 --- a/pkg/git/git.go +++ b/pkg/git/git.go @@ -8,12 +8,10 @@ import ( "fmt" "io" "io/fs" - "log" "log/slog" "os/exec" "path" "sort" - "syscall" "time" "github.com/go-git/go-git/v5" @@ -447,10 +445,14 @@ func (g *GitRepository) WriteInfoRefs(ctx context.Context, w io.Writer) error { ) cmd.Dir = g.path - cmd.Stdout = w + cmd.Env = []string{ + // TODO: get this from header. + "GIT_PROTOCOL=version=2", + } - var buff bytes.Buffer - cmd.Stderr = &buff + var errBuff bytes.Buffer + cmd.Stderr = &errBuff + cmd.Stdout = w err := packLine(w, "# service=git-upload-pack\n") if err != nil { @@ -464,7 +466,7 @@ func (g *GitRepository) WriteInfoRefs(ctx context.Context, w io.Writer) error { err = cmd.Run() if err != nil { - slog.Error("Error upload pack refs", "message", buff.String()) + slog.Error("Error upload pack refs", "message", errBuff.String()) return err } return nil @@ -478,19 +480,17 @@ func (g *GitRepository) WriteUploadPack(ctx context.Context, r io.Reader, w io.W ".", ) cmd.Dir = g.Path() - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - var buff bytes.Buffer - cmd.Stderr = &buff - cmd.Stdin = r - cmd.Stdout = w - - if err := cmd.Start(); err != nil { - log.Printf("git: failed to start git-upload-pack: %s", err) - return err + cmd.Env = []string{ + // TODO: get this from header. + "GIT_PROTOCOL=version=2", } + var errBuff bytes.Buffer + cmd.Stderr = &errBuff + cmd.Stdout = w + cmd.Stdin = r - if err := cmd.Wait(); err != nil { - log.Printf("git: failed to wait for git-upload-pack: %s", buff.String()) + if err := cmd.Run(); err != nil { + slog.ErrorContext(ctx, "Git upload pack failed", "error", err, "message", errBuff.String()) return err } @@ -694,8 +694,16 @@ type debugReader struct { } func (d *debugReader) Read(p []byte) (n int, err error) { - fmt.Printf("READ: %x\n", p) - return d.r.Read(p) + r, err := d.r.Read(p) + if err != nil { + if errors.Is(io.EOF, err) { + fmt.Printf("READ: EOF\n") + } + return r, err + } + + fmt.Printf("READ: %s\n", p[:r]) + return r, nil } type debugWriter struct { @@ -703,6 +711,6 @@ type debugWriter struct { } func (d *debugWriter) Write(p []byte) (n int, err error) { - fmt.Printf("WRITE: %x\n", p) + fmt.Printf("WRITE: %s\n", p) return d.w.Write(p) } diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go index 61765bb..e409ed7 100644 --- a/pkg/handler/git/handler.go +++ b/pkg/handler/git/handler.go @@ -141,7 +141,8 @@ func (g *GitHandler) Multiplex(w http.ResponseWriter, r *http.Request) error { reader := r.Body if r.Header.Get("Content-Encoding") == "gzip" { - reader, err := gzip.NewReader(r.Body) + var err error + reader, err = gzip.NewReader(r.Body) if err != nil { return err } |