Skip to content

Commit

Permalink
Close stdout correctly for "git blame" (#26470) (#26473)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
GiteaBot and wxiaoguang authored Aug 13, 2023
1 parent 80d7288 commit fe1b11b
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions modules/git/blame.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit fe1b11b

Please sign in to comment.