3 files changed,
61 insertions(+),
53 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2026-02-17 23:13:44 +0200
Change ID:
zuxttzlqluzpmlmqoyllqnqswuqmlxtt
Parent:
19c8a5c
M
internal/git/gitx/archive.go
@@ -4,7 +4,6 @@ import (
"context" "fmt" "io" - "os/exec" "regexp" "strings" )@@ -15,23 +14,22 @@ if !isValidRef(ref) {
return fmt.Errorf("invalid ref: %s", ref) } - cmd := exec.CommandContext(ctx, "git", "archive", "--format=tar.gz", ref) - cmd.Dir = repoDir - cmd.Env = gitEnv - cmd.Stdout = out - cmd.Stderr = io.Discard - - if err := cmd.Run(); err != nil { + if err := gitCmd(ctx, cmdOpts{ + Cmd: []string{"archive", "--format=tar.gz", ref}, + RepoDir: repoDir, + Stdout: out, + }); err != nil { return fmt.Errorf("git archive %s: %w", ref, err) } return nil } +var isValidRefRe = regexp.MustCompile(`^[a-zA-Z0-9._/-]+$`) + func isValidRef(ref string) bool { if ref == "" || strings.Contains(ref, "..") { return false } - matched, _ := regexp.MatchString(`^[a-zA-Z0-9._/-]+$`, ref) - return matched + return isValidRefRe.MatchString(ref) }
M
internal/git/gitx/gitx.go
@@ -1,6 +1,33 @@
package gitx +import ( + "context" + "io" + "os/exec" + "syscall" +) + var gitEnv = []string{ "GIT_CONFIG_GLOBAL=/dev/null", "GIT_CONFIG_SYSTEM=/dev/null", } + +type cmdOpts struct { + Cmd []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.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + cmd.Stdin = opts.Stdin + cmd.Stdout = opts.Stdout + cmd.Stderr = opts.Stderr + return cmd.Run() +}
M
internal/git/gitx/pack.go
@@ -4,79 +4,62 @@ import (
"context" "fmt" "io" - "os/exec" - "syscall" ) // InfoRefs executes git-upload-pack --advertise-refs for smart-HTTP discovery. func InfoRefs(ctx context.Context, repoDir string, out io.Writer) error { - cmd := exec.CommandContext(ctx, "git", []string{ - "-c", "uploadpack.allowFilter=true", - "upload-pack", - "--stateless-rpc", - "--advertise-refs", - ".", - }...) - cmd.Dir = repoDir - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - cmd.Env = gitEnv - - cmd.Stdout = out - cmd.Stderr = out // TODO: Check if this is correct. - 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 := cmd.Run(); err != nil { + if err := gitCmd(ctx, cmdOpts{ + RepoDir: repoDir, + Cmd: []string{ + "-c", "uploadpack.allowFilter=true", + "upload-pack", "--stateless-rpc", "--advertise-refs", + }, + Stdout: out, + Stderr: out, // TODO: Check if this is correct. + }); err != nil { return fmt.Errorf("git-upload-pack: %w", err) } - return nil } // UploadPack executes git-upload-pack for smart-HTTP git fetch/clone. // StatelessRPC should be true in case it's used over http, and false for ssh. func UploadPack(ctx context.Context, repoDir string, statelessRPC bool, in io.Reader, out io.Writer) error { - args := []string{"-c", "uploadpack.allowFilter=true", "upload-pack"} + cmd := []string{"-c", "uploadpack.allowFilter=true", "upload-pack"} if statelessRPC { - args = append(args, "--stateless-rpc") + cmd = append(cmd, "--stateless-rpc") } - args = append(args, ".") - cmd := exec.CommandContext(ctx, "git", args...) - cmd.Dir = repoDir - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - cmd.Env = gitEnv - - cmd.Stdin = in - cmd.Stdout = out - cmd.Stderr = out // TODO: Check if this is correct. - - if err := cmd.Run(); err != nil { + if err := gitCmd(ctx, cmdOpts{ + RepoDir: repoDir, + Cmd: cmd, + Stdin: in, + Stdout: out, + Stderr: out, // TODO: Check if this is correct. + }); err != nil { return fmt.Errorf("git-upload-pack: %w", err) } - return nil } // ReceivePack executes git-receive-pack for git push. func ReceivePack(ctx context.Context, repoDir string, in io.Reader, out, errout io.Writer) error { - cmd := exec.CommandContext(ctx, "git", "receive-pack", ".") - cmd.Dir = repoDir - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - cmd.Env = gitEnv - - cmd.Stdin = in - cmd.Stdout = out - cmd.Stderr = errout - - if err := cmd.Run(); err != nil { + if err := gitCmd(ctx, cmdOpts{ + RepoDir: repoDir, + Cmd: []string{"receive-pack"}, + Stdin: in, + Stdout: out, + Stderr: errout, + }); err != nil { return fmt.Errorf("git-receive-pack: %w", err) } - return nil }