@@ -937,16 +937,47 @@ func loadPackage(cfg *packages.Config, importPath string) (_ []*packages.Package
937
937
if err != nil {
938
938
return nil , err
939
939
}
940
+
941
+ if err := packageLoadingError (pkgs ); err != nil {
942
+ return nil , err
943
+ }
944
+
945
+ return pkgs , nil
946
+ }
947
+
948
+ // packageLoadingError returns an error summarizing packages.Package.Errors if there were any.
949
+ func packageLoadingError (pkgs []* packages.Package ) error {
950
+ pkgError := func (pkg * packages.Package ) error {
951
+ var msgs []string
952
+ for _ , err := range pkg .Errors {
953
+ msgs = append (msgs , err .Error ())
954
+ }
955
+ if len (msgs ) == 0 {
956
+ return nil
957
+ }
958
+ // Report a more helpful error message for the package if possible.
959
+ for _ , msg := range msgs {
960
+ // cgo failure?
961
+ if strings .Contains (msg , "could not import C (no metadata for C)" ) {
962
+ const url = `https://github.com/golang/vulndb/blob/master/doc/triage.md#vulnreport-cgo-failures`
963
+ return fmt .Errorf ("package %s has a cgo error (install relevant C packages? %s)\n errors:%s" , pkg .PkgPath , url , strings .Join (msgs , "\n " ))
964
+ }
965
+ }
966
+ return fmt .Errorf ("package %s had %d errors: %s" , pkg .PkgPath , len (msgs ), strings .Join (msgs , "\n " ))
967
+ }
968
+
969
+ var paths []string
940
970
var msgs []string
941
971
packages .Visit (pkgs , nil , func (pkg * packages.Package ) {
942
- for _ , err := range pkg .Errors {
972
+ if err := pkgError (pkg ); err != nil {
973
+ paths = append (paths , pkg .PkgPath )
943
974
msgs = append (msgs , err .Error ())
944
975
}
945
976
})
946
- if len (msgs ) > 0 {
947
- return nil , fmt . Errorf ( "packages.Visit: \n %s" , strings . Join ( msgs , " \n " ))
977
+ if len (msgs ) == 0 {
978
+ return nil // no errors
948
979
}
949
- return pkgs , nil
980
+ return fmt . Errorf ( "packages with errors: %s \n errors: \n %s" , strings . Join ( paths , " " ), strings . Join ( msgs , " \n " ))
950
981
}
951
982
952
983
func changeToTempDir () (cleanup func (), _ error ) {
0 commit comments