3 files changed,
24 insertions(+),
28 deletions(-)
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 }