]> Cypherpunks.ru repositories - goredo.git/blobdiff - run.go
Various refactoring
[goredo.git] / run.go
diff --git a/run.go b/run.go
index 58b9f6daff2fa933a17c6ff906766676169c86dd..fab67374eb24cb9bb14793cea1622d090098303a 100644 (file)
--- a/run.go
+++ b/run.go
@@ -23,6 +23,7 @@ import (
        "bufio"
        "encoding/hex"
        "errors"
+       "flag"
        "fmt"
        "io"
        "os"
@@ -38,6 +39,15 @@ import (
 )
 
 const (
+       EnvDepFd        = "REDO_DEP_FD"
+       EnvDirPrefix    = "REDO_DIRPREFIX"
+       EnvBuildUUID    = "REDO_BUILD_UUID"
+       EnvStderrPrefix = "REDO_STDERR_PREFIX"
+       EnvTrace        = "REDO_TRACE"
+       EnvStderrKeep   = "REDO_LOGS"
+       EnvStderrSilent = "REDO_SILENT"
+       EnvNoSync       = "REDO_NO_SYNC"
+
        RedoDir    = ".redo"
        LockSuffix = ".lock"
        DepSuffix  = ".dep"
@@ -45,6 +55,45 @@ const (
        LogSuffix  = ".log"
 )
 
+var (
+       Trace        bool = false
+       NoSync       bool = false
+       StderrKeep   bool = false
+       StderrSilent bool = false
+       StderrPrefix string
+
+       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)")
+)
+
+type RunErr struct {
+       Tgt      string
+       DoFile   string
+       Started  *time.Time
+       Finished *time.Time
+       Err      error
+}
+
+func (e RunErr) Unwrap() error { return e.Err }
+
+func (e *RunErr) Name() string {
+       var name string
+       if e.DoFile == "" {
+               name = e.Tgt
+       } else {
+               name = fmt.Sprintf("%s (%s)", e.Tgt, e.DoFile)
+       }
+       if e.Finished == nil {
+               return name
+       }
+       return fmt.Sprintf("%s (%fsec)", name, e.Finished.Sub(*e.Started).Seconds())
+}
+
+func (e RunErr) Error() string {
+       return fmt.Sprintf("%s: %s", e.Name(), e.Err)
+}
+
 func mkdirs(pth string) error {
        if _, err := os.Stat(pth); err == nil {
                return nil
@@ -103,33 +152,6 @@ func isModified(cwd, redoDir, tgt string) (bool, error) {
        return false, nil
 }
 
-type RunErr struct {
-       Tgt      string
-       DoFile   string
-       Started  *time.Time
-       Finished *time.Time
-       Err      error
-}
-
-func (e RunErr) Unwrap() error { return e.Err }
-
-func (e *RunErr) Name() string {
-       var name string
-       if e.DoFile == "" {
-               name = e.Tgt
-       } else {
-               name = fmt.Sprintf("%s (%s)", e.Tgt, e.DoFile)
-       }
-       if e.Finished == nil {
-               return name
-       }
-       return fmt.Sprintf("%s (%fsec)", name, e.Finished.Sub(*e.Started).Seconds())
-}
-
-func (e RunErr) Error() string {
-       return fmt.Sprintf("%s: %s", e.Name(), e.Err)
-}
-
 func syncDir(dir string) error {
        fd, err := os.Open(dir)
        if err != nil {
@@ -319,29 +341,26 @@ func runScript(tgt string, errs chan error) error {
        cmd := exec.Command(cmdName, args...)
        cmd.Dir = cwd
        cmd.Stdout = fdStdout
-       cmd.Env = append(os.Environ(), fmt.Sprintf("%s=%d", RedoLevelEnv, Level+1))
-       cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", RedoDirPrefixEnv, dirPrefix))
-       cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", RedoBuildUUIDEnv, BuildUUID))
+       cmd.Env = append(os.Environ(), fmt.Sprintf("%s=%d", EnvLevel, Level+1))
+       cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDirPrefix, dirPrefix))
+       cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvBuildUUID, BuildUUID))
        childStderrPrefix := tempsuffix()
        cmd.Env = append(cmd.Env, fmt.Sprintf(
-               "%s=%s", RedoStderrPrefixEnv, childStderrPrefix,
+               "%s=%s", EnvStderrPrefix, childStderrPrefix,
        ))
 
        cmd.ExtraFiles = append(cmd.ExtraFiles, fdDep)
        fdNum := 0
-       cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", RedoDepFdEnv, 3+fdNum))
+       cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvDepFd, 3+fdNum))
        fdNum++
        if JSR == nil {
                // infinite jobs
-               cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", RedoJSRFdEnv))
-               cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", RedoJSWFdEnv))
+               cmd.Env = append(cmd.Env, fmt.Sprintf("%s=NO", EnvJSFd))
        } else {
                cmd.ExtraFiles = append(cmd.ExtraFiles, JSR)
                cmd.ExtraFiles = append(cmd.ExtraFiles, JSW)
-               cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", RedoJSRFdEnv, 3+fdNum))
-               fdNum++
-               cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", RedoJSWFdEnv, 3+fdNum))
-               fdNum++
+               cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d,%d", EnvJSFd, 3+fdNum+0, 3+fdNum+1))
+               fdNum += 2
        }
 
        // Preparing stderr