(in-package :fomus-test) (defvar *md5-data-path* (merge-pathnames #P"md5-data.lisp" (asdf:component-pathname (asdf:find-system :fomus-test)))) (defvar *md5-hash* (make-hash-table :test #'equal)) (export 'load-md5-hash) (defun load-md5-hash () "Loads the md5-hash from disk. Done automatically, when loading fomus-test." (setq *md5-hash* (with-open-file (in *md5-data-path*) (hash-from-stream in)))) (export 'save-md5-hash) (defun save-md5-hash () "Saves the md5-hash to disk. Needs to be called explicitly, before quitting fomus test." (with-open-file (out *md5-data-path* :direction :output :if-exists :supersede) (hash-to-stream *md5-hash* out))) (export 'md5-hash-needs-saving-p) (defun md5-hash-needs-saving-p () "Has the hash in RAM changed compared to the disk one?" (not (equalp *md5-hash* (with-open-file (in *md5-data-path*) (hash-from-stream in))))) (defun md5-hash-compare (test backend checksum) (let ((stored-checksum (gethash (cons test backend) *md5-hash*))) (cond ((null stored-checksum) (setf (gethash (cons test backend) *md5-hash*) checksum) t) ((equalp stored-checksum checksum) t) (t (if *md5-learn-checksums* (progn (setf (gethash (cons test backend) *md5-hash*) checksum) t) nil))))) ;;; load it now... (load-md5-hash)