)
var (
- Trace bool = false
NoSync bool = false
StderrKeep bool = false
StderrSilent bool = false
StderrPrefix string
Jobs sync.WaitGroup
- flagTrace = flag.Bool("x", false, "trace current target (sh -x) (set REDO_TRACE=1 for others too)")
- flagStderrKeep = flag.Bool("logs", false, "keep job's stderr (REDO_LOGS=1)")
- flagStderrSilent = flag.Bool("silent", false, "do not print job's stderr (REDO_SILENT=1)")
+ flagTrace = flag.Bool("x", false, fmt.Sprintf("trace current target (sh -x) (set %s=1 for others too)", EnvTrace))
+ flagStderrKeep = flag.Bool("logs", false, fmt.Sprintf("keep job's stderr (%s=1)", EnvStderrKeep))
+ flagStderrSilent = flag.Bool("silent", false, fmt.Sprintf("do not print job's stderr (%s=1)", EnvStderrSilent))
)
type RunErr struct {
return err
}
-func runScript(tgtOrig string, errs chan error) error {
+func runScript(tgtOrig string, errs chan error, traced bool) error {
cwd, tgt := cwdAndTgt(tgtOrig)
redoDir := path.Join(cwd, RedoDir)
if err := mkdirs(redoDir); err != nil {
fdLock.Close()
return TgtErr{tgtOrig, err}
}
- trace(CDebug, "waiting: %s", tgtOrig)
Jobs.Add(1)
+ trace(CDebug, "waiting: %s", tgtOrig)
+ if FdStatus != nil {
+ FdStatus.Write([]byte{StatusWait})
+ }
go func() {
defer Jobs.Done()
trace(CLock, "LOCK_EX: %s", fdLock.Name())
unix.Flock(int(fdLock.Fd()), unix.LOCK_EX)
lockRelease()
trace(CDebug, "waiting done: %s", tgtOrig)
+ if FdStatus != nil {
+ FdStatus.Write([]byte{StatusWaited})
+ }
var depInfo *DepInfo
fdDep, err := os.Open(path.Join(redoDir, tgt+DepSuffix))
if err != nil {
} else {
// Shell
cmdName = "/bin/sh"
- if Trace {
+ if traced {
args = append(args, "-ex")
} else {
args = append(args, "-e")
"%s=%s", EnvStderrPrefix, childStderrPrefix,
))
- cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep)
fdNum := 0
+ cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep)
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvDepFd, 3+fdNum))
fdNum++
+
+ if FdStatus == nil {
+ cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvStatusFd))
+ } else {
+ cmd.ExtraFiles = append(cmd.ExtraFiles, FdStatus)
+ cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvStatusFd, 3+fdNum))
+ fdNum++
+ }
+
if JSR == nil {
// infinite jobs
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvJSFd))
Jobs.Add(1)
go func() {
jsAcquire(shCtx)
+ if FdStatus != nil {
+ FdStatus.Write([]byte{StatusRun})
+ }
defer func() {
jsRelease(shCtx)
lockRelease()
os.Remove(fdStdout.Name())
os.Remove(tmpPath)
os.Remove(fdLock.Name())
+ if FdStatus != nil {
+ FdStatus.Write([]byte{StatusDone})
+ }
Jobs.Done()
}()
started := time.Now()
}
if fdStderr != nil {
tai64nNow(ts)
+ LogMutex.Lock()
fmt.Fprintf(fdStderr, "@%s %s\n", hex.EncodeToString(ts[:]), line)
+ LogMutex.Unlock()
}
if StderrSilent {
continue