all repos

mugit @ b883855

🐮 git server that your cow will love

mugit/internal/git/gitx/pack.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
gitx: refactor once again..., 3 months ago
1
package gitx
2
3
import (
4
	"context"
5
	"fmt"
6
	"io"
7
)
8
9
// InfoRefs executes git-upload-pack --advertise-refs for smart-HTTP discovery.
10
func InfoRefs(ctx context.Context, repoDir string, out io.Writer) error {
11
	if err := PackLine(out, "# service=git-upload-pack\n"); err != nil {
12
		return fmt.Errorf("write pack line: %w", err)
13
	}
14
15
	if err := PackFlush(out); err != nil {
16
		return fmt.Errorf("flush pack: %w", err)
17
	}
18
19
	if err := gitCmd(ctx, cmdOpts{
20
		RepoDir: repoDir,
21
		Cmd: []string{
22
			"-c", "uploadpack.allowFilter=true",
23
			"upload-pack", "--stateless-rpc", "--advertise-refs",
24
		},
25
		Stdout: out,
26
		Stderr: out, // TODO: Check if this is correct.
27
	}); err != nil {
28
		return fmt.Errorf("git-upload-pack: %w", err)
29
	}
30
	return nil
31
}
32
33
// UploadPack executes git-upload-pack for smart-HTTP git fetch/clone.
34
// StatelessRPC should be true in case it's used over http, and false for ssh.
35
func UploadPack(ctx context.Context, repoDir string, statelessRPC bool, in io.Reader, out io.Writer) error {
36
	cmd := []string{"-c", "uploadpack.allowFilter=true", "upload-pack"}
37
	if statelessRPC {
38
		cmd = append(cmd, "--stateless-rpc")
39
	}
40
41
	if err := gitCmd(ctx, cmdOpts{
42
		RepoDir: repoDir,
43
		Cmd:     cmd,
44
		Stdin:   in,
45
		Stdout:  out,
46
		Stderr:  out, // TODO: Check if this is correct.
47
	}); err != nil {
48
		return fmt.Errorf("git-upload-pack: %w", err)
49
	}
50
	return nil
51
}
52
53
// ReceivePack executes git-receive-pack for git push.
54
func ReceivePack(ctx context.Context, repoDir string, in io.Reader, out, errout io.Writer) error {
55
	if err := gitCmd(ctx, cmdOpts{
56
		RepoDir: repoDir,
57
		Cmd:     []string{"receive-pack"},
58
		Stdin:   in,
59
		Stdout:  out,
60
		Stderr:  errout,
61
	}); err != nil {
62
		return fmt.Errorf("git-receive-pack: %w", err)
63
	}
64
	return nil
65
}