func()

in tools/go-agent/cmd/injector.go [218:257]


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
}