/*
goredo -- djb's redo implementation on pure Go
-Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2020-2023 Sergey Matveev <stargrave@stargrave.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
defer dir.Close()
for {
- fis, err := dir.Readdir(1 << 10)
+ entries, err := dir.ReadDir(1 << 10)
if err != nil {
if err == io.EOF {
break
}
return err
}
- for _, fi := range fis {
- if !fi.IsDir() {
+ for _, entry := range entries {
+ if !entry.IsDir() {
continue
}
- pth := path.Join(root, fi.Name())
- if fi.Name() == RedoDir {
+ pth := path.Join(root, entry.Name())
+ if entry.Name() == RedoDir {
redoDir, err := os.Open(pth)
if err != nil {
return err
}
- redoFis, err := redoDir.Readdir(0)
+ redoEntries, err := redoDir.ReadDir(0)
+ redoDir.Close()
if err != nil {
return err
}
- for _, redoFi := range redoFis {
- name := redoFi.Name()
+ for _, redoEntry := range redoEntries {
+ name := redoEntry.Name()
if strings.HasSuffix(name, DepSuffix) {
name = cwdMustRel(root, name)
tgts[name[:len(name)-len(DepSuffix)]] = struct{}{}
}
}
- redoDir.Close()
} else {
if err = targetsCollect(pth, tgts); err != nil {
return err
}
}
}
- return dir.Close()
+ return nil
}
func targetsWalker(tgts []string) ([]string, error) {
- tgtsMap := make(map[string]struct{}, 0)
+ tgtsMap := map[string]struct{}{}
for _, tgt := range tgts {
if err := targetsCollect(tgt, tgtsMap); err != nil {
return nil, err
}
return tgts, nil
}
+
+func collectWholeDeps(
+ tgts map[string]struct{},
+ deps map[string]map[string]struct{},
+ seen map[string]struct{},
+) {
+ for tgt := range tgts {
+ seen[tgt] = struct{}{}
+ collectWholeDeps(deps[tgt], deps, seen)
+ }
+}