/*
goredo -- djb's redo implementation on pure Go
-Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2020-2022 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
CmdNameRedoStamp = "redo-stamp"
CmdNameRedoTargets = "redo-targets"
CmdNameRedoWhichdo = "redo-whichdo"
+ CmdNameRedoDepFix = "redo-depfix"
)
var (
}
func main() {
+ forcedIfchange := flag.Bool("f", false, "forced redo-ifchange")
version := flag.Bool("version", false, "print version")
warranty := flag.Bool("warranty", false, "print warranty information")
CmdNameRedoAffects,
CmdNameRedoAlways,
CmdNameRedoCleanup,
+ CmdNameRedoDepFix,
CmdNameRedoDot,
CmdNameRedoIfchange,
CmdNameRedoIfcreate,
}
NoColor = os.Getenv(EnvNoColor) != ""
NoSync = os.Getenv(EnvNoSync) == "1"
+ StopIfMod = os.Getenv(EnvStopIfMod) == "1"
switch s := os.Getenv(EnvInodeTrust); s {
case "none":
InodeTrust = InodeTrustNone
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 {
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{}{}
}
}
case CmdNameRedoIfchange:
- ok, err = ifchange(tgts, false, traced)
+ ok, err = ifchange(tgts, *forcedIfchange, traced)
if err == nil {
err = depsWrite(fdDep, tgts)
}
}
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
for _, src := range srcs {
fmt.Println(src)
}
+ case CmdNameRedoDepFix:
+ err = depFix(Cwd)
default:
log.Fatalln("unknown command", cmdName)
}