X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=run.go;h=1e8472f3602b514f9335712028411f48f5c163a0;hb=14a7c7dfbcb4b160321de5dfcc673a80657d47de;hp=d31c8a0c5a4ffb52816cb74d90de5536c8fe515b;hpb=46e189a9c6398c1ab1245ab1e9827b959db29219;p=goredo.git diff --git a/run.go b/run.go index d31c8a0..1e8472f 100644 --- a/run.go +++ b/run.go @@ -52,11 +52,12 @@ const ( EnvStderrSilent = "REDO_SILENT" EnvNoSync = "REDO_NO_SYNC" - RedoDir = ".redo" - LockSuffix = ".lock" - DepSuffix = ".rec" - TmpPrefix = ".redo." - LogSuffix = ".log" + RedoDir = ".redo" + LockSuffix = ".lock" + DepSuffix = ".rec" + TmpPrefix = ".redo." + LogSuffix = ".log" + LogRecSuffix = ".log-rec" ) var ( @@ -384,14 +385,13 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { if StderrKeep { fdStderr, err = os.OpenFile( path.Join(redoDir, tgt+LogSuffix), - os.O_WRONLY|os.O_CREATE, + os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.FileMode(0666), ) if err != nil { cleanup() return TgtErr{tgtOrig, err} } - fdStderr.Truncate(0) } shCtx := fmt.Sprintf( "sh: %s: %s %s cwd:%s dirprefix:%s", @@ -408,10 +408,11 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { } else { cmd.ExtraFiles = append(cmd.ExtraFiles, JSR) cmd.ExtraFiles = append(cmd.ExtraFiles, JSW) - cmd.Env = append(cmd.Env, fmt.Sprintf( - "%s=%s %s%d,%d", - MakeFlagsName, MakeFlags, MakeJSArg, 3+fdNum+0, 3+fdNum+1, - )) + makeFlags := fmt.Sprintf( + "%s %s%d,%d", MakeFlags, MakeJSArg, 3+fdNum+0, 3+fdNum+1, + ) + makeFlags = strings.Trim(makeFlags, " ") + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", MakeFlagsName, makeFlags)) fdNum += 2 cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", EnvJSToken, jsToken)) } @@ -448,19 +449,22 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { fdStdout.Close() if fdStderr != nil { fdStderr.Close() - logRecPath := path.Join(redoDir, tgt+LogSuffix+DepSuffix) + logRecPath := path.Join(redoDir, tgt+LogRecSuffix) if fdStderr, err = os.OpenFile( logRecPath, - os.O_WRONLY|os.O_CREATE, + os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.FileMode(0666), ); err == nil { - fdStderr.Truncate(0) fields := []recfile.Field{ {Name: "Build", Value: BuildUUID}, - {Name: "PID", Value: strconv.Itoa(cmd.Process.Pid)}, {Name: "PPID", Value: strconv.Itoa(os.Getpid())}, {Name: "Cwd", Value: cwd}, } + if cmd.Process != nil { + fields = append(fields, recfile.Field{ + Name: "PID", Value: strconv.Itoa(cmd.Process.Pid), + }) + } ts := new(tai64n.TAI64N) ts.FromTime(started) fields = append(fields, @@ -475,7 +479,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { }) fields = append(fields, recfile.Field{Name: "Cmd", Value: cmdName}) for _, arg := range args { - fields = append(fields, recfile.Field{Name: "Cmd", Value: arg}) + fields = append(fields, recfile.Field{Name: "Arg", Value: arg}) } for _, env := range cmd.Env { fields = append(fields, recfile.Field{Name: "Env", Value: env}) @@ -489,7 +493,7 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { w := bufio.NewWriter(fdStderr) var depInfo *DepInfo - fdDep, err = os.Open(fdDep.Name()) + fdDep, err := os.Open(fdDepPath) if err != nil { goto Err } @@ -588,6 +592,29 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { } // Was $1 touched? + if fd, err := os.Open(path.Join(cwdOrig, tgt)); err == nil { + errTouched := errors.New("$1 was explicitly touched") + if inodePrev == nil { + fd.Close() + runErr.Err = errTouched + errs <- runErr + return + } else { + inode, err := inodeFromFile(fd) + fd.Close() + if err != nil { + runErr.Err = err + errs <- runErr + return + } + if !inode.Equals(inodePrev) { + runErr.Err = errTouched + errs <- runErr + return + } + } + } + if inodePrev != nil { if fd, err := os.Open(path.Join(cwdOrig, tgt)); err == nil { inode, err := inodeFromFile(fd) @@ -671,7 +698,8 @@ func runScript(tgtOrig string, errs chan error, traced bool) error { goto Finish } } - err = os.Rename(fdDep.Name(), path.Join(redoDir, tgt+DepSuffix)) + fdDepPath = path.Join(redoDir, tgt+DepSuffix) + err = os.Rename(fdDep.Name(), fdDepPath) if err != nil { goto Finish }