all repos

mugit @ fc51f8d

馃惍 git server that your cow will love
3 files changed, 24 insertions(+), 28 deletions(-)
git: improve ergonomics of method that is only used 4 times
Author: Oleksandr Smirnov olexsmir@gmail.com
Committed at: 2026-03-09 16:24:32 +0200
Authored at: 2026-03-08 13:54:45 +0200
Change ID: pyksluxwmvksptwyrkmoxszztzoxvqyk
Parent: 744dead
M internal/git/archive.go
路路路
        14
        14
         		return fmt.Errorf("invalid ref: %s", ref)

      
        15
        15
         	}

      
        16
        16
         

      
        17
        
        -	if err := gitCmd(ctx, cmdOpts{

      
        18
        
        -		Cmd:     []string{"archive", "--format=tar.gz", ref},

      
        19
        
        -		RepoDir: g.path,

      
        20
        
        -		Stdout:  out,

      
        
        17
        +	if err := g.gitCmd(ctx, cmdOpts{

      
        
        18
        +		Cmd:    []string{"archive", "--format=tar.gz", ref},

      
        
        19
        +		Stdout: out,

      
        21
        20
         	}); err != nil {

      
        22
        21
         		return fmt.Errorf("git archive %s: %w", ref, err)

      
        23
        22
         	}

      路路路
        26
        25
         }

      
        27
        26
         

      
        28
        27
         func (g *Repo) UploadArchive(ctx context.Context, in io.Reader, out io.Writer) error {

      
        29
        
        -	if err := gitCmd(ctx, cmdOpts{

      
        30
        
        -		Cmd:     []string{"upload-archive"},

      
        31
        
        -		RepoDir: g.path,

      
        32
        
        -		Stdin:   in,

      
        33
        
        -		Stdout:  out,

      
        34
        
        -		Stderr:  out,

      
        
        28
        +	if err := g.gitCmd(ctx, cmdOpts{

      
        
        29
        +		Cmd:    []string{"upload-archive"},

      
        
        30
        +		Stdin:  in,

      
        
        31
        +		Stdout: out,

      
        
        32
        +		Stderr: out,

      
        35
        33
         	}); err != nil {

      
        36
        34
         		return fmt.Errorf("git-upload-archive: %w", err)

      
        37
        35
         	}

      
M internal/git/external.go
路路路
        1
        1
         package git

      
        2
        2
         

      
        3
        3
         import (

      
        
        4
        +	"cmp"

      
        4
        5
         	"context"

      
        5
        6
         	"fmt"

      
        6
        7
         	"io"

      
        7
        8
         	"os/exec"

      
        
        9
        +	"strings"

      
        8
        10
         	"syscall"

      
        9
        11
         )

      
        10
        12
         

      路路路
        16
        18
         type cmdOpts struct {

      
        17
        19
         	Cmd         []string

      
        18
        20
         	GitProtocol string

      
        19
        
        -	RepoDir     string

      
        20
        21
         	Stdin       io.Reader

      
        21
        22
         	Stdout      io.Writer

      
        22
        23
         	Stderr      io.Writer

      
        23
        24
         }

      
        24
        25
         

      
        25
        
        -func gitCmd(ctx context.Context, opts cmdOpts) error {

      
        
        26
        +func (g *Repo) gitCmd(ctx context.Context, opts cmdOpts) error {

      
        26
        27
         	opts.Cmd = append(opts.Cmd, ".")

      
        27
        28
         	cmd := exec.CommandContext(ctx, "git", opts.Cmd...)

      
        28
        
        -	cmd.Dir = opts.RepoDir

      
        
        29
        +	cmd.Dir = g.path

      
        29
        30
         	cmd.Env = append(gitEnv, fmt.Sprintf("GIT_PROTOCOL=%s", opts.GitProtocol))

      
        30
        31
         	cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}

      
        31
        
        -	cmd.Stdin = opts.Stdin

      
        32
        
        -	cmd.Stdout = opts.Stdout

      
        33
        
        -	cmd.Stderr = opts.Stderr

      
        
        32
        +	cmd.Stdin = cmp.Or[io.Reader](opts.Stdin, strings.NewReader(""))

      
        
        33
        +	cmd.Stdout = cmp.Or(opts.Stdout, io.Discard)

      
        
        34
        +	cmd.Stderr = cmp.Or(opts.Stderr, io.Discard)

      
        34
        35
         	return cmd.Run()

      
        35
        36
         }

      
        36
        37
         

      
M internal/git/pack.go
路路路
        18
        18
         		}

      
        19
        19
         	}

      
        20
        20
         

      
        21
        
        -	if err := gitCmd(ctx, cmdOpts{

      
        
        21
        +	if err := g.gitCmd(ctx, cmdOpts{

      
        22
        22
         		GitProtocol: protocol,

      
        23
        23
         		Cmd: []string{

      
        24
        24
         			"-c", "uploadpack.allowFilter=true",

      
        25
        25
         			"upload-pack", "--stateless-rpc", "--advertise-refs",

      
        26
        26
         		},

      
        27
        
        -		RepoDir: g.path,

      
        28
        
        -		Stdout:  out,

      
        29
        
        -		Stderr:  out, // TODO: Check if this is correct.

      
        
        27
        +		Stdout: out,

      
        
        28
        +		Stderr: out, // TODO: Check if this is correct.

      
        30
        29
         	}); err != nil {

      
        31
        30
         		return fmt.Errorf("git-upload-pack: %w", err)

      
        32
        31
         	}

      路路路
        41
        40
         		cmd = append(cmd, "--stateless-rpc")

      
        42
        41
         	}

      
        43
        42
         

      
        44
        
        -	if err := gitCmd(ctx, cmdOpts{

      
        
        43
        +	if err := g.gitCmd(ctx, cmdOpts{

      
        45
        44
         		Cmd:         cmd,

      
        46
        45
         		GitProtocol: protocol,

      
        47
        
        -		RepoDir:     g.path,

      
        48
        46
         		Stdin:       in,

      
        49
        47
         		Stdout:      out,

      
        50
        48
         		Stderr:      out, // TODO: Check if this is correct.

      路路路
        56
        54
         

      
        57
        55
         // ReceivePack executes git-receive-pack for git push.

      
        58
        56
         func (g *Repo) ReceivePack(ctx context.Context, in io.Reader, out, errout io.Writer) error {

      
        59
        
        -	if err := gitCmd(ctx, cmdOpts{

      
        60
        
        -		RepoDir: g.path,

      
        61
        
        -		Cmd:     []string{"receive-pack"},

      
        62
        
        -		Stdin:   in,

      
        63
        
        -		Stdout:  out,

      
        64
        
        -		Stderr:  errout,

      
        
        57
        +	if err := g.gitCmd(ctx, cmdOpts{

      
        
        58
        +		Cmd:    []string{"receive-pack"},

      
        
        59
        +		Stdin:  in,

      
        
        60
        +		Stdout: out,

      
        
        61
        +		Stderr: errout,

      
        65
        62
         	}); err != nil {

      
        66
        63
         		return fmt.Errorf("git-receive-pack: %w", err)

      
        67
        64
         	}