]> 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 0f7277bfd34313daf56c01e3b60ab4dee272f922..93c837d9fb458dca6c4bffbe62c120da60aa387f 100644 (file)
--- a/run.go
+++ b/run.go
@@ -57,16 +57,15 @@ const (
 )
 
 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 {
@@ -165,7 +164,7 @@ func syncDir(dir string) error {
        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 {
@@ -194,14 +193,20 @@ func runScript(tgtOrig string, errs chan error) 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 {
@@ -325,7 +330,7 @@ func runScript(tgtOrig string, errs chan error) error {
                } else {
                        // Shell
                        cmdName = "/bin/sh"
-                       if Trace {
+                       if traced {
                                args = append(args, "-ex")
                        } else {
                                args = append(args, "-e")
@@ -355,10 +360,19 @@ func runScript(tgtOrig string, errs chan error) 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))
@@ -395,6 +409,9 @@ func runScript(tgtOrig string, errs chan error) error {
        Jobs.Add(1)
        go func() {
                jsAcquire(shCtx)
+               if FdStatus != nil {
+                       FdStatus.Write([]byte{StatusRun})
+               }
                defer func() {
                        jsRelease(shCtx)
                        lockRelease()
@@ -407,6 +424,9 @@ func runScript(tgtOrig string, errs chan error) error {
                        os.Remove(fdStdout.Name())
                        os.Remove(tmpPath)
                        os.Remove(fdLock.Name())
+                       if FdStatus != nil {
+                               FdStatus.Write([]byte{StatusDone})
+                       }
                        Jobs.Done()
                }()
                started := time.Now()
@@ -434,7 +454,9 @@ func runScript(tgtOrig string, errs chan error) error {
                                }
                                if fdStderr != nil {
                                        tai64nNow(ts)
+                                       LogMutex.Lock()
                                        fmt.Fprintf(fdStderr, "@%s %s\n", hex.EncodeToString(ts[:]), line)
+                                       LogMutex.Unlock()
                                }
                                if StderrSilent {
                                        continue