@@ -39,39 +39,50 @@ func List() (*utils.CmdOutput, error) {
3939 return utils .ExecuteCmd ("go" , "list" , "-json" , "./..." )
4040}
4141
42- // Packages parses the output of `go list -json ./...` and returns a slice of Package structs
42+ // Packages finds all packages in the repository
4343func Packages (repoPath string ) ([]Package , error ) {
44- cmd := exec .Command ("go" , "list" , "-json" , "./..." )
45- cmd .Dir = repoPath
46- out , err := cmd .CombinedOutput ()
47- if err != nil {
48- return nil , fmt .Errorf ("error getting packages: %w\n Output:\n %s" , err , string (out ))
49- }
50-
5144 var packages []Package
52- scanner := bufio .NewScanner (bytes .NewReader (out ))
53- var buffer bytes.Buffer
54-
55- for scanner .Scan () {
56- line := scanner .Text ()
57- line = strings .TrimSpace (line )
58- buffer .WriteString (line )
59-
60- if line == "}" {
61- var pkg Package
62- if err := json .Unmarshal (buffer .Bytes (), & pkg ); err != nil {
63- return nil , err
64- }
65- packages = append (packages , pkg )
66- buffer .Reset ()
45+
46+ // Find all go.mod files and run go list -json ./... in the directory of each go.mod file
47+ // This is necessary because go list -json ./... only returns packages that are associated with the current go.mod file
48+ err := filepath .Walk (repoPath , func (path string , info os.FileInfo , err error ) error {
49+ if err != nil {
50+ return err
6751 }
68- }
52+ if info .Name () == "go.mod" {
53+ cmd := exec .Command ("go" , "list" , "-json" , "./..." )
54+ cmd .Dir = filepath .Dir (path )
55+ out , err := cmd .CombinedOutput ()
56+ if err != nil {
57+ return fmt .Errorf ("error getting packages: %w\n Output:\n %s" , err , string (out ))
58+ }
59+ scanner := bufio .NewScanner (bytes .NewReader (out ))
60+ var buffer bytes.Buffer
61+
62+ for scanner .Scan () {
63+ line := scanner .Text ()
64+ line = strings .TrimSpace (line )
65+ buffer .WriteString (line )
66+
67+ if line == "}" {
68+ var pkg Package
69+ if err := json .Unmarshal (buffer .Bytes (), & pkg ); err != nil {
70+ return err
71+ }
72+ packages = append (packages , pkg )
73+ buffer .Reset ()
74+ }
75+ }
6976
70- if err := scanner .Err (); err != nil {
71- return nil , err
72- }
77+ if err := scanner .Err (); err != nil {
78+ return err
79+ }
80+ return nil
81+ }
82+ return nil
83+ })
7384
74- return packages , nil
85+ return packages , err
7586}
7687
7788func GetGoDepMap (packages []Package ) DepMap {
@@ -236,7 +247,7 @@ type SkipTest struct {
236247func SkipTests (repoPath string , testsToSkip []* SkipTest ) error {
237248 packages , err := Packages (repoPath )
238249 if err != nil {
239- return fmt . Errorf ( "error getting packages: %w" , err )
250+ return err
240251 }
241252
242253 for _ , testToSkip := range testsToSkip {
@@ -251,7 +262,7 @@ func SkipTests(repoPath string, testsToSkip []*SkipTest) error {
251262 }
252263 }
253264 if packageDir == "" {
254- return fmt .Errorf ("package %s not found" , packageDir )
265+ return fmt .Errorf ("directory for package '%s' not found" , packageImportPath )
255266 }
256267
257268 log .Debug ().
@@ -309,8 +320,12 @@ func SkipTests(repoPath string, testsToSkip []*SkipTest) error {
309320 },
310321 Args : []ast.Expr {
311322 & ast.BasicLit {
312- Kind : token .STRING ,
313- Value : "\" skipped by flakeguard\" " ,
323+ Kind : token .STRING ,
324+ Value : fmt .Sprintf (
325+ "Skipped by flakeguard: https://%s/issues/%s" ,
326+ os .Getenv ("JIRA_DOMAIN" ),
327+ testToSkip .JiraTicket ,
328+ ),
314329 },
315330 },
316331 },
0 commit comments