Skip to content

Commit

Permalink
Close stdout correctly for "git blame" (go-gitea#26470)
Browse files Browse the repository at this point in the history
Close stdout correctly for "git blame", otherwise the failed "git blame"
would case the request hanging forever.

And "os.Stderr" should never (seldom) be used as git command's stderr
  • Loading branch information
wxiaoguang authored Aug 13, 2023
1 parent c28e29f commit 7018659
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 7018659

Please sign in to comment.