forked from tangled.org/core
this repo has no description

knotserver: git: add support for git protocol v2

v1-style requests are unaffected and v0 (dumb-protocol) requests remain
unsupported.

Changed files
+30 -19
knotserver
git
service
+7 -5
knotserver/git.go
···
}
cmd := service.ServiceCommand{
-
Dir: repoPath,
-
Stdout: w,
}
serviceName := r.URL.Query().Get("service")
···
d.l.Info("git: executing git-upload-pack", "handler", "UploadPack", "repo", repo)
cmd := service.ServiceCommand{
-
Dir: repo,
-
Stdout: w,
-
Stdin: bodyReader,
}
w.WriteHeader(http.StatusOK)
···
}
cmd := service.ServiceCommand{
+
GitProtocol: r.Header.Get("Git-Protocol"),
+
Dir: repoPath,
+
Stdout: w,
}
serviceName := r.URL.Query().Get("service")
···
d.l.Info("git: executing git-upload-pack", "handler", "UploadPack", "repo", repo)
cmd := service.ServiceCommand{
+
GitProtocol: r.Header.Get("Git-Protocol"),
+
Dir: repo,
+
Stdout: w,
+
Stdin: bodyReader,
}
w.WriteHeader(http.StatusOK)
+23 -14
knotserver/git/service/service.go
···
// Mostly from charmbracelet/soft-serve and sosedoff/gitkit.
type ServiceCommand struct {
-
Dir string
-
Stdin io.Reader
-
Stdout http.ResponseWriter
}
func (c *ServiceCommand) InfoRefs() error {
cmd := exec.Command("git", []string{
"upload-pack",
"--stateless-rpc",
-
"--advertise-refs",
".",
}...)
-
cmd.Dir = c.Dir
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
stdoutPipe, _ := cmd.StdoutPipe()
···
return err
}
-
if err := packLine(c.Stdout, "# service=git-upload-pack\n"); err != nil {
-
log.Printf("git: failed to write pack line: %s", err)
-
return err
-
}
-
if err := packFlush(c.Stdout); err != nil {
-
log.Printf("git: failed to flush pack: %s", err)
-
return err
}
buf := bytes.Buffer{}
···
func (c *ServiceCommand) UploadPack() error {
var stderr bytes.Buffer
-
cmd := exec.Command("git", "-c", "uploadpack.allowFilter=true",
-
"upload-pack", "--stateless-rpc", ".")
cmd.Dir = c.Dir
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
stdoutPipe, err := cmd.StdoutPipe()
if err != nil {
···
// Mostly from charmbracelet/soft-serve and sosedoff/gitkit.
type ServiceCommand struct {
+
GitProtocol string
+
Dir string
+
Stdin io.Reader
+
Stdout http.ResponseWriter
}
func (c *ServiceCommand) InfoRefs() error {
cmd := exec.Command("git", []string{
"upload-pack",
"--stateless-rpc",
+
"--http-backend-info-refs",
".",
}...)
+
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
cmd.Dir = c.Dir
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
stdoutPipe, _ := cmd.StdoutPipe()
···
return err
}
+
if !strings.Contains(c.GitProtocol, "version=2") {
+
if err := packLine(c.Stdout, "# service=git-upload-pack\n"); err != nil {
+
log.Printf("git: failed to write pack line: %s", err)
+
return err
+
}
+
if err := packFlush(c.Stdout); err != nil {
+
log.Printf("git: failed to flush pack: %s", err)
+
return err
+
}
}
buf := bytes.Buffer{}
···
func (c *ServiceCommand) UploadPack() error {
var stderr bytes.Buffer
+
cmd := exec.Command("git", []string{
+
"-c", "uploadpack.allowFilter=true",
+
"upload-pack",
+
"--stateless-rpc",
+
".",
+
}...)
+
cmd.Dir = c.Dir
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
stdoutPipe, err := cmd.StdoutPipe()
if err != nil {