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.

authored by tjh.dev and committed by Tangled d67e7d07 31a506aa

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