doc/NEWS | 1 + main.go | 4 ++++ run.go | 8 ++++++++ diff --git a/doc/NEWS b/doc/NEWS index 73ea890e71fdb02332596720e7c48a1e29a9ff2a3fe5904a8bbd7106aba35c1e..6b5c1493fb688ed2ec867feee1eeda4ad6cf80b753efac40d2a3bc27105d0698 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 ec1fefe5de8b6a25ff8154ceb5a832c5bb2ec88dc72351db176f9e358470f3f3..8ebdadfdfaacb5d0574c90c1657c80b8d6ec30aaa52492121dbb56a31799a40a 100644 --- a/main.go +++ b/main.go @@ -318,6 +318,10 @@ signal.Notify(killed, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) 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 8e8adb786c06537b34e0fc337e6928cac32217b88395c72d685ea8e1dbcde8bd..7617fb360ea76be7c4228414555f285019a60583fc45ce60be94f8d315002f3f 100644 --- a/run.go +++ b/run.go @@ -70,6 +70,7 @@ StderrSilent = false StderrPrefix string StopIfMod = false Jobs sync.WaitGroup + TmpsToClean = make(map[string]struct{}) flagTrace *bool flagTraceAll *bool @@ -319,6 +320,7 @@ if err != nil { lockRelease() return TgtError{tgt, ErrLine(err)} } + TmpsToClean[fdDep.Name()] = struct{}{} fdDepOpened := true fdDepExists := true fdDepW := bufio.NewWriter(fdDep) @@ -328,6 +330,7 @@ if fdDepOpened { fdDep.Close() } if fdDepExists { + delete(TmpsToClean, fdDep.Name()) os.Remove(fdDep.Name()) } } @@ -407,6 +410,7 @@ if err != nil { 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 @@ } } 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 @@ err = ErrLine(os.Rename(fdDep.Name(), tgt.dep)) if err != nil { goto Finish } + delete(TmpsToClean, fdDep.Name()) fdDepExists = false if !NoSync { err = ErrLine(syncDir(redoDir))