···
Stdout http.ResponseWriter
func (c *ServiceCommand) InfoRefs() error {
cmd := exec.Command("git", []string{
···
"--http-backend-info-refs",
-
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
-
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
-
stdoutPipe, _ := cmd.StdoutPipe()
-
cmd.Stderr = cmd.Stdout
-
if err := cmd.Start(); err != nil {
-
log.Printf("git: failed to start git-upload-pack (info/refs): %s", err)
if !strings.Contains(c.GitProtocol, "version=2") {
if err := packLine(c.Stdout, "# service=git-upload-pack\n"); err != nil {
···
-
if _, err := io.Copy(&buf, stdoutPipe); err != nil {
-
log.Printf("git: failed to copy stdout to tmp buffer: %s", err)
-
if err := cmd.Wait(); err != nil {
-
out := strings.Builder{}
-
_, _ = io.Copy(&out, &buf)
-
log.Printf("git: failed to run git-upload-pack; err: %s; output: %s", err, out.String())
-
if _, err := io.Copy(c.Stdout, &buf); err != nil {
-
log.Printf("git: failed to copy stdout: %s", err)
func (c *ServiceCommand) UploadPack() error {
-
var stderr bytes.Buffer
cmd := exec.Command("git", []string{
"-c", "uploadpack.allowFilter=true",
···
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
-
stdoutPipe, err := cmd.StdoutPipe()
-
return fmt.Errorf("failed to create stdout pipe: %w", err)
-
stdinPipe, err := cmd.StdinPipe()
-
return fmt.Errorf("failed to create stdin pipe: %w", err)
-
if err := cmd.Start(); err != nil {
-
return fmt.Errorf("failed to start git-upload-pack: %w", err)
-
defer stdinPipe.Close()
-
io.Copy(stdinPipe, c.Stdin)
-
io.Copy(newWriteFlusher(c.Stdout), stdoutPipe)
-
if err := cmd.Wait(); err != nil {
-
return fmt.Errorf("git-upload-pack failed: %w, stderr: %s", err, stderr.String())
func packLine(w io.Writer, s string) error {
···
Stdout http.ResponseWriter
+
func (c *ServiceCommand) RunService(cmd *exec.Cmd) error {
+
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
+
var stderr bytes.Buffer
+
stdoutPipe, err := cmd.StdoutPipe()
+
return fmt.Errorf("failed to create stdout pipe: %w", err)
+
stdinPipe, err := cmd.StdinPipe()
+
return fmt.Errorf("failed to create stdin pipe: %w", err)
+
if err := cmd.Start(); err != nil {
+
return fmt.Errorf("failed to start '%s': %w", cmd.String(), err)
+
defer stdinPipe.Close()
+
io.Copy(stdinPipe, c.Stdin)
+
io.Copy(newWriteFlusher(c.Stdout), stdoutPipe)
+
if err := cmd.Wait(); err != nil {
+
return fmt.Errorf("'%s' failed: %w, stderr: %s", cmd.String(), err, stderr.String())
func (c *ServiceCommand) InfoRefs() error {
cmd := exec.Command("git", []string{
···
"--http-backend-info-refs",
if !strings.Contains(c.GitProtocol, "version=2") {
if err := packLine(c.Stdout, "# service=git-upload-pack\n"); err != nil {
···
+
return c.RunService(cmd)
func (c *ServiceCommand) UploadPack() error {
cmd := exec.Command("git", []string{
"-c", "uploadpack.allowFilter=true",
···
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
cmd.Env = append(cmd.Env, fmt.Sprintf("GIT_PROTOCOL=%s", c.GitProtocol))
+
return c.RunService(cmd)
func packLine(w io.Writer, s string) error {