aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pkg/git/git.go48
-rw-r--r--pkg/handler/git/handler.go3
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
}