@@ -15,54 +15,54 @@ const commitPrefix = "commit"
15
15
// Parse parses a patch with changes to one or more files. Any content before
16
16
// the first file is returned as the second value. If an error occurs while
17
17
// parsing, it returns all files parsed before the error.
18
- func Parse (r io.Reader ) ([] * File , string , error ) {
18
+ func Parse (r io.Reader ) (<- chan * File , error ) {
19
19
p := newParser (r )
20
+ out := make (chan * File )
20
21
21
22
if err := p .Next (); err != nil {
22
23
if err == io .EOF {
23
- return nil , "" , nil
24
+ return out , nil
24
25
}
25
- return nil , "" , err
26
+ return out , err
26
27
}
27
28
28
- var preamble string
29
- var files []* File
30
- var ph * PatchHeader
31
- for {
32
- file , pre , err := p .ParseNextFileHeader ()
33
- if err != nil {
34
- return files , preamble , err
35
- }
36
-
37
- if strings .Contains (pre , commitPrefix ) {
38
- ph , _ = ParsePatchHeader (pre )
39
- }
40
-
41
- if file == nil {
42
- break
43
- }
44
-
45
- for _ , fn := range []func (* File ) (int , error ){
46
- p .ParseTextFragments ,
47
- p .ParseBinaryFragments ,
48
- } {
49
- n , err := fn (file )
29
+ go func () {
30
+ ph := & PatchHeader {}
31
+ for {
32
+ file , pre , err := p .ParseNextFileHeader ()
50
33
if err != nil {
51
- return files , preamble , err
34
+ out <- file
35
+ return
52
36
}
53
- if n > 0 {
37
+
38
+ if strings .Contains (pre , commitPrefix ) {
39
+ ph , _ = ParsePatchHeader (pre )
40
+ }
41
+
42
+ if file == nil {
54
43
break
55
44
}
56
- }
57
45
58
- file .PatchHeader = ph
59
- if len (files ) == 0 {
60
- preamble = pre
46
+ for _ , fn := range []func (* File ) (int , error ){
47
+ p .ParseTextFragments ,
48
+ p .ParseBinaryFragments ,
49
+ } {
50
+ n , err := fn (file )
51
+ if err != nil {
52
+ return
53
+ }
54
+ if n > 0 {
55
+ break
56
+ }
57
+ }
58
+
59
+ file .PatchHeader = ph
60
+ out <- file
61
61
}
62
- files = append ( files , file )
63
- }
62
+ close ( out )
63
+ }()
64
64
65
- return files , preamble , nil
65
+ return out , nil
66
66
}
67
67
68
68
// TODO(bkeyes): consider exporting the parser type with configuration
0 commit comments