in tools/go-agent/cmd/injector.go [215:254]
func (i *projectInjector) findProjects(currentDir string, all bool) ([]*projectWithMainDirectory, error) {
result := make([]*projectWithMainDirectory, 0)
stack := make([]*projectWithMainDirectory, 0)
currentStackPrefix := ""
err := filepath.WalkDir(currentDir, func(path string, d fs.DirEntry, err error) error {
if !d.IsDir() {
return nil
}
if strings.HasPrefix(filepath.Base(path), ".") {
return filepath.SkipDir
}
if currentStackPrefix != "" && !strings.HasPrefix(path, currentStackPrefix) {
stack = stack[:len(stack)-1]
currentStackPrefix = stack[len(stack)-1].ProjectPath
}
if f, e := os.Stat(filepath.Join(path, goModFileName)); e == nil && f != nil {
if len(stack) > 0 && !all {
return filepath.SkipDir
}
info := &projectWithMainDirectory{
ProjectPath: path,
}
result = append(result, info)
stack = append(stack, info)
currentStackPrefix = path
}
if mainPackage, e := i.containsMainPackageInCurrentDirectory(path); e != nil {
return err
} else if mainPackage {
currentModule := stack[len(stack)-1]
currentModule.MainPackageDirs = append(currentModule.MainPackageDirs, path)
}
return nil
})
if err != nil {
return nil, err
}
return result, nil
}