branch: elpa/hyperdrive commit 2d3f038790afc86f7c0daa9d4dbaaeba6addd914 Author: Joseph Turner <jos...@ushin.org> Commit: Joseph Turner <jos...@ushin.org>
Change: (hyperdrive-delete) Move into hyperdrive.el and autoload --- hyperdrive-dir.el | 1 + hyperdrive-lib.el | 40 ---------------------------------------- hyperdrive-menu.el | 1 + hyperdrive.el | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 40 deletions(-) diff --git a/hyperdrive-dir.el b/hyperdrive-dir.el index 018a0da7a6..ff0c3963ed 100644 --- a/hyperdrive-dir.el +++ b/hyperdrive-dir.el @@ -233,6 +233,7 @@ With point on header, returns directory entry." (declare-function hyperdrive-find-file "hyperdrive") (declare-function hyperdrive-up "hyperdrive") +(declare-function hyperdrive-delete "hyperdrive") (declare-function hyperdrive-download "hyperdrive") (declare-function hyperdrive-describe-hyperdrive "hyperdrive-describe") ;; `hyperdrive-menu' is defined with `transient-define-prefix', which diff --git a/hyperdrive-lib.el b/hyperdrive-lib.el index f7cca8064b..09e3f1de94 100644 --- a/hyperdrive-lib.el +++ b/hyperdrive-lib.el @@ -877,46 +877,6 @@ HYPERDRIVE's public metadata file." (hyperdrive-persist hyperdrive) hyperdrive)) -(cl-defun hyperdrive-delete (entry &key (then #'ignore) (else #'ignore)) - "Delete ENTRY, then call THEN with response. -Call ELSE with `plz-error' struct if request fails. -Interactively, read ENTRY with `hyperdrive-read-entry'." - (declare (indent defun)) - (interactive - (let* ((entry (hyperdrive--context-entry)) - (description (hyperdrive-entry-description entry)) - (buffer (current-buffer))) - (when (and (hyperdrive--entry-directory-p entry) - (or (eq entry hyperdrive-current-entry) - (string= ".." (alist-get 'display-name (hyperdrive-entry-etc entry))))) - (hyperdrive-user-error "Won't delete from within")) - (when (and (yes-or-no-p (format "Delete «%s»? " description)) - (or (not (hyperdrive--entry-directory-p entry)) - (yes-or-no-p (format "Recursively delete «%s»? " description)))) - (list entry - :then (lambda (_) - (when (and (buffer-live-p buffer) - (eq 'hyperdrive-dir-mode (buffer-local-value 'major-mode buffer))) - (with-current-buffer buffer - (revert-buffer))) - (hyperdrive-message "Deleted: «%s» (Deleted files can be accessed from prior versions of the hyperdrive.)" description)) - :else (lambda (plz-error) - (hyperdrive-message "Unable to delete «%s»: %S" description plz-error)))))) - (hyperdrive-api 'delete (hyperdrive-entry-url entry) - :as 'response - :then (lambda (response) - (pcase-let* (((cl-struct plz-response headers) response) - ((map etag) headers) - (nonexistent-entry (hyperdrive-copy-tree entry t))) - (unless (hyperdrive--entry-directory-p entry) - ;; FIXME: hypercore-fetch bug doesn't update version - ;; number when deleting a directory. - (setf (hyperdrive-entry-version nonexistent-entry) (string-to-number etag)) - (hyperdrive--fill-latest-version (hyperdrive-entry-hyperdrive entry) headers) - (hyperdrive-update-nonexistent-version-range nonexistent-entry)) - (funcall then response))) - :else else)) - (cl-defun hyperdrive-purge-no-prompt (hyperdrive &key then else) "Purge all data corresponding to HYPERDRIVE, then call THEN with response. diff --git a/hyperdrive-menu.el b/hyperdrive-menu.el index 2b80674b7a..8a87f7ba72 100644 --- a/hyperdrive-menu.el +++ b/hyperdrive-menu.el @@ -38,6 +38,7 @@ ;;;; Declarations (declare-function hyperdrive-dir--entry-at-point "hyperdrive-dir") +(declare-function hyperdrive-delete "hyperdrive") (declare-function hyperdrive-set-nickname "hyperdrive") (declare-function hyperdrive-set-petname "hyperdrive") diff --git a/hyperdrive.el b/hyperdrive.el index fed152a496..360f18d54f 100644 --- a/hyperdrive.el +++ b/hyperdrive.el @@ -362,6 +362,47 @@ for more information. See `hyperdrive-read-entry' and (interactive (list (hyperdrive-read-url :prompt "Open hyperdrive URL"))) (hyperdrive-open (hyperdrive-url-entry url))) +;;;###autoload +(cl-defun hyperdrive-delete (entry &key (then #'ignore) (else #'ignore)) + "Delete ENTRY, then call THEN with response. +Call ELSE with `plz-error' struct if request fails. +Interactively, read ENTRY with `hyperdrive-read-entry'." + (declare (indent defun)) + (interactive + (let* ((entry (hyperdrive--context-entry)) + (description (hyperdrive-entry-description entry)) + (buffer (current-buffer))) + (when (and (hyperdrive--entry-directory-p entry) + (or (eq entry hyperdrive-current-entry) + (string= ".." (alist-get 'display-name (hyperdrive-entry-etc entry))))) + (hyperdrive-user-error "Won't delete from within")) + (when (and (yes-or-no-p (format "Delete «%s»? " description)) + (or (not (hyperdrive--entry-directory-p entry)) + (yes-or-no-p (format "Recursively delete «%s»? " description)))) + (list entry + :then (lambda (_) + (when (and (buffer-live-p buffer) + (eq 'hyperdrive-dir-mode (buffer-local-value 'major-mode buffer))) + (with-current-buffer buffer + (revert-buffer))) + (hyperdrive-message "Deleted: «%s» (Deleted files can be accessed from prior versions of the hyperdrive.)" description)) + :else (lambda (plz-error) + (hyperdrive-message "Unable to delete «%s»: %S" description plz-error)))))) + (hyperdrive-api 'delete (hyperdrive-entry-url entry) + :as 'response + :then (lambda (response) + (pcase-let* (((cl-struct plz-response headers) response) + ((map etag) headers) + (nonexistent-entry (hyperdrive-copy-tree entry t))) + (unless (hyperdrive--entry-directory-p entry) + ;; FIXME: hypercore-fetch bug doesn't update version + ;; number when deleting a directory. + (setf (hyperdrive-entry-version nonexistent-entry) (string-to-number etag)) + (hyperdrive--fill-latest-version (hyperdrive-entry-hyperdrive entry) headers) + (hyperdrive-update-nonexistent-version-range nonexistent-entry)) + (funcall then response))) + :else else)) + ;;;###autoload (defun hyperdrive-download (entry filename) "Download ENTRY to FILENAME on disk.