"golang.org/x/sys/unix"
)
+const (
+ CmdNameGoredo = "goredo"
+ CmdNameRedo = "redo"
+ CmdNameRedoAffects = "redo-affects"
+ CmdNameRedoAlways = "redo-always"
+ CmdNameRedoCleanup = "redo-cleanup"
+ CmdNameRedoDot = "redo-dot"
+ CmdNameRedoIfchange = "redo-ifchange"
+ CmdNameRedoIfcreate = "redo-ifcreate"
+ CmdNameRedoLog = "redo-log"
+ CmdNameRedoOOD = "redo-ood"
+ CmdNameRedoSources = "redo-sources"
+ CmdNameRedoStamp = "redo-stamp"
+ CmdNameRedoTargets = "redo-targets"
+ CmdNameRedoWhichdo = "redo-whichdo"
+)
+
var (
Cwd string
BuildUUID string
return fd
}
+func CmdName() string {
+ return path.Base(os.Args[0])
+}
+
func main() {
version := flag.Bool("version", false, "print version")
warranty := flag.Bool("warranty", false, "print warranty information")
- symlinks := flag.Bool("symlinks", false, "create necessary symlinks in current directory")
+
+ var symlinks *bool
+ cmdName := CmdName()
+ if cmdName == "goredo" {
+ symlinks = flag.Bool("symlinks", false, "create necessary symlinks in current directory")
+ }
flag.Usage = func() { usage(os.Args[0]) }
flag.Parse()
fmt.Println("goredo", Version, "built with", runtime.Version())
return
}
- if *symlinks {
+ if cmdName == CmdNameGoredo && *symlinks {
rc := 0
for _, cmdName := range []string{
- "redo",
- "redo-affects",
- "redo-always",
- "redo-cleanup",
- "redo-dot",
- "redo-ifchange",
- "redo-ifcreate",
- "redo-log",
- "redo-ood",
- "redo-sources",
- "redo-stamp",
- "redo-targets",
- "redo-whichdo",
+ CmdNameRedo,
+ CmdNameRedoAffects,
+ CmdNameRedoAlways,
+ CmdNameRedoCleanup,
+ CmdNameRedoDot,
+ CmdNameRedoIfchange,
+ CmdNameRedoIfcreate,
+ CmdNameRedoLog,
+ CmdNameRedoOOD,
+ CmdNameRedoSources,
+ CmdNameRedoStamp,
+ CmdNameRedoTargets,
+ CmdNameRedoWhichdo,
} {
fmt.Println(os.Args[0], "<-", cmdName)
if err := os.Symlink(os.Args[0], cmdName); err != nil {
}
}
DirPrefix = os.Getenv(EnvDirPrefix)
+ DepCwd = os.Getenv(EnvDepCwd)
- if *flagStderrKeep {
+ if flagStderrKeep != nil && *flagStderrKeep {
mustSetenv(EnvStderrKeep, "1")
}
- if *flagStderrSilent {
+ if flagStderrSilent != nil && *flagStderrSilent {
mustSetenv(EnvStderrSilent, "1")
}
- if *flagNoProgress {
+ if flagNoProgress != nil && *flagNoProgress {
mustSetenv(EnvNoProgress, "1")
}
- if *flagDebug {
+ if flagDebug != nil && *flagDebug {
mustSetenv(EnvDebug, "1")
}
- if *flagLogWait {
+ if flagLogWait != nil && *flagLogWait {
mustSetenv(EnvLogWait, "1")
}
- if *flagLogLock {
+ if flagLogLock != nil && *flagLogLock {
mustSetenv(EnvLogLock, "1")
}
- if *flagLogPid {
+ if flagLogPid != nil && *flagLogPid {
mustSetenv(EnvLogPid, "1")
}
- if *flagLogJS {
+ if flagLogJS != nil && *flagLogJS {
mustSetenv(EnvLogJS, "1")
}
StderrKeep = os.Getenv(EnvStderrKeep) == "1"
MyPid = os.Getpid()
}
var traced bool
- if *flagTraceAll {
+ if flagTraceAll != nil && *flagTraceAll {
mustSetenv(EnvTrace, "1")
}
if os.Getenv(EnvTrace) == "1" {
TracedAll = true
traced = true
- } else {
+ } else if flagTrace != nil {
traced = *flagTrace
}
}
}
- statusInit()
+ if cmdName == CmdNameRedo || cmdName == CmdNameRedoIfchange {
+ statusInit()
+ }
for i, tgt := range tgts {
if path.IsAbs(tgt) {
ok := true
err = nil
- cmdName := path.Base(os.Args[0])
trace(
CDebug, "[%s] run: %s %s cwd:%s dirprefix:%s",
BuildUUID, cmdName, tgts, Cwd, DirPrefix,
CmdSwitch:
switch cmdName {
- case "redo":
+ case CmdNameRedo:
for _, tgt := range tgts {
ok, err = ifchange([]string{tgt}, true, traced)
if err != nil || !ok {
break
}
}
- case "redo-ifchange":
+ case CmdNameRedoIfchange:
ok, err = ifchange(tgts, false, traced)
if err == nil {
err = writeDeps(fdDep, tgts)
}
- case "redo-ifcreate":
+ case CmdNameRedoIfcreate:
if fdDep == nil {
log.Fatalln("no", EnvDepFd)
}
break
}
}
- case "redo-always":
+ case CmdNameRedoAlways:
if fdDep == nil {
log.Fatalln("no", EnvDepFd)
}
err = always(fdDep)
- case "redo-cleanup":
+ case CmdNameRedoCleanup:
for _, what := range tgts {
err = cleanupWalker(Cwd, what)
if err != nil {
break
}
}
- case "redo-dot":
+ case CmdNameRedoDot:
err = dotPrint(tgts)
- case "redo-stamp":
+ case CmdNameRedoStamp:
if fdDep == nil {
log.Fatalln("no", EnvDepFd)
}
err = stamp(fdDep, os.Stdin)
- case "redo-log":
+ case CmdNameRedoLog:
if len(tgts) != 1 {
log.Fatalln("single target expected")
}
break
}
_, err = io.Copy(os.Stdout, fd)
- case "redo-whichdo":
+ case CmdNameRedoWhichdo:
if len(tgts) != 1 {
log.Fatalln("single target expected")
}
}
fmt.Println(rel)
}
- case "redo-targets":
+ case CmdNameRedoTargets:
if tgtsWasEmpty {
tgts = []string{Cwd}
}
for _, tgt := range tgts {
fmt.Println(tgt)
}
- case "redo-affects":
+ case CmdNameRedoAffects:
if tgtsWasEmpty {
log.Fatalln("no targets specified")
}
for _, dep := range tgts {
fmt.Println(dep)
}
- case "redo-ood":
+ case CmdNameRedoOOD:
if tgtsWasEmpty {
tgts, err = targetsWalker([]string{Cwd})
if err != nil {
fmt.Println(tgt)
}
}
- case "redo-sources":
+ case CmdNameRedoSources:
if tgtsWasEmpty {
tgts, err = targetsWalker([]string{Cwd})
if err != nil {