]> Cypherpunks.ru repositories - goredo.git/blobdiff - ood.go
Download link for 1.2.0 release
[goredo.git] / ood.go
diff --git a/ood.go b/ood.go
index 5edac297178e314ccceec81380fbbeddeb8350fd..0552e2016112a46b037976dbfc88f26adf677b2a 100644 (file)
--- a/ood.go
+++ b/ood.go
@@ -1,6 +1,6 @@
 /*
-goredo -- redo implementation on pure Go
-Copyright (C) 2020 Sergey Matveev <stargrave@stargrave.org>
+goredo -- djb's redo implementation on pure Go
+Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
 
 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
@@ -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 .rec: missing Target")}
+               }
+               theirInode, err := inodeFromRec(m)
+               if err != nil {
+                       return ood, TgtErr{tgtOrig, fmt.Errorf("invalid format of .rec: %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 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}