]> Cypherpunks.ru repositories - goredo.git/blobdiff - run.go
Simple real-time status messages
[goredo.git] / run.go
diff --git a/run.go b/run.go
index bb455e845df4b20abc91be0a10c584367b43a301..93c837d9fb458dca6c4bffbe62c120da60aa387f 100644 (file)
--- a/run.go
+++ b/run.go
@@ -63,9 +63,9 @@ var (
        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 {
@@ -193,14 +193,20 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                        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 {
@@ -354,10 +360,19 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                "%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))
@@ -394,6 +409,9 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
        Jobs.Add(1)
        go func() {
                jsAcquire(shCtx)
+               if FdStatus != nil {
+                       FdStatus.Write([]byte{StatusRun})
+               }
                defer func() {
                        jsRelease(shCtx)
                        lockRelease()
@@ -406,6 +424,9 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                        os.Remove(fdStdout.Name())
                        os.Remove(tmpPath)
                        os.Remove(fdLock.Name())
+                       if FdStatus != nil {
+                               FdStatus.Write([]byte{StatusDone})
+                       }
                        Jobs.Done()
                }()
                started := time.Now()
@@ -433,7 +454,9 @@ func runScript(tgtOrig string, errs chan error, traced bool) error {
                                }
                                if fdStderr != nil {
                                        tai64nNow(ts)
+                                       LogMutex.Lock()
                                        fmt.Fprintf(fdStderr, "@%s %s\n", hex.EncodeToString(ts[:]), line)
+                                       LogMutex.Unlock()
                                }
                                if StderrSilent {
                                        continue