all repos

mugit @ dc036ea3bf4fedd8fb3b4530070256fecc2d09be

🐮 git server that your cow will love
3 files changed, 19 insertions(+), 14 deletions(-)
git: use v2 protocol only when client asks for it
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