branch: elpa/hyperdrive commit 8363c8d2c7125683767af6d6dc1ae1f7e69feff6 Author: Joseph Turner <jos...@ushin.org> Commit: Joseph Turner <jos...@ushin.org>
Change: (-entry-version-ranges-no-gaps) Add cache-only option --- hyperdrive-lib.el | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/hyperdrive-lib.el b/hyperdrive-lib.el index 636c3d761a..64d35369a1 100644 --- a/hyperdrive-lib.el +++ b/hyperdrive-lib.el @@ -383,20 +383,33 @@ hyperdrive's latest-version slot, the final gap is filled." (push `(,(1+ final-known-range-end) . (:range-end ,latest-version , :existsp unknown)) ranges))) (nreverse ranges))) -(defun hyperdrive-entry-previous (entry) +(cl-defun hyperdrive-entry-previous (entry &key cache-only) "Return ENTRY at its hyperdrive's previous version, or nil. -If ENTRY is a directory, return a copy with decremented version." +If ENTRY is a directory, return a copy with decremented version. +If CACHE-ONLY, don't send a request to the gateway; only check +`hyperdrive-version-ranges'. In this case, return value may also +be \\+`unknown'." (if (hyperdrive--entry-directory-p entry) (pcase-let* (((cl-struct hyperdrive-entry hyperdrive path version) entry) (version (or version (hyperdrive-latest-version hyperdrive)))) (when (> version 1) (hyperdrive-entry-create :hyperdrive hyperdrive :path path :version (1- version)))) - (when-let ((previous-entry (hyperdrive-entry-at (1- (car (hyperdrive-entry-version-range entry))) entry))) - ;; TODO(A): Check `hyperdrive-version-ranges' to see if there are - ;; existing versions prior to nonexistent range - ;; Entry version is currently its range end, but it should be its version range start. - (setf (hyperdrive-entry-version previous-entry) (car (hyperdrive-entry-version-range previous-entry))) - previous-entry))) + (let ((previous-version (1- (car (hyperdrive-entry-version-range entry))))) + (pcase-exhaustive (hyperdrive-entry-version-range entry :version previous-version) + (`(,range-start . ,(map (:existsp existsp))) + (if existsp + ;; Return entry if it's known existent. + (hyperdrive-entry-at range-start entry) + ;; Return nil if it's known nonexistent. + nil)) + ('nil + ;; Entry is not known to exist, optionally send a request. + (if cache-only + 'unknown + (when-let ((previous-entry (hyperdrive-entry-at previous-version entry))) + ;; Entry version is currently its range end, but it should be its version range start. + (setf (hyperdrive-entry-version previous-entry) (car (hyperdrive-entry-version-range previous-entry))) + previous-entry))))))) (defun hyperdrive-entry-at (version entry) "Return ENTRY at its hyperdrive's VERSION, or nil if not found.