Browse Source

Close stdout correctly for "git blame" (#26470) (#26473)

Backport #26470 by @wxiaoguang

Close stdout correctly for "git blame", otherwise the failed "git blame"
would cause the request hanging forever.

And "os.Stderr" should never (seldom) be used as git command's stderr
(there seems some similar problems in code, they could be fixed later).

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
tags/v1.20.3
Giteabot 10 months ago
parent
commit
fe1b11b639
No account linked to committer's email address
1 changed files with 12 additions and 5 deletions
  1. 12
    5
      modules/git/blame.go

+ 12
- 5
modules/git/blame.go View File

@@ -5,11 +5,14 @@ package git

import (
"bufio"
"bytes"
"context"
"fmt"
"io"
"os"
"regexp"

"code.gitea.io/gitea/modules/log"
)

// BlamePart represents block of blame - continuous lines with one sha
@@ -115,15 +118,19 @@ func CreateBlameReader(ctx context.Context, repoPath, commitID, file string) (*B
done := make(chan error, 1)

go func(cmd *Command, dir string, stdout io.WriteCloser, done chan error) {
if err := cmd.Run(&RunOpts{
stderr := bytes.Buffer{}
// TODO: it doesn't work for directories (the directories shouldn't be "blamed"), and the "err" should be returned by "Read" but not by "Close"
err := cmd.Run(&RunOpts{
UseContextTimeout: true,
Dir: dir,
Stdout: stdout,
Stderr: os.Stderr,
}); err == nil {
stdout.Close()
}
Stderr: &stderr,
})
done <- err
_ = stdout.Close()
if err != nil {
log.Error("Error running git blame (dir: %v): %v, stderr: %v", repoPath, err, stderr.String())
}
}(cmd, repoPath, stdout, done)

bufferedReader := bufio.NewReader(reader)

Loading…
Cancel
Save