Prevent reading directorysizes so much
This commit is contained in:
@ -11,6 +11,9 @@
|
||||
(:import-from #:cl-xdg-trash/mountpoints
|
||||
#:file-or-dir-namestring
|
||||
#:ensure-nonwild-pathname)
|
||||
(:import-from #:cl-xdg-trash/directorysizes
|
||||
#:read-directorysizes-for-trash-directory
|
||||
#:write-directorysizes-for-trash-directory)
|
||||
(:use #:cl #:clash/parse-date #:clash/format)
|
||||
(:export #:toplevel))
|
||||
|
||||
@ -1036,4 +1039,5 @@ Args can be supplied to facilitate testing in SLIME."
|
||||
*toplevel/help-option*)))
|
||||
(if argsp
|
||||
(clingon:run (toplevel/command) args)
|
||||
(clingon:run (toplevel/command)))))
|
||||
(clingon:run (toplevel/command)))
|
||||
(flush-directorysizes-cache)))
|
||||
|
||||
@ -3,6 +3,8 @@
|
||||
(:import-from #:cl-xdg-trash/mountpoints
|
||||
#:file-or-dir-namestring)
|
||||
(:import-from #:cl-xdg-trash/directorysizes
|
||||
#:read-directorysizes-for-trash-directory
|
||||
#:write-directorysizes-for-trash-directory
|
||||
#:trashed-file-size)
|
||||
(:import-from #:cl-xdg-trash/trashinfo
|
||||
#:trashinfo-trash-directory
|
||||
@ -13,6 +15,7 @@
|
||||
#:trashinfo-trashed-file)
|
||||
(:use #:cl)
|
||||
(:export #:trashinfo-size
|
||||
#:flush-directorysizes-cache
|
||||
#:format-size
|
||||
#:parse-format-string
|
||||
#:option-format-string
|
||||
@ -28,6 +31,19 @@
|
||||
|
||||
(in-package :clash/format)
|
||||
|
||||
(defvar *directorysizes-cache* (make-hash-table :test #'equal)
|
||||
"Cache for directorysizes tables (trash-directory -> (need-flush . table)).")
|
||||
|
||||
(defun get-directorysizes-for-trashinfo (trashinfo)
|
||||
"Return a directorysizes table for the trash-directory of TRASHINFO."
|
||||
(let* ((trash-directory (trashinfo-trash-directory trashinfo))
|
||||
(cur-val (gethash trash-directory *directorysizes-cache*)))
|
||||
(if (hash-table-p cur-val)
|
||||
cur-val
|
||||
(setf (gethash trash-directory *directorysizes-cache*)
|
||||
(cons nil
|
||||
(read-directorysizes-for-trash-directory trash-directory))))))
|
||||
|
||||
(defvar *trashinfo-size-cache* (make-hash-table :test #'eq)
|
||||
"Cache for trashinfo sizes.")
|
||||
|
||||
@ -35,11 +51,26 @@
|
||||
"Return the size of TRASHINFO and cache it."
|
||||
(let ((res (gethash trashinfo *trashinfo-size-cache* :none)))
|
||||
(if (eq res :none)
|
||||
(setf (gethash trashinfo *trashinfo-size-cache*)
|
||||
(trashed-file-size (trashinfo-trash-directory trashinfo)
|
||||
(trashinfo-name trashinfo)))
|
||||
(let ((directorysizes-pair (get-directorysizes-for-trashinfo trashinfo)))
|
||||
(multiple-value-bind (size did-change)
|
||||
(trashed-file-size
|
||||
(trashinfo-trash-directory trashinfo)
|
||||
(trashinfo-name trashinfo)
|
||||
:directorysizes (cdr directorysizes-pair)
|
||||
:no-write t)
|
||||
(when did-change
|
||||
(setf (car directorysizes-pair) t))
|
||||
(setf (gethash trashinfo *trashinfo-size-cache*) size)))
|
||||
res)))
|
||||
|
||||
(defun flush-directorysizes-cache ()
|
||||
"Flush the cached directorysizes changes."
|
||||
(maphash (lambda (trash-directory directorysizes-pair)
|
||||
(when (car directorysizes-pair)
|
||||
(write-directorysizes-for-trash-directory
|
||||
trash-directory (cdr directorysizes-pair) t)))
|
||||
*directorysizes-cache*))
|
||||
|
||||
(defun format-size (count &optional base-two (places 2))
|
||||
"Pretty print COUNT, which is a number of bytes. This will append metric
|
||||
suffixes as necessary. If BASE-TWO is non-nil, use MiB, GiB, etc. suffixes
|
||||
|
||||
Reference in New Issue
Block a user