X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=main.go;h=f8ad7dd423c30052820f392994296cdaaf1acabb;hb=19b13ea1334d377dd9c6a36ea70c9141b8fd447d;hp=f87bdac0d7f97295c88664af3706c20211e2f5be;hpb=0030b3e73152bf9d9ad3e435fa42e607c7865321;p=goredo.git diff --git a/main.go b/main.go index f87bdac..f8ad7dd 100644 --- 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) }