X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=run.go;h=985db83918e0879af20b3988215ab3f96b957f03;hb=630b0f862b0105ca934d97f8b8d655818c32c9ed;hp=44d25d55045943eafcc873831444915ae458b404;hpb=906d2d0d72e16bbdb17653b834a980f134309a59;p=goredo.git diff --git a/run.go b/run.go index 44d25d5..985db83 100644 --- a/run.go +++ b/run.go @@ -21,6 +21,8 @@ package main import ( "bufio" + "crypto/rand" + "encoding/hex" "errors" "flag" "fmt" @@ -124,7 +126,7 @@ func (e RunError) Error() string { } func mkdirs(pth string) error { - if _, err := os.Stat(pth); err == nil { + if FileExists(pth) { return nil } return os.MkdirAll(pth, os.FileMode(0777)) @@ -154,18 +156,13 @@ func isModified(cwd, redoDir, tgt string) (bool, *Inode, string, error) { if m["Type"] != DepTypeIfchange || m["Target"] != tgt { continue } - fd, err := os.Open(path.Join(cwd, tgt)) + ourInode, err = inodeFromFileByPath(path.Join(cwd, tgt)) if err != nil { if os.IsNotExist(err) { return false, nil, "", nil } return false, nil, "", err } - ourInode, err = inodeFromFile(fd) - fd.Close() - if err != nil { - return false, nil, "", err - } theirInode, err := inodeFromRec(m) if err != nil { return false, nil, "", err @@ -402,7 +399,11 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvDirPrefix, dirPrefix)) cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", EnvBuildUUID, BuildUUID)) - childStderrPrefix := tempsuffix() + childStderrPrefixRaw := make([]byte, 8) + if _, err = io.ReadFull(rand.Reader, childStderrPrefixRaw); err != nil { + panic(err) + } + childStderrPrefix := hex.EncodeToString(childStderrPrefixRaw) cmd.Env = append(cmd.Env, fmt.Sprintf( "%s=%s", EnvStderrPrefix, childStderrPrefix, )) @@ -649,15 +650,12 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { } // Was $1 touched? - if fd, err := os.Open(path.Join(cwdOrig, tgt)); err == nil { + if inode, err := inodeFromFileByPath(path.Join(cwdOrig, tgt)); err == nil { if inodePrev == nil { - fd.Close() runErr.Err = Err1WasTouched errs <- runErr return } - inode, err := inodeFromFile(fd) - fd.Close() if err != nil { runErr.Err = err errs <- runErr @@ -671,10 +669,8 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { } if inodePrev != nil { - if fd, err := os.Open(path.Join(cwdOrig, tgt)); err == nil { - inode, err := inodeFromFile(fd) - fd.Close() - if err == nil && !inode.Equals(inodePrev) { + if inode, err := inodeFromFileByPath(path.Join(cwdOrig, tgt)); err == nil { + if !inode.Equals(inodePrev) { runErr.Err = Err1WasTouched errs <- runErr return