Skip to content

Commit 87261f3

Browse files
brechtvllunny
andauthored
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 <[email protected]>
1 parent 4dd7d61 commit 87261f3

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed

modules/git/blame.go

+17-14
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ type BlamePart struct {
2020

2121
// BlameReader returns part of file blame one by one
2222
type BlameReader struct {
23-
cmd *Command
24-
output io.WriteCloser
25-
reader io.ReadCloser
26-
done chan error
27-
lastSha *string
23+
cmd *Command
24+
output io.WriteCloser
25+
reader io.ReadCloser
26+
bufferedReader *bufio.Reader
27+
done chan error
28+
lastSha *string
2829
}
2930

3031
var shaLineRegex = regexp.MustCompile("^([a-z0-9]{40})")
@@ -33,8 +34,6 @@ var shaLineRegex = regexp.MustCompile("^([a-z0-9]{40})")
3334
func (r *BlameReader) NextPart() (*BlamePart, error) {
3435
var blamePart *BlamePart
3536

36-
reader := bufio.NewReader(r.reader)
37-
3837
if r.lastSha != nil {
3938
blamePart = &BlamePart{*r.lastSha, make([]string, 0)}
4039
}
@@ -44,7 +43,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
4443
var err error
4544

4645
for err != io.EOF {
47-
line, isPrefix, err = reader.ReadLine()
46+
line, isPrefix, err = r.bufferedReader.ReadLine()
4847
if err != nil && err != io.EOF {
4948
return blamePart, err
5049
}
@@ -66,7 +65,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
6665
r.lastSha = &sha1
6766
// need to munch to end of line...
6867
for isPrefix {
69-
_, isPrefix, err = reader.ReadLine()
68+
_, isPrefix, err = r.bufferedReader.ReadLine()
7069
if err != nil && err != io.EOF {
7170
return blamePart, err
7271
}
@@ -81,7 +80,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
8180

8281
// need to munch to end of line...
8382
for isPrefix {
84-
_, isPrefix, err = reader.ReadLine()
83+
_, isPrefix, err = r.bufferedReader.ReadLine()
8584
if err != nil && err != io.EOF {
8685
return blamePart, err
8786
}
@@ -96,6 +95,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
9695
// Close BlameReader - don't run NextPart after invoking that
9796
func (r *BlameReader) Close() error {
9897
err := <-r.done
98+
r.bufferedReader = nil
9999
_ = r.reader.Close()
100100
_ = r.output.Close()
101101
return err
@@ -126,10 +126,13 @@ func CreateBlameReader(ctx context.Context, repoPath, commitID, file string) (*B
126126
done <- err
127127
}(cmd, repoPath, stdout, done)
128128

129+
bufferedReader := bufio.NewReader(reader)
130+
129131
return &BlameReader{
130-
cmd: cmd,
131-
output: stdout,
132-
reader: reader,
133-
done: done,
132+
cmd: cmd,
133+
output: stdout,
134+
reader: reader,
135+
bufferedReader: bufferedReader,
136+
done: done,
134137
}, nil
135138
}

modules/git/blame_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func TestReadingBlameOutput(t *testing.T) {
2828
},
2929
{
3030
"f32b0a9dfd09a60f616f29158f772cedd89942d2",
31-
[]string{},
31+
[]string{"", "Do not make any changes to this repo it is used for unit testing"},
3232
},
3333
}
3434

0 commit comments

Comments
 (0)