X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=sources.go;h=ebfbcb9d9133e2d5ffa1fd09fb299f8c8dfe6c95;hb=fe05b7986bf77bf30a9cdcf89d208013af5ed221;hp=e321c43b96ef5591596658162a373adc950b8885;hpb=609842c96d2bb25c509f3d2949fe26f60ec03a5f;p=goredo.git diff --git a/sources.go b/sources.go index e321c43..ebfbcb9 100644 --- a/sources.go +++ b/sources.go @@ -18,40 +18,54 @@ along with this program. If not, see . 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 }