X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=ood.go;h=c455a3b01e22c3221f0b9a5eccc72db6b83996d0;hb=bf96757828d2ae663f5f54147c0e229f74fc9357;hp=cad1ce38f5f23f6beb1124749774a7d4111303ec;hpb=314f58ec690c7321535d6718e8d3a0ecb4cac019;p=goredo.git diff --git a/ood.go b/ood.go index cad1ce3..c455a3b 100644 --- a/ood.go +++ b/ood.go @@ -22,6 +22,8 @@ package main import ( "errors" "fmt" + "io" + "log" "os" "path" "path/filepath" @@ -88,6 +90,21 @@ func isSrc(cwd, tgt string) bool { return true } +func isOODByBuildUUID(cwd, tgtOrig string) bool { + cwd, tgt := cwdAndTgt(path.Join(cwd, tgtOrig)) + depPath := path.Join(cwd, RedoDir, tgt+DepSuffix) + fdDep, err := os.Open(depPath) + if err != nil { + return true + } + depInfo, err := depRead(fdDep) + fdDep.Close() + if err != nil || depInfo.build != BuildUUID { + return true + } + return false +} + func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, error) { indent := strings.Repeat(". ", level) trace(CDebug, "ood: %s%s checking", indent, tgtOrig) @@ -108,6 +125,10 @@ func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, erro trace(CDebug, "ood: %s%s -> already built", indent, tgtOrig) return false, nil } + if _, err := os.Stat(path.Join(cwd, tgt)); err != nil && os.IsNotExist(err) { + trace(CDebug, "ood: %s%s -> non-existent", indent, tgtOrig) + return true, nil + } ood := false for _, dep := range depInfo.ifcreates { @@ -125,7 +146,7 @@ func isOOD(cwd, tgtOrig string, level int, seen map[string]struct{}) (bool, erro } theirInode, err := inodeFromRec(m) if err != nil { - return ood, TgtErr{tgtOrig, fmt.Errorf("invalid format of .rec: %v", err)} + return ood, TgtErr{tgtOrig, fmt.Errorf("invalid format of .rec: %w", err)} } theirHsh := m["Hash"] trace(CDebug, "ood: %s%s -> %s: checking", indent, tgtOrig, dep) @@ -209,6 +230,14 @@ func isOODWithTrace( } _, ood := OODTgts[p] if ood { + if !isOODByBuildUUID(cwd, tgtOrig) { + trace( + CDebug, + "ood: %s%s -> already built", + strings.Repeat(". ", level), tgtOrig, + ) + return false, nil + } trace( CDebug, "ood: %s%s true, external decision", @@ -222,13 +251,13 @@ func isOODWithTrace( } RecordOODTgt: if err = unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_EX); err != nil { - panic(err) + log.Fatalln(err) } - if _, err = FdOODTgts.Seek(0, os.SEEK_END); err != nil { - panic(err) + if _, err = FdOODTgts.Seek(0, io.SeekEnd); err != nil { + log.Fatalln(err) } if _, err := FdOODTgts.WriteString(p + "\x00"); err != nil { - panic(err) + log.Fatalln(err) } unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_UN) return true, nil @@ -236,10 +265,10 @@ RecordOODTgt: func oodTgtsClear() { if err := unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_EX); err != nil { - panic(err) + log.Fatalln(err) } if err := FdOODTgts.Truncate(0); err != nil { - panic(err) + log.Fatalln(err) } unix.Flock(int(FdOODTgtsLock.Fd()), unix.LOCK_UN) }