func FilterModuleFiles()

in gomod/diff.go [12:63]


func FilterModuleFiles(module *ModuleTreeNode, files []string) ([]string, error) {
	type modDir struct {
		filepaths []string
		relevant  bool
	}
	dirCache := map[string]modDir{}

	// Iterate through all files, building up a cache of files that are
	// relevant. Filtering out directories that are not relevant to the current
	// module.
	for _, filepathName := range files {
		dir, fileName := filepath.Split(filepathName)
		dir = filepath.Clean(dir)

		// Only consider Go file or module files as relevant.
		if !(IsGoSource(fileName) || IsGoMod(fileName)) {
			continue
		}

		// Only need to consider paths for files that are relevant.
		if v, ok := dirCache[dir]; ok {
			if !v.relevant {
				continue
			}

			v.filepaths = append(v.filepaths, filepathName)
			dirCache[dir] = v
			continue
		}

		if !module.ParentOf(dir) {
			dirCache[dir] = modDir{}
			continue
		}

		dirCache[dir] = modDir{
			relevant:  true,
			filepaths: []string{filepathName},
		}
	}

	var relevantFiles []string
	for _, dir := range dirCache {
		if !dir.relevant {
			continue
		}
		relevantFiles = append(relevantFiles, dir.filepaths...)
	}

	sort.Strings(relevantFiles)
	return relevantFiles, nil
}