]> Cypherpunks repositories - goredo.git/commitdiff
Clean tempfiles if killed v2.9.0
authorSergey Matveev <stargrave@stargrave.org>
Fri, 16 Jan 2026 13:03:22 +0000 (16:03 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Fri, 16 Jan 2026 13:53:18 +0000 (16:53 +0300)
doc/NEWS
main.go
run.go

index e6015e1ac1c16dbe50f2c511383550b1a265a7ca..636ae7843b3283cf4a5bb1ae1c35b59b69f3ae40 100644 (file)
--- 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\r
 2.8.0
diff --git a/main.go b/main.go
index 6a3de1df5957d24f733731148fd923e35c1b8c05..52bb67930beb052f336ae7c8baccb6ae5be813ce 100644 (file)
--- 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 d043d1aceca9da29f4c5cdfa50bf56b39bb15fe4..7db675244764f9e63195a3a0c9253841542a5888 100644 (file)
--- 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))