Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

knotserver: git/service: refactor execution of git service command

authored by

tjh and committed by
Tangled
afbdb8b2 6ec3a3d5

+54 -70
+54 -70
knotserver/git/service/service.go
··· 21 21 Stdout http.ResponseWriter 22 22 } 23 23 24 + func (c *ServiceCommand) RunService(cmd *exec.Cmd) error { 25 + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} 26 + cmd.Dir = c.Dir 27 + cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol)) 28 + 29 + var stderr bytes.Buffer 30 + cmd.Stderr = &stderr 31 + 32 + stdoutPipe, err := cmd.StdoutPipe() 33 + if err != nil { 34 + return fmt.Errorf("failed to create stdout pipe: %w", err) 35 + } 36 + 37 + stdinPipe, err := cmd.StdinPipe() 38 + if err != nil { 39 + return fmt.Errorf("failed to create stdin pipe: %w", err) 40 + } 41 + 42 + if err := cmd.Start(); err != nil { 43 + return fmt.Errorf("failed to start '%s': %w", cmd.String(), err) 44 + } 45 + 46 + var wg sync.WaitGroup 47 + 48 + if c.Stdin != nil { 49 + wg.Add(1) 50 + go func() { 51 + defer wg.Done() 52 + defer stdinPipe.Close() 53 + io.Copy(stdinPipe, c.Stdin) 54 + }() 55 + } 56 + 57 + if c.Stdout != nil { 58 + wg.Add(1) 59 + go func() { 60 + defer wg.Done() 61 + io.Copy(newWriteFlusher(c.Stdout), stdoutPipe) 62 + stdoutPipe.Close() 63 + }() 64 + } 65 + 66 + wg.Wait() 67 + 68 + if err := cmd.Wait(); err != nil { 69 + return fmt.Errorf("'%s' failed: %w, stderr: %s", cmd.String(), err, stderr.String()) 70 + } 71 + 72 + return nil 73 + } 74 + 24 75 func (c *ServiceCommand) InfoRefs() error { 25 76 cmd := exec.Command("git", []string{ 26 77 "upload-pack", ··· 79 28 "--http-backend-info-refs", 80 29 ".", 81 30 }...) 82 - cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol)) 83 - cmd.Dir = c.Dir 84 - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} 85 - stdoutPipe, _ := cmd.StdoutPipe() 86 - cmd.Stderr = cmd.Stdout 87 - 88 - if err := cmd.Start(); err != nil { 89 - log.Printf("git: failed to start git-upload-pack (info/refs): %s", err) 90 - return err 91 - } 92 31 93 32 if !strings.Contains(c.GitProtocol, "version=2") { 94 33 if err := packLine(c.Stdout, "# service=git-upload-pack\n"); err != nil { ··· 92 51 } 93 52 } 94 53 95 - buf := bytes.Buffer{} 96 - if _, err := io.Copy(&buf, stdoutPipe); err != nil { 97 - log.Printf("git: failed to copy stdout to tmp buffer: %s", err) 98 - return err 99 - } 100 - 101 - if err := cmd.Wait(); err != nil { 102 - out := strings.Builder{} 103 - _, _ = io.Copy(&out, &buf) 104 - log.Printf("git: failed to run git-upload-pack; err: %s; output: %s", err, out.String()) 105 - return err 106 - } 107 - 108 - if _, err := io.Copy(c.Stdout, &buf); err != nil { 109 - log.Printf("git: failed to copy stdout: %s", err) 110 - } 111 - 112 - return nil 54 + return c.RunService(cmd) 113 55 } 114 56 115 57 func (c *ServiceCommand) UploadPack() error { 116 - var stderr bytes.Buffer 117 - 118 58 cmd := exec.Command("git", []string{ 119 59 "-c", "uploadpack.allowFilter=true", 120 60 "upload-pack", ··· 103 81 ".", 104 82 }...) 105 83 106 - cmd.Dir = c.Dir 107 84 cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} 108 85 cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol)) 86 + cmd.Dir = c.Dir 109 87 110 - stdoutPipe, err := cmd.StdoutPipe() 111 - if err != nil { 112 - return fmt.Errorf("failed to create stdout pipe: %w", err) 113 - } 114 - 115 - cmd.Stderr = &stderr 116 - 117 - stdinPipe, err := cmd.StdinPipe() 118 - if err != nil { 119 - return fmt.Errorf("failed to create stdin pipe: %w", err) 120 - } 121 - 122 - if err := cmd.Start(); err != nil { 123 - return fmt.Errorf("failed to start git-upload-pack: %w", err) 124 - } 125 - 126 - var wg sync.WaitGroup 127 - 128 - wg.Add(1) 129 - go func() { 130 - defer wg.Done() 131 - defer stdinPipe.Close() 132 - io.Copy(stdinPipe, c.Stdin) 133 - }() 134 - 135 - wg.Add(1) 136 - go func() { 137 - defer wg.Done() 138 - io.Copy(newWriteFlusher(c.Stdout), stdoutPipe) 139 - stdoutPipe.Close() 140 - }() 141 - 142 - wg.Wait() 143 - 144 - if err := cmd.Wait(); err != nil { 145 - return fmt.Errorf("git-upload-pack failed: %w, stderr: %s", err, stderr.String()) 146 - } 147 - 148 - return nil 88 + return c.RunService(cmd) 149 89 } 150 90 151 91 func packLine(w io.Writer, s string) error {