+7
-5
knotserver/git.go
+7
-5
knotserver/git.go
···
31
}
32
33
cmd := service.ServiceCommand{
34
-
Dir: repoPath,
35
-
Stdout: w,
36
}
37
38
serviceName := r.URL.Query().Get("service")
···
81
d.l.Info("git: executing git-upload-pack", "handler", "UploadPack", "repo", repo)
82
83
cmd := service.ServiceCommand{
84
-
Dir: repo,
85
-
Stdout: w,
86
-
Stdin: bodyReader,
87
}
88
89
w.WriteHeader(http.StatusOK)
···
31
}
32
33
cmd := service.ServiceCommand{
34
+
GitProtocol: r.Header.Get("Git-Protocol"),
35
+
Dir: repoPath,
36
+
Stdout: w,
37
}
38
39
serviceName := r.URL.Query().Get("service")
···
82
d.l.Info("git: executing git-upload-pack", "handler", "UploadPack", "repo", repo)
83
84
cmd := service.ServiceCommand{
85
+
GitProtocol: r.Header.Get("Git-Protocol"),
86
+
Dir: repo,
87
+
Stdout: w,
88
+
Stdin: bodyReader,
89
}
90
91
w.WriteHeader(http.StatusOK)
+23
-14
knotserver/git/service/service.go
+23
-14
knotserver/git/service/service.go
···
15
// Mostly from charmbracelet/soft-serve and sosedoff/gitkit.
16
17
type ServiceCommand struct {
18
-
Dir string
19
-
Stdin io.Reader
20
-
Stdout http.ResponseWriter
21
}
22
23
func (c *ServiceCommand) InfoRefs() error {
24
cmd := exec.Command("git", []string{
25
"upload-pack",
26
"--stateless-rpc",
27
-
"--advertise-refs",
28
".",
29
}...)
30
-
31
cmd.Dir = c.Dir
32
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
33
stdoutPipe, _ := cmd.StdoutPipe()
···
38
return err
39
}
40
41
-
if err := packLine(c.Stdout, "# service=git-upload-pack\n"); err != nil {
42
-
log.Printf("git: failed to write pack line: %s", err)
43
-
return err
44
-
}
45
46
-
if err := packFlush(c.Stdout); err != nil {
47
-
log.Printf("git: failed to flush pack: %s", err)
48
-
return err
49
}
50
51
buf := bytes.Buffer{}
···
71
func (c *ServiceCommand) UploadPack() error {
72
var stderr bytes.Buffer
73
74
-
cmd := exec.Command("git", "-c", "uploadpack.allowFilter=true",
75
-
"upload-pack", "--stateless-rpc", ".")
76
cmd.Dir = c.Dir
77
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
78
79
stdoutPipe, err := cmd.StdoutPipe()
80
if err != nil {
···
15
// Mostly from charmbracelet/soft-serve and sosedoff/gitkit.
16
17
type ServiceCommand struct {
18
+
GitProtocol string
19
+
Dir string
20
+
Stdin io.Reader
21
+
Stdout http.ResponseWriter
22
}
23
24
func (c *ServiceCommand) InfoRefs() error {
25
cmd := exec.Command("git", []string{
26
"upload-pack",
27
"--stateless-rpc",
28
+
"--http-backend-info-refs",
29
".",
30
}...)
31
+
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
32
cmd.Dir = c.Dir
33
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
34
stdoutPipe, _ := cmd.StdoutPipe()
···
39
return err
40
}
41
42
+
if !strings.Contains(c.GitProtocol, "version=2") {
43
+
if err := packLine(c.Stdout, "# service=git-upload-pack\n"); err != nil {
44
+
log.Printf("git: failed to write pack line: %s", err)
45
+
return err
46
+
}
47
48
+
if err := packFlush(c.Stdout); err != nil {
49
+
log.Printf("git: failed to flush pack: %s", err)
50
+
return err
51
+
}
52
}
53
54
buf := bytes.Buffer{}
···
74
func (c *ServiceCommand) UploadPack() error {
75
var stderr bytes.Buffer
76
77
+
cmd := exec.Command("git", []string{
78
+
"-c", "uploadpack.allowFilter=true",
79
+
"upload-pack",
80
+
"--stateless-rpc",
81
+
".",
82
+
}...)
83
+
84
cmd.Dir = c.Dir
85
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
86
+
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
87
88
stdoutPipe, err := cmd.StdoutPipe()
89
if err != nil {