@@ -21,28 +21,32 @@ func Parse(
21
21
) (<- chan string , <- chan * Downloads , <- chan * Package ) {
22
22
prefixChannel := make (chan string )
23
23
downloadsChannel := make (chan * Downloads )
24
+ downloadsFailureReason := make (chan string )
24
25
packagesChannel := make (chan * Package )
25
- go parse (evts , prefixChannel , downloadsChannel , packagesChannel )
26
+ go parse (evts , prefixChannel , downloadsChannel , downloadsFailureReason , packagesChannel )
26
27
return prefixChannel , downloadsChannel , packagesChannel
27
28
}
28
29
29
30
var downloadErrors = []* regexp.Regexp {
30
31
regexp .MustCompile (`no required module provides package (?P<package>[^\s]+);` ),
32
+ regexp .MustCompile (`updates to go.mod needed; to update it:` ),
31
33
}
32
34
33
35
func parse (
34
36
evts <- chan tokenizer.Event ,
35
37
prefixChannel chan string ,
36
38
downloadsChannel chan * Downloads ,
39
+ downloadsFailureReason chan string ,
37
40
packagesChannel chan * Package ,
38
41
) {
39
42
outputStarted := false
40
43
downloadTracker := & downloadsTracker {
41
- prefixChannel : prefixChannel ,
42
- downloadResultsList : nil ,
43
- downloadsByPackage : map [string ]* Download {},
44
- downloadsFinished : false ,
45
- target : downloadsChannel ,
44
+ prefixChannel : prefixChannel ,
45
+ downloadResultsList : nil ,
46
+ downloadsByPackage : map [string ]* Download {},
47
+ downloadsFinished : false ,
48
+ downloadsFailureReason : downloadsFailureReason ,
49
+ target : downloadsChannel ,
46
50
}
47
51
pkgTracker := & packageTracker {
48
52
packagesByName : map [string ]* Package {},
@@ -131,17 +135,26 @@ func parse(
131
135
foundDLError := false
132
136
for _ , dlError := range downloadErrors {
133
137
if submatch := dlError .FindSubmatch (evt .Output ); len (submatch ) > 0 {
134
- pkgName := string (submatch [1 ])
135
- downloadTracker .SetDownloadFailed (pkgName , "" )
136
- downloadTracker .AddReason (pkgName , evt .Output )
137
- prevErroredDownload = pkgName
138
+ if len (submatch ) > 1 {
139
+ pkgName := string (submatch [1 ])
140
+ downloadTracker .SetDownloadFailed (pkgName , "" )
141
+ downloadTracker .AddReason (pkgName , evt .Output )
142
+ prevErroredDownload = pkgName
143
+ } else {
144
+ downloadTracker .SetFailureReason (submatch [0 ])
145
+ prevErroredDownload = "*"
146
+ }
138
147
foundDLError = true
139
148
outputStarted = true
140
149
}
141
150
}
142
151
if ! foundDLError {
143
152
if prevErroredDownload != "" {
144
- downloadTracker .AddReason (prevErroredDownload , evt .Output )
153
+ if prevErroredDownload == "*" {
154
+ downloadTracker .SetFailureReason (evt .Output )
155
+ } else {
156
+ downloadTracker .AddReason (prevErroredDownload , evt .Output )
157
+ }
145
158
} else if prevErroredPkg != "" {
146
159
pkgTracker .AddOutput (prevErroredPkg , "" , evt .Output )
147
160
} else if ! outputStarted {
@@ -341,14 +354,16 @@ func compareTestCaseNames(name1 string, name2 string) bool {
341
354
}
342
355
343
356
type downloadsTracker struct {
344
- downloadResultsList []* Download
345
- downloadsByPackage map [string ]* Download
346
- downloadsFinished bool
347
- lastDownload * Download
348
- target chan * Downloads
349
- prefixChannel chan string
350
- startTime * time.Time
351
- endTime * time.Time
357
+ downloadResultsList []* Download
358
+ downloadsByPackage map [string ]* Download
359
+ downloadsFinished bool
360
+ lastDownload * Download
361
+ target chan * Downloads
362
+ prefixChannel chan string
363
+ startTime * time.Time
364
+ endTime * time.Time
365
+ downloadsFailureReason chan string
366
+ failureReason []byte
352
367
}
353
368
354
369
func (d * downloadsTracker ) Add (name string , version string ) {
@@ -379,11 +394,15 @@ func (d *downloadsTracker) Write() {
379
394
}
380
395
dl .Reason = strings .TrimRight (dl .Reason , "\n " )
381
396
}
397
+ if len (d .failureReason ) > 0 {
398
+ failed = true
399
+ }
382
400
d .target <- & Downloads {
383
401
Packages : d .downloadResultsList ,
384
402
Failed : failed ,
385
403
StartTime : d .startTime ,
386
404
EndTime : d .endTime ,
405
+ Reason : strings .TrimSpace (string (d .failureReason )),
387
406
}
388
407
d .downloadsFinished = true
389
408
d .downloadResultsList = nil
@@ -424,3 +443,10 @@ func (d *downloadsTracker) AddReason(name string, output []byte) {
424
443
pkg := d .ensurePackage (name )
425
444
pkg .Reason = pkg .Reason + string (output ) + "\n "
426
445
}
446
+
447
+ func (d * downloadsTracker ) SetFailureReason (output []byte ) {
448
+ if d .downloadsFinished {
449
+ panic (fmt .Errorf ("tried to add download failure reason after downloads are already finished" ))
450
+ }
451
+ d .failureReason = append (append (d .failureReason , output ... ), '\n' )
452
+ }
0 commit comments