/* goredo -- djb's redo implementation on pure Go Copyright (C) 2020-2023 Sergey Matveev 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 the Free Software Foundation, version 3 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ package main import ( "os" "path" ) func sourcesWalker( tgts []string, seen map[string]struct{}, seenDeps map[string]struct{}, srcs map[string]struct{}, ) error { for _, tgt := range tgts { tgtAbsPath := mustAbs(path.Join(Cwd, tgt)) cwd, f := path.Split(path.Join(Cwd, tgt)) depPath := path.Join(cwd, RedoDir, f+DepSuffix) if _, ok := seenDeps[depPath]; ok { continue } seenDeps[depPath] = struct{}{} fdDep, err := os.Open(depPath) if err != nil { if errors.Is(err, fs.ErrNotExist) { continue } return ErrLine(err) } depInfo, err := depRead(fdDep) fdDep.Close() if err != nil { return ErrLine(err) } for _, m := range depInfo.ifchanges { depTgt := m["Target"] depTgtAbsPath := mustAbs(path.Join(cwd, depTgt)) if _, ok := seen[depTgtAbsPath]; ok { continue } seen[depTgtAbsPath] = struct{}{} if isSrc(cwd, depTgt) { srcs[cwdMustRel(depTgtAbsPath)] = struct{}{} } else if depTgtAbsPath != tgtAbsPath { if err := sourcesWalker( []string{cwdMustRel(depTgtAbsPath)}, seen, seenDeps, srcs, ); err != nil { return err } } } } return nil }