X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=ood.go;h=912b6c61b4ce62c5e93ba9de78a3d17fd8283eff;hb=9e1cd5bf6c54ecad62b38a4f9eb2192e2924e46c;hp=95c3ed29958bd65c415b326c5e2ed1b62a3f4499;hpb=f8a8a335216a6ec9aa6119d473d2f6aeb43958ca;p=goredo.git diff --git a/ood.go b/ood.go index 95c3ed2..912b6c6 100644 --- a/ood.go +++ b/ood.go @@ -1,6 +1,6 @@ /* -goredo -- redo implementation on pure Go -Copyright (C) 2020 Sergey Matveev +goredo -- djb's redo implementation on pure Go +Copyright (C) 2020-2021 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 @@ -68,6 +68,9 @@ func isSrc(cwd, tgt string) bool { if _, err := os.Stat(path.Join(d, f)); err != nil { return false } + if _, err := os.Stat(path.Join(d, f+".do")); err == nil { + return false + } if _, err := os.Stat(path.Join(d, RedoDir, f+DepSuffix)); err == nil { return false } @@ -106,11 +109,14 @@ func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, erro for _, m := range depInfo.ifchanges { dep := m["Target"] - theirTs := m["Ctime"] - theirHsh := m["Hash"] - if dep == "" || theirTs == "" { - return ood, TgtErr{tgtOrig, errors.New("invalid format of .dep")} + if dep == "" { + return ood, TgtErr{tgtOrig, errors.New("invalid format of .dep: missing Target")} + } + theirInode, err := inodeFromRec(m) + if err != nil { + return ood, TgtErr{tgtOrig, fmt.Errorf("invalid format of .dep: %v", err)} } + theirHsh := m["Hash"] trace(CDebug, "ood: %s%s -> %s: checking", indent, tgtOrig, dep) fd, err := os.Open(path.Join(cwd, dep)) @@ -124,14 +130,19 @@ func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, erro } defer fd.Close() - ts, err := fileCtime(fd) + inode, err := inodeFromFile(fd) if err != nil { return ood, TgtErr{tgtOrig, err} } - if theirTs == ts { - trace(CDebug, "ood: %s%s -> %s: same ctime", indent, tgtOrig, dep) + if inode.Size != theirInode.Size { + trace(CDebug, "ood: %s%s -> %s: size differs", indent, tgtOrig, dep) + ood = true + goto Done + } + if InodeTrust && inode.Equals(theirInode) { + trace(CDebug, "ood: %s%s -> %s: same inode", indent, tgtOrig, dep) } else { - trace(CDebug, "ood: %s%s -> %s: ctime differs", indent, tgtOrig, dep) + trace(CDebug, "ood: %s%s -> %s: inode differs", indent, tgtOrig, dep) hsh, err := fileHash(fd) if err != nil { return ood, TgtErr{tgtOrig, err}