]> Cypherpunks.ru repositories - goredo.git/blobdiff - run.go
cleanup -dry-run
[goredo.git] / run.go
diff --git a/run.go b/run.go
index aab8e9a5c7eb4b9d6d1b41acce7939b14681544a..2fed7cf10824b9ae19912c0b3bb5e56929b7dbf4 100644 (file)
--- a/run.go
+++ b/run.go
@@ -1,5 +1,5 @@
 /*
-goredo -- redo implementation on pure Go
+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
@@ -101,24 +101,24 @@ func mkdirs(pth string) error {
        return os.MkdirAll(pth, os.FileMode(0777))
 }
 
-func isModified(cwd, redoDir, tgt string) (bool, string, error) {
+func isModified(cwd, redoDir, tgt string) (bool, *Inode, error) {
        fdDep, err := os.Open(path.Join(redoDir, tgt+DepSuffix))
        if err != nil {
                if os.IsNotExist(err) {
-                       return false, "", nil
+                       return false, nil, nil
                }
-               return false, "", err
+               return false, nil, err
        }
        defer fdDep.Close()
        r := recfile.NewReader(fdDep)
-       var ourTs string
+       var ourInode *Inode
        for {
                m, err := r.NextMap()
                if err != nil {
                        if err == io.EOF {
                                break
                        }
-                       return false, "", err
+                       return false, nil, err
                }
                if m["Target"] != tgt {
                        continue
@@ -126,21 +126,25 @@ func isModified(cwd, redoDir, tgt string) (bool, string, error) {
                fd, err := os.Open(path.Join(cwd, tgt))
                if err != nil {
                        if os.IsNotExist(err) {
-                               return false, "", nil
+                               return false, nil, nil
                        }
-                       return false, "", err
+                       return false, nil, err
                }
-               defer fd.Close()
-               ourTs, err = fileCtime(fd)
+               ourInode, err = inodeFromFile(fd)
+               fd.Close()
                if err != nil {
-                       return false, "", err
+                       return false, nil, err
                }
-               if ourTs != m["Ctime"] {
-                       return true, ourTs, nil
+               theirInode, err := inodeFromRec(m)
+               if err != nil {
+                       return false, nil, err
+               }
+               if !ourInode.Equals(theirInode) {
+                       return true, ourInode, nil
                }
                break
        }
-       return false, ourTs, nil
+       return false, ourInode, nil
 }
 
 func syncDir(dir string) error {
@@ -222,7 +226,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
        }
 
        // Check if target is not modified externally
-       modified, tsPrev, err := isModified(cwd, redoDir, tgt)
+       modified, inodePrev, err := isModified(cwd, redoDir, tgt)
        if err != nil {
                lockRelease()
                return TgtErr{tgtOrig, err}
@@ -327,6 +331,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
        cmd := exec.Command(cmdName, args...)
        cmd.Dir = cwd
        cmd.Stdout = fdStdout
+       // cmd.Stdin reads from /dev/null by default
        cmd.Env = append(os.Environ(), fmt.Sprintf("%s=%d", EnvLevel, Level+1))
        cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDirPrefix, dirPrefix))
        cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvBuildUUID, BuildUUID))
@@ -379,7 +384,10 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                }
                fdStderr.Truncate(0)
        }
-       shCtx := fmt.Sprintf("sh: %s: %s %s [%s]", tgtOrig, cmdName, args, cwd)
+       shCtx := fmt.Sprintf(
+               "sh: %s: %s %s cwd:%s dirprefix:%s",
+               tgtOrig, cmdName, args, cwd, dirPrefix,
+       )
        trace(CDebug, "%s", shCtx)
 
        Jobs.Add(1)
@@ -458,11 +466,11 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                }
 
                // Was $1 touched?
-               if tsPrev != "" {
+               if inodePrev != nil {
                        if fd, err := os.Open(path.Join(cwdOrig, tgt)); err == nil {
-                               ts, err := fileCtime(fd)
+                               inode, err := inodeFromFile(fd)
                                fd.Close()
-                               if err == nil && ts != tsPrev {
+                               if err == nil && !inode.Equals(inodePrev) {
                                        runErr.Err = errors.New("$1 was explicitly touched")
                                        errs <- runErr
                                        fd.Close()