@@ -20,11 +20,12 @@ type BlamePart struct {
20
20
21
21
// BlameReader returns part of file blame one by one
22
22
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
28
29
}
29
30
30
31
var shaLineRegex = regexp .MustCompile ("^([a-z0-9]{40})" )
@@ -33,8 +34,6 @@ var shaLineRegex = regexp.MustCompile("^([a-z0-9]{40})")
33
34
func (r * BlameReader ) NextPart () (* BlamePart , error ) {
34
35
var blamePart * BlamePart
35
36
36
- reader := bufio .NewReader (r .reader )
37
-
38
37
if r .lastSha != nil {
39
38
blamePart = & BlamePart {* r .lastSha , make ([]string , 0 )}
40
39
}
@@ -44,7 +43,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
44
43
var err error
45
44
46
45
for err != io .EOF {
47
- line , isPrefix , err = reader .ReadLine ()
46
+ line , isPrefix , err = r . bufferedReader .ReadLine ()
48
47
if err != nil && err != io .EOF {
49
48
return blamePart , err
50
49
}
@@ -66,7 +65,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
66
65
r .lastSha = & sha1
67
66
// need to munch to end of line...
68
67
for isPrefix {
69
- _ , isPrefix , err = reader .ReadLine ()
68
+ _ , isPrefix , err = r . bufferedReader .ReadLine ()
70
69
if err != nil && err != io .EOF {
71
70
return blamePart , err
72
71
}
@@ -81,7 +80,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
81
80
82
81
// need to munch to end of line...
83
82
for isPrefix {
84
- _ , isPrefix , err = reader .ReadLine ()
83
+ _ , isPrefix , err = r . bufferedReader .ReadLine ()
85
84
if err != nil && err != io .EOF {
86
85
return blamePart , err
87
86
}
@@ -96,6 +95,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
96
95
// Close BlameReader - don't run NextPart after invoking that
97
96
func (r * BlameReader ) Close () error {
98
97
err := <- r .done
98
+ r .bufferedReader = nil
99
99
_ = r .reader .Close ()
100
100
_ = r .output .Close ()
101
101
return err
@@ -126,10 +126,13 @@ func CreateBlameReader(ctx context.Context, repoPath, commitID, file string) (*B
126
126
done <- err
127
127
}(cmd , repoPath , stdout , done )
128
128
129
+ bufferedReader := bufio .NewReader (reader )
130
+
129
131
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 ,
134
137
}, nil
135
138
}
0 commit comments