import (
"bufio"
- "encoding/hex"
"errors"
"flag"
"fmt"
"os"
"os/exec"
"path"
- "strconv"
"strings"
"sync"
"syscall"
"time"
"go.cypherpunks.ru/recfile"
+ "go.cypherpunks.ru/tai64n"
"golang.org/x/sys/unix"
)
StderrPrefix string
Jobs sync.WaitGroup
- flagTrace = flag.Bool("x", false, fmt.Sprintf("trace current target (sh -x) (set %s=1 for others too)", EnvTrace))
+ flagTrace = flag.Bool("x", false, fmt.Sprintf("trace current target (sh -x) (set %s=1 for all others)", 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))
)
return os.MkdirAll(pth, os.FileMode(0777))
}
-func tempsuffix() string {
- return strconv.FormatInt((time.Now().UnixNano()+int64(os.Getpid()))&0xFFFFFFFF, 16)
-}
-
-func tempfile(dir, prefix string) (*os.File, error) {
- // It respects umask, unlike ioutil.TempFile
- name := path.Join(dir, TmpPrefix+prefix+"."+tempsuffix())
- return os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, os.FileMode(0666))
-}
-
func isModified(cwd, redoDir, tgt string) (bool, string, error) {
fdDep, err := os.Open(path.Join(redoDir, tgt+DepSuffix))
if err != nil {
var cmdName string
var args []string
if err = unix.Access(doFilePath, unix.X_OK); err == nil {
- // Ordinary executable file
cmdName = doFilePath
args = make([]string, 0, 3)
} else {
- fd, err := os.Open(doFilePath)
- if err != nil {
- cleanup()
- return TgtErr{tgtOrig, err}
- }
- buf := make([]byte, 512)
- n, err := fd.Read(buf)
- if err != nil {
- cleanup()
- return TgtErr{tgtOrig, err}
- }
- if n > 3 && string(buf[:3]) == "#!/" {
- // Shebanged
- t := string(buf[2:n])
- nlIdx := strings.Index(t, "\n")
- if nlIdx == -1 {
- cleanup()
- return TgtErr{tgtOrig, errors.New("not fully read shebang")}
- }
- args = strings.Split(t[:nlIdx], " ")
- cmdName, args = args[0], args[1:]
+ cmdName = "/bin/sh"
+ if traced {
+ args = append(args, "-ex")
} else {
- // Shell
- cmdName = "/bin/sh"
- if traced {
- args = append(args, "-ex")
- } else {
- args = append(args, "-e")
- }
+ args = append(args, "-e")
}
args = append(args, doFile)
}
go func() {
scanner := bufio.NewScanner(stderr)
var line string
- ts := new(TAI64N)
+ ts := new(tai64n.TAI64N)
for scanner.Scan() {
line = scanner.Text()
if strings.HasPrefix(line, childStderrPrefix) {
continue
}
if fdStderr != nil {
- tai64nNow(ts)
+ tai64n.FromTime(time.Now(), ts)
LogMutex.Lock()
- fmt.Fprintf(fdStderr, "@%s %s\n", hex.EncodeToString(ts[:]), line)
+ fmt.Fprintf(fdStderr, "%s %s\n", ts.Encode(), line)
LogMutex.Unlock()
}
if StderrSilent {