From: Sergey Matveev Date: Fri, 16 Jan 2026 13:03:22 +0000 (+0300) Subject: Clean tempfiles if killed X-Git-Tag: v2.9.0^0 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=cadf510a5bb2b675491b8f8d2e3f9b40c002d84a;p=goredo.git Clean tempfiles if killed --- diff --git a/doc/NEWS b/doc/NEWS index e6015e1..636ae78 100644 --- a/doc/NEWS +++ b/doc/NEWS @@ -2,6 +2,7 @@ A 2.9.0 2.9.0 * Warn if non-top target did not write anything. Idea was borrowed from redo-sh. + * Clean up temporary files if got SIGINT or SIGTERM signals. A 2.8.0 2.8.0 diff --git a/main.go b/main.go index 6a3de1d..52bb679 100644 --- a/main.go +++ b/main.go @@ -318,6 +318,10 @@ func main() { go func() { <-killed tracef(CDebug, "[%s] killed", BuildUUID) + for fn := range TmpsToClean { + tracef(CDebug, "[%s] clean tempfile: %s", BuildUUID, fn) + os.Remove(fn) + } jsReleaseAll() RunningProcsM.Lock() for pid, proc := range RunningProcs { diff --git a/run.go b/run.go index d043d1a..7db6752 100644 --- a/run.go +++ b/run.go @@ -70,6 +70,7 @@ var ( StderrPrefix string StopIfMod = false Jobs sync.WaitGroup + TmpsToClean = make(map[string]struct{}) flagTrace *bool flagTraceAll *bool @@ -319,6 +320,7 @@ func runScript(tgt *Tgt, errs chan error, forced, traced bool) error { lockRelease() return TgtError{tgt, ErrLine(err)} } + TmpsToClean[fdDep.Name()] = struct{}{} fdDepOpened := true fdDepExists := true fdDepW := bufio.NewWriter(fdDep) @@ -328,6 +330,7 @@ func runScript(tgt *Tgt, errs chan error, forced, traced bool) error { fdDep.Close() } if fdDepExists { + delete(TmpsToClean, fdDep.Name()) os.Remove(fdDep.Name()) } } @@ -407,6 +410,7 @@ func runScript(tgt *Tgt, errs chan error, forced, traced bool) error { cleanup() return TgtError{tgt, ErrLine(err)} } + TmpsToClean[fdStdout.Name()] = struct{}{} fdStdout.Close() tmpPath := fdStdout.Name() + ".3" // and for $3 tmpPathRel := mustRel(cwd, tmpPath) @@ -607,9 +611,12 @@ func runScript(tgt *Tgt, errs chan error, forced, traced bool) error { } lockRelease() if fdDepExists { + delete(TmpsToClean, fdDep.Name()) os.Remove(fdDep.Name()) } + delete(TmpsToClean, fdStdout.Name()) os.Remove(fdStdout.Name()) + delete(TmpsToClean, tmpPath) os.Remove(tmpPath) if FdStatus != nil { if _, err = FdStatus.Write([]byte{StatusDone}); err != nil { @@ -834,6 +841,7 @@ func runScript(tgt *Tgt, errs chan error, forced, traced bool) error { if err != nil { goto Finish } + delete(TmpsToClean, fdDep.Name()) fdDepExists = false if !NoSync { err = ErrLine(syncDir(redoDir))