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
}