package main
import (
+ "log"
"os"
"path"
"path/filepath"
- "strings"
)
-func sourcesWalker() ([]string, error) {
- tgts, err := targetsWalker(Cwd)
- if err != nil {
- return nil, err
- }
- srcs := make(map[string]struct{}, 1<<10)
+func sourcesWalker(tgts []string) ([]string, error) {
+ seen := make(map[string]struct{}, 1<<10)
for _, tgt := range tgts {
- cwd, f := path.Split(tgt)
+ tgtAbsPath, err := filepath.Abs(path.Join(Cwd, tgt))
+ if err != nil {
+ panic(err)
+ }
+ cwd, f := path.Split(path.Join(Cwd, tgt))
fdDep, err := os.Open(path.Join(cwd, RedoDir, f+DepSuffix))
if err != nil {
+ if os.IsNotExist(err) {
+ continue
+ }
return nil, err
}
depInfo, err := depRead(fdDep)
+ if err != nil {
+ return nil, err
+ }
fdDep.Close()
for _, m := range depInfo.ifchanges {
- tgt = m["Target"]
- if !strings.HasSuffix(tgt, ".do") && isSrc(cwd, tgt) {
- pth, err := filepath.Abs(path.Join(cwd, tgt))
+ depTgt := m["Target"]
+ depTgtAbsPath, err := filepath.Abs(path.Join(cwd, depTgt))
+ if err != nil {
+ panic(err)
+ }
+ if isSrc(cwd, depTgt) {
+ seen[cwdMustRel(depTgtAbsPath)] = struct{}{}
+ } else if depTgtAbsPath != tgtAbsPath {
+ subSrcs, err := sourcesWalker([]string{cwdMustRel(depTgtAbsPath)})
if err != nil {
- panic(err)
+ log.Fatalln(err)
+ }
+ for _, p := range subSrcs {
+ seen[p] = struct{}{}
}
- srcs[cwdMustRel(pth)] = struct{}{}
}
}
}
- tgts = make([]string, 0, len(srcs))
- for tgt := range srcs {
- tgts = append(tgts, tgt)
+ srcs := make([]string, 0, len(seen))
+ for p := range seen {
+ srcs = append(srcs, p)
}
- return tgts, nil
+ return srcs, nil
}