]> Cypherpunks.ru repositories - goredo.git/blobdiff - ood.go
More general Inode information tracking, explicit size check
[goredo.git] / ood.go
diff --git a/ood.go b/ood.go
index 7f2adde90a24a12f09c090e54a654ba0e5b2cfe8..e75dd43c4f7185dd17b7047d326414a6af9b89cd 100644 (file)
--- a/ood.go
+++ b/ood.go
@@ -109,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))
@@ -127,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 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}