"bufio"
"bytes"
"crypto/rand"
+ "errors"
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"os"
+ "os/signal"
"path"
"path/filepath"
"runtime"
"sort"
"strconv"
+ "syscall"
"go.cypherpunks.ru/recfile"
"golang.org/x/sys/unix"
IsTopRedo bool // is it the top redo instance
)
-func mustSetenv(key, value string) {
- if err := os.Setenv(key, value); err != nil {
+func mustSetenv(key string) {
+ if err := os.Setenv(key, "1"); err != nil {
panic(err)
}
}
log.Fatalln(err)
}
- NoColor = os.Getenv(EnvNoColor) != ""
- NoSync = os.Getenv(EnvNoSync) == "1"
- InodeTrust = os.Getenv(EnvInodeNoTrust) == ""
-
TopDir = os.Getenv(EnvTopDir)
if TopDir == "" {
TopDir = "/"
DepCwd = os.Getenv(EnvDepCwd)
if flagStderrKeep != nil && *flagStderrKeep {
- mustSetenv(EnvStderrKeep, "1")
+ mustSetenv(EnvStderrKeep)
}
if flagStderrSilent != nil && *flagStderrSilent {
- mustSetenv(EnvStderrSilent, "1")
+ mustSetenv(EnvStderrSilent)
}
if flagNoProgress != nil && *flagNoProgress {
- mustSetenv(EnvNoProgress, "1")
+ mustSetenv(EnvNoProgress)
}
if flagDebug != nil && *flagDebug {
- mustSetenv(EnvDebug, "1")
+ mustSetenv(EnvDebug)
}
if flagLogWait != nil && *flagLogWait {
- mustSetenv(EnvLogWait, "1")
+ mustSetenv(EnvLogWait)
}
if flagLogLock != nil && *flagLogLock {
- mustSetenv(EnvLogLock, "1")
+ mustSetenv(EnvLogLock)
}
if flagLogPid != nil && *flagLogPid {
- mustSetenv(EnvLogPid, "1")
+ mustSetenv(EnvLogPid)
}
if flagLogJS != nil && *flagLogJS {
- mustSetenv(EnvLogJS, "1")
+ mustSetenv(EnvLogJS)
}
StderrKeep = os.Getenv(EnvStderrKeep) == "1"
StderrSilent = os.Getenv(EnvStderrSilent) == "1"
}
var traced bool
if flagTraceAll != nil && *flagTraceAll {
- mustSetenv(EnvTrace, "1")
+ mustSetenv(EnvTrace)
}
if os.Getenv(EnvTrace) == "1" {
TracedAll = true
} else if flagTrace != nil {
traced = *flagTrace
}
+ NoColor = os.Getenv(EnvNoColor) != ""
+ NoSync = os.Getenv(EnvNoSync) == "1"
+ switch s := os.Getenv(EnvInodeTrust); s {
+ case "none":
+ InodeTrust = InodeTrustNone
+ case "", "ctime":
+ InodeTrust = InodeTrustCtime
+ case "mtime":
+ InodeTrust = InodeTrustMtime
+ default:
+ log.Fatalln("unknown", EnvInodeTrust, "value")
+ }
+ tracef(CDebug, "inode-trust: %s", InodeTrust)
// Those are internal envs
FdOODTgts, err = ioutil.TempFile("", "ood-tgts")
if err != nil {
log.Fatalln(err)
}
- unix.Flock(int(fdLock.Fd()), unix.LOCK_UN)
+ if err = unix.Flock(int(fdLock.Fd()), unix.LOCK_UN); err != nil {
+ log.Fatalln(err)
+ }
OODTgts = map[string]struct{}{}
for _, tgtRaw := range bytes.Split(tgtsRaw, []byte{0}) {
t := string(tgtRaw)
continue
}
OODTgts[t] = struct{}{}
- trace(CDebug, "ood: known to be: %s", t)
+ tracef(CDebug, "ood: known to be: %s", t)
}
}
}
}
+ killed := make(chan os.Signal, 1)
+ signal.Notify(killed, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
+ go func() {
+ <-killed
+ tracef(CDebug, "[%s] killed", BuildUUID)
+ jsReleaseAll()
+ RunningProcsM.Lock()
+ for pid, proc := range RunningProcs {
+ tracef(CDebug, "[%s] killing child %d", BuildUUID, pid)
+ _ = proc.Signal(syscall.SIGTERM)
+ }
+ os.Exit(1)
+ }()
+
ok := true
err = nil
- trace(
+ tracef(
CDebug, "[%s] run: %s %s cwd:%s dirprefix:%s",
BuildUUID, cmdName, tgts, Cwd, DirPrefix,
)
case CmdNameRedoIfchange:
ok, err = ifchange(tgts, false, traced)
if err == nil {
- err = writeDeps(fdDep, tgts)
+ err = depsWrite(fdDep, tgts)
}
case CmdNameRedoIfcreate:
if fdDep == nil {
for {
m, err := r.NextMap()
if err != nil {
- if err == io.EOF {
+ if errors.Is(err, io.EOF) {
break
}
break CmdSwitch
if !ok || err != nil {
rc = 1
}
- trace(CDebug, "[%s] finished: %s %s", BuildUUID, cmdName, tgts)
+ tracef(CDebug, "[%s] finished: %s %s", BuildUUID, cmdName, tgts)
os.Exit(rc)
}