aboutsummaryrefslogtreecommitdiffstats
path: root/modules/git
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2023-02-09 04:51:02 +0100
committerGitHub <noreply@github.com>2023-02-09 11:51:02 +0800
commit87261f3fb95da92d74d72d057fc0f1e9819f16a7 (patch)
treee30f70da44045d32da463fa5128d7e429ee1f294 /modules/git
parent4dd7d61ac8c8bff81a0f9e376032f45eb12f51a9 (diff)
downloadgitea-87261f3fb95da92d74d72d057fc0f1e9819f16a7.tar.gz
gitea-87261f3fb95da92d74d72d057fc0f1e9819f16a7.zip
Fix blame view missing lines (#22826)
Creating a new buffered reader for every part of the blame can miss lines, as it will read and buffer bytes that the next buffered reader will not get. Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Diffstat (limited to 'modules/git')
-rw-r--r--modules/git/blame.go31
-rw-r--r--modules/git/blame_test.go2
2 files changed, 18 insertions, 15 deletions
diff --git a/modules/git/blame.go b/modules/git/blame.go
index 3b6e4c95db..ec88accb10 100644
--- a/modules/git/blame.go
+++ b/modules/git/blame.go
@@ -20,11 +20,12 @@ type BlamePart struct {
// BlameReader returns part of file blame one by one
type BlameReader struct {
- cmd *Command
- output io.WriteCloser
- reader io.ReadCloser
- done chan error
- lastSha *string
+ cmd *Command
+ output io.WriteCloser
+ reader io.ReadCloser
+ bufferedReader *bufio.Reader
+ done chan error
+ lastSha *string
}
var shaLineRegex = regexp.MustCompile("^([a-z0-9]{40})")
@@ -33,8 +34,6 @@ var shaLineRegex = regexp.MustCompile("^([a-z0-9]{40})")
func (r *BlameReader) NextPart() (*BlamePart, error) {
var blamePart *BlamePart
- reader := bufio.NewReader(r.reader)
-
if r.lastSha != nil {
blamePart = &BlamePart{*r.lastSha, make([]string, 0)}
}
@@ -44,7 +43,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
var err error
for err != io.EOF {
- line, isPrefix, err = reader.ReadLine()
+ line, isPrefix, err = r.bufferedReader.ReadLine()
if err != nil && err != io.EOF {
return blamePart, err
}
@@ -66,7 +65,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
r.lastSha = &sha1
// need to munch to end of line...
for isPrefix {
- _, isPrefix, err = reader.ReadLine()
+ _, isPrefix, err = r.bufferedReader.ReadLine()
if err != nil && err != io.EOF {
return blamePart, err
}
@@ -81,7 +80,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
// need to munch to end of line...
for isPrefix {
- _, isPrefix, err = reader.ReadLine()
+ _, isPrefix, err = r.bufferedReader.ReadLine()
if err != nil && err != io.EOF {
return blamePart, err
}
@@ -96,6 +95,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
// Close BlameReader - don't run NextPart after invoking that
func (r *BlameReader) Close() error {
err := <-r.done
+ r.bufferedReader = nil
_ = r.reader.Close()
_ = r.output.Close()
return err
@@ -126,10 +126,13 @@ func CreateBlameReader(ctx context.Context, repoPath, commitID, file string) (*B
done <- err
}(cmd, repoPath, stdout, done)
+ bufferedReader := bufio.NewReader(reader)
+
return &BlameReader{
- cmd: cmd,
- output: stdout,
- reader: reader,
- done: done,
+ cmd: cmd,
+ output: stdout,
+ reader: reader,
+ bufferedReader: bufferedReader,
+ done: done,
}, nil
}
diff --git a/modules/git/blame_test.go b/modules/git/blame_test.go
index a2c8fe8e75..1c0cd5c4aa 100644
--- a/modules/git/blame_test.go
+++ b/modules/git/blame_test.go
@@ -28,7 +28,7 @@ func TestReadingBlameOutput(t *testing.T) {
},
{
"f32b0a9dfd09a60f616f29158f772cedd89942d2",
- []string{},
+ []string{"", "Do not make any changes to this repo it is used for unit testing"},
},
}