From 99977af671bff1f8547c046a2f54170f438d5bf7 Mon Sep 17 00:00:00 2001 From: cage Date: Sat, 12 Sep 2020 11:16:15 +0200 Subject: [PATCH] - added exit handler to clean temporary files. --- src/filesystem-utils.lisp | 7 +++++++ src/package.lisp | 2 ++ src/ui-goodies.lisp | 37 ++++++++++++++++++++++++++++++------- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/filesystem-utils.lisp b/src/filesystem-utils.lisp index 075e5b9..9fccb14 100644 --- a/src/filesystem-utils.lisp +++ b/src/filesystem-utils.lisp @@ -248,6 +248,8 @@ (text-utils:strcat home *directory-sep*) home))) +(defparameter *temporary-files-created* ()) + (defun temporary-file (&optional (temp-directory nil)) (let ((tmpdir (or temp-directory (os-utils:default-temp-dir)))) @@ -258,8 +260,13 @@ (nix:mkstemp (format nil "~atmp~a~a" *directory-sep* *directory-sep* config:+program-name+))) (declare (ignore x)) + (push filename *temporary-files-created*) filename))) +(defun clean-temporary-files () + (dolist (temporary-file *temporary-files-created*) + (delete-file-if-exists temporary-file))) + (defmacro with-anaphoric-temp-file ((stream &key (prefix nil) (unlink nil)) &body body) `(let ((temp-file (temporary-file ,prefix))) ; anaphora (unwind-protect diff --git a/src/package.lisp b/src/package.lisp index e5d5646..eef280b 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -283,7 +283,9 @@ :delete-file-if-exists :file-hash :home-dir + :*temporary-files-created* :temporary-file + :clean-temporary-files :with-anaphoric-temp-file :temp-file :file-can-write-p diff --git a/src/ui-goodies.lisp b/src/ui-goodies.lisp index ae472a5..28564ad 100644 --- a/src/ui-goodies.lisp +++ b/src/ui-goodies.lisp @@ -27,15 +27,38 @@ (db-utils:close-db) (os-utils:exit-program)) +(defun clean-temporary-files () + "Use this to close the program" + (flet ((on-input-complete (maybe-accepted) + (when (boolean-input-accepted-p maybe-accepted) + (fs:clean-temporary-files)) + (push-event (make-instance 'quit-program-event)))) + (let ((temporary-text (strcat (format nil + (_ "~a Temporary files~2%") + (swconf:gemini-h1-prefix)) + (format nil + "~{- ~a~%~}" + fs:*temporary-files-created*))) + (temporary-files-count (length fs:*temporary-files-created*))) + (if (> temporary-files-count 0) + (progn + (setf (message-window:source-text *message-window*) temporary-text) + (windows:draw *message-window*) + (ask-string-input #'on-input-complete + :prompt (format nil + (n_ "Delete ~a temporary file? [y/N] " + "Delete ~a temporary files? [y/N] " + temporary-files-count) + temporary-files-count))) + (push-event (make-instance 'quit-program-event)))))) + (defun clean-close-program () "Use this to close the program" (flet ((on-input-complete (maybe-accepted) - (if (boolean-input-accepted-p maybe-accepted) - (let ((delete-event (make-instance 'delete-all-status-event)) - (quit-event (make-instance 'quit-program-event))) - (push-event delete-event) - (push-event quit-event)) - (quit-program)))) + (when (boolean-input-accepted-p maybe-accepted) + (let ((delete-event (make-instance 'delete-all-status-event))) + (push-event delete-event) + (clean-temporary-files))))) (let ((delete-count (db:count-status-marked-to-delete))) (if (> delete-count 0) (ask-string-input #'on-input-complete @@ -44,7 +67,7 @@ "Delete ~a messages? [y/N] " delete-count) delete-count)) - (quit-program))))) + (clean-temporary-files))))) (defun notify (message &key (life nil) (as-error nil) (priority +standard-event-priority+)) (let ((event (make-instance 'notify-user-event