]> Cypherpunks.ru repositories - goredo.git/blobdiff - main.go
Missing redo-cleanup's note
[goredo.git] / main.go
diff --git a/main.go b/main.go
index f87bdac0d7f97295c88664af3706c20211e2f5be..f8ad7dd423c30052820f392994296cdaaf1acabb 100644 (file)
--- a/main.go
+++ b/main.go
@@ -25,7 +25,6 @@ import (
        "flag"
        "fmt"
        "io"
-       "io/ioutil"
        "log"
        "os"
        "os/signal"
@@ -55,12 +54,14 @@ const (
        CmdNameRedoStamp    = "redo-stamp"
        CmdNameRedoTargets  = "redo-targets"
        CmdNameRedoWhichdo  = "redo-whichdo"
+       CmdNameRedoDepFix   = "redo-depfix"
 )
 
 var (
        Cwd       string
        BuildUUID string
        IsTopRedo bool // is it the top redo instance
+       UmaskCur  int
 )
 
 func mustSetenv(key string) {
@@ -112,6 +113,7 @@ func main() {
                        CmdNameRedoAffects,
                        CmdNameRedoAlways,
                        CmdNameRedoCleanup,
+                       CmdNameRedoDepFix,
                        CmdNameRedoDot,
                        CmdNameRedoIfchange,
                        CmdNameRedoIfcreate,
@@ -132,6 +134,9 @@ func main() {
        }
        log.SetFlags(log.Lshortfile)
 
+       UmaskCur = syscall.Umask(0)
+       syscall.Umask(UmaskCur)
+
        var err error
        Cwd, err = os.Getwd()
        if err != nil {
@@ -196,6 +201,7 @@ func main() {
        }
        NoColor = os.Getenv(EnvNoColor) != ""
        NoSync = os.Getenv(EnvNoSync) == "1"
+       StopIfMod = os.Getenv(EnvStopIfMod) == "1"
        switch s := os.Getenv(EnvInodeTrust); s {
        case "none":
                InodeTrust = InodeTrustNone
@@ -209,14 +215,14 @@ func main() {
        tracef(CDebug, "inode-trust: %s", InodeTrust)
 
        // Those are internal envs
-       FdOODTgts, err = ioutil.TempFile("", "ood-tgts")
+       FdOODTgts, err = os.CreateTemp("", "ood-tgts")
        if err != nil {
                log.Fatalln(err)
        }
        if err = os.Remove(FdOODTgts.Name()); err != nil {
                log.Fatalln(err)
        }
-       FdOODTgtsLock, err = ioutil.TempFile("", "ood-tgts.lock")
+       FdOODTgtsLock, err = os.CreateTemp("", "ood-tgts.lock")
        if err != nil {
                log.Fatalln(err)
        }
@@ -227,17 +233,22 @@ func main() {
        if v := os.Getenv(EnvOODTgtsFd); v != "" {
                fd := mustParseFd(v, EnvOODTgtsFd)
                fdLock := mustParseFd(v, EnvOODTgtsLockFd)
-               if err = unix.Flock(int(fdLock.Fd()), unix.LOCK_EX); err != nil {
+               flock := unix.Flock_t{
+                       Type:   unix.F_WRLCK,
+                       Whence: io.SeekStart,
+               }
+               if err = unix.FcntlFlock(fdLock.Fd(), unix.F_SETLKW, &flock); err != nil {
                        log.Fatalln(err)
                }
                if _, err = fd.Seek(0, io.SeekStart); err != nil {
                        log.Fatalln(err)
                }
-               tgtsRaw, err := ioutil.ReadAll(bufio.NewReader(fd))
+               tgtsRaw, err := io.ReadAll(bufio.NewReader(fd))
                if err != nil {
                        log.Fatalln(err)
                }
-               if err = unix.Flock(int(fdLock.Fd()), unix.LOCK_UN); err != nil {
+               flock.Type = unix.F_UNLCK
+               if err = unix.FcntlFlock(fdLock.Fd(), unix.F_SETLK, &flock); err != nil {
                        log.Fatalln(err)
                }
                OODTgts = map[string]struct{}{}
@@ -327,7 +338,7 @@ CmdSwitch:
                        }
                }
        case CmdNameRedoIfchange:
-               ok, err = ifchange(tgts, false, traced)
+               ok, err = ifchange(tgts, *flagForcedIfchange, traced)
                if err == nil {
                        err = depsWrite(fdDep, tgts)
                }
@@ -337,8 +348,8 @@ CmdSwitch:
                }
                for _, tgt := range tgts {
                        tgtRel, err := filepath.Rel(
-                               filepath.Join(Cwd, DirPrefix),
-                               filepath.Join(Cwd, tgt),
+                               path.Join(Cwd, DirPrefix),
+                               path.Join(Cwd, tgt),
                        )
                        if err != nil {
                                break
@@ -378,7 +389,7 @@ CmdSwitch:
                        log.Fatalln("single target expected")
                }
                var fdTmp *os.File
-               fdTmp, err = ioutil.TempFile("", "whichdo")
+               fdTmp, err = os.CreateTemp("", "whichdo")
                if err != nil {
                        break
                }
@@ -489,6 +500,8 @@ CmdSwitch:
                for _, src := range srcs {
                        fmt.Println(src)
                }
+       case CmdNameRedoDepFix:
+               err = depFix(Cwd)
        default:
                log.Fatalln("unknown command", cmdName)
        }