in scripts/genmod/main.go [46:110]
func main() {
flag.Parse()
if flag.NArg() != 1 {
flag.Usage()
os.Exit(2)
}
// Locate and parse all go.mod files.
root, err := filepath.Abs(flag.Arg(0))
if err != nil {
log.Fatal(err)
}
if resolved, err := os.Readlink(root); err == nil {
root = resolved
}
paths := strings.Split(*excludedPaths, ",")
modules := make(map[string]*GoMod) // by module path
if err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
for _, p := range paths {
dir := strings.TrimPrefix(path, root+"/")
if dir == p {
fmt.Fprintf(os.Stderr, "skipping %s\n", dir)
return filepath.SkipDir
}
}
if !info.IsDir() {
if info.Name() == "go.mod" {
gomod, err := readGoMod(path)
if err != nil {
return err
}
modules[gomod.Module.Path] = gomod
}
return nil
}
if name := info.Name(); name != root && strings.HasPrefix(name, ".") {
return filepath.SkipDir
}
return nil
}); err != nil {
log.Fatal(err)
}
seen := make(map[string]bool)
var modulePaths []string
for path := range modules {
toposort(path, modules, seen, &modulePaths)
}
for _, modpath := range modulePaths {
gomod := modules[modpath]
absdir, err := filepath.Abs(gomod.dir)
if err != nil {
log.Fatal(err)
}
fmt.Fprintf(os.Stderr, "# updating %s\n", gomod.Module.Path)
if err := updateModule(absdir, gomod, modules); err != nil {
log.Fatal(err)
}
}
}