3 files changed,
19 insertions(+),
14 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2026-03-02 14:58:03 +0200
Change ID:
qozwkkmwqtxkmszvpqvzyxnvnuooolxs
Parent:
91e70b7
M
internal/git/gitx/gitx.go
@@ -2,6 +2,7 @@ package gitx
import ( "context" + "fmt" "io" "os/exec" "syscall"@@ -13,18 +14,19 @@ "GIT_CONFIG_SYSTEM=/dev/null",
} type cmdOpts struct { - Cmd []string - RepoDir string - Stdin io.Reader - Stdout io.Writer - Stderr io.Writer + Cmd []string + GitProtocol string + RepoDir string + Stdin io.Reader + Stdout io.Writer + Stderr io.Writer } func gitCmd(ctx context.Context, opts cmdOpts) error { opts.Cmd = append(opts.Cmd, ".") cmd := exec.CommandContext(ctx, "git", opts.Cmd...) cmd.Dir = opts.RepoDir - cmd.Env = gitEnv + cmd.Env = append(gitEnv, fmt.Sprintf("GIT_PROTOCOL=%s", opts.GitProtocol)) cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} cmd.Stdin = opts.Stdin cmd.Stdout = opts.Stdout
M
internal/git/gitx/pack.go
@@ -4,16 +4,18 @@ import (
"context" "fmt" "io" + "strings" ) // InfoRefs executes git-upload-pack --advertise-refs for smart-HTTP discovery. -func InfoRefs(ctx context.Context, repoDir string, out io.Writer) error { - if err := PackLine(out, "# service=git-upload-pack\n"); err != nil { - return fmt.Errorf("write pack line: %w", err) - } - - if err := PackFlush(out); err != nil { - return fmt.Errorf("flush pack: %w", err) +func InfoRefs(ctx context.Context, repoDir, protocol string, out io.Writer) error { + if !strings.Contains(protocol, "version=2") { + if err := PackLine(out, "# service=git-upload-pack\n"); err != nil { + return fmt.Errorf("write pack line: %w", err) + } + if err := PackFlush(out); err != nil { + return fmt.Errorf("flush pack: %w", err) + } } if err := gitCmd(ctx, cmdOpts{
M
internal/handlers/git.go
@@ -19,6 +19,7 @@ return
} service := r.URL.Query().Get("service") + gitProtocol := r.Header.Get("Git-Protocol") switch service { case "git-upload-pack": w.Header().Set("Content-Type", "application/x-git-upload-pack-advertisement")@@ -26,7 +27,7 @@ w.Header().Set("Connection", "Keep-Alive")
w.Header().Set("Cache-Control", "no-cache, max-age=0, must-revalidate") w.WriteHeader(http.StatusOK) - if err := gitx.InfoRefs(r.Context(), path, w); err != nil { + if err := gitx.InfoRefs(r.Context(), path, gitProtocol, w); err != nil { h.gitError(w, http.StatusInternalServerError, err.Error()) slog.Error("git: info/refs", "err", err) return