cerrado @ 90b2a890096ee9ab3ff84c57542b5220aa9ebe4c

fix: reader variable was being shadowed

Larger projects that trigger the client to go for gzip was erring. Gzip
reader was not setting a variable but rather creating a new one. That
led the "git-upload-pack" to received the compressed date rendering it
unable to read the packet lines.
  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 			}