branch: elpa/hyperdrive
commit 7f2ab3a8b9fc912637aafcd6c361a97c01e317ab
Author: Adam Porter <a...@alphapapa.net>
Commit: Adam Porter <a...@alphapapa.net>

    Change: (hyperdrive-menu-bar-menu) Separate drive types
---
 hyperdrive.el | 195 ++++++++++++++++++++++++++++++----------------------------
 1 file changed, 102 insertions(+), 93 deletions(-)

diff --git a/hyperdrive.el b/hyperdrive.el
index 6c5b68022e..dc3ed311e2 100644
--- a/hyperdrive.el
+++ b/hyperdrive.el
@@ -827,8 +827,6 @@ The return value of this function is the retrieval buffer."
 
 ;;;;; `easy-menu' integration
 
-;; TODO: Separate writable/unwritable hyperdrives in sub-menu.
-
 (defvar hyperdrive-menu-bar-menu
   '("Hyperdrive"
     ("Gateway"
@@ -851,97 +849,108 @@ The return value of this function is the retrieval 
buffer."
                 "Drives (empty)"
               "Drives")
      :filter (lambda (_)
-               (cl-loop for drive in (sort (hash-table-values 
hyperdrive-hyperdrives)
-                                           (lambda (a b)
-                                             (string< (hyperdrive--format-host 
a :with-label t)
-                                                      (hyperdrive--format-host 
b :with-label t))))
-                        for entry = (hyperdrive-entry-create :hyperdrive drive)
-                        collect (list (hyperdrive--format-host drive 
:with-label t)
-                                      (vector "Describe"
-                                              `(lambda ()
-                                                 (interactive)
-                                                 (let 
((hyperdrive-current-entry ,entry))
-                                                   (call-interactively 
#'hyperdrive-describe-hyperdrive)))
-                                              :help "Display information about 
hyperdrive")
-                                      (vector "Find File"
-                                              `(lambda ()
-                                                 (interactive)
-                                                 (hyperdrive-open
-                                                   (hyperdrive-read-entry
-                                                    :hyperdrive ,drive
-                                                    :read-version 
current-prefix-arg)))
-                                              :help "Find a file in 
hyperdrive")
-                                      (vector "View File"
-                                              `(lambda ()
-                                                 (interactive)
-                                                 (hyperdrive-view-file
-                                                  (hyperdrive-read-entry
-                                                   :hyperdrive ,drive
-                                                   :read-version 
current-prefix-arg)))
-                                              :help "View a file in 
hyperdrive")
-                                      "---"
-                                      (vector "Upload File"
-                                              `(lambda ()
-                                                 (interactive)
-                                                 (let* ((filename 
(read-file-name "Upload file: "))
-                                                        (entry 
(hyperdrive-read-entry :hyperdrive ,drive
-                                                                               
       :default-path (file-name-nondirectory filename)
-                                                                               
       :latest-version t)))
-                                                   (hyperdrive-upload-file 
filename entry)))
-                                              :active `(hyperdrive-writablep 
,drive)
-                                              :help "Upload a file to 
hyperdrive")
-                                      (vector "Upload Files"
-                                              `(lambda ()
-                                                 (interactive)
-                                                 (let* ((files 
(hyperdrive-read-files))
-                                                        (target-dir 
(hyperdrive-read-path
-                                                                     
:hyperdrive ,drive
-                                                                     :prompt 
"Target directory in «%s»"
-                                                                     :default 
"/")))
-                                                   (hyperdrive-upload-files 
files ,drive
-                                                                            
:target-directory target-dir)))
-                                              :active `(hyperdrive-writablep 
,drive)
-                                              :help "Upload files to 
hyperdrive")
-                                      (vector "Mirror" #'hyperdrive-mirror
-                                              ;; TODO: `hyperdrive-mirror''s 
interactive form will also prompt
-                                              ;; for a drive. After changing 
`hyperdrive-mirror' to use
-                                              ;; Transient.el, we should pass 
in the default drive argument.
-                                              :active `(hyperdrive-writablep 
,drive)
-                                              :help "Mirror a directory to 
hyperdrive")
-                                      "---"
-                                      (vector "Petname"
-                                              ;; HACK: We have to unquote the 
value of the entry because it seems that the filter
-                                              ;; function is called in an 
environment that doesn't use lexical-binding...?
-                                              ;; TODO: Ask about this and/or 
file a bug report.
-                                              `(lambda ()
-                                                 (interactive)
-                                                 (let 
((hyperdrive-current-entry ,entry))
-                                                   (call-interactively 
#'hyperdrive-set-petname)))
-                                              :help "Set petname for 
hyperdrive"
-                                              :label
-                                              (format "Set petname: «%s»"
-                                                      (pcase 
(hyperdrive-petname drive)
-                                                        (`nil "none")
-                                                        (it it))))
-                                      (vector "Nickname"
-                                              `(lambda ()
-                                                 (interactive)
-                                                 (let 
((hyperdrive-current-entry ,entry))
-                                                   (call-interactively 
#'hyperdrive-set-nickname)))
-                                              :help "Set nickname for 
hyperdrive"
-                                              :active (hyperdrive-writablep 
drive)
-                                              :label
-                                              (format "Set nickname: «%s»"
-                                                      (pcase (alist-get 'name 
(hyperdrive-metadata drive))
-                                                        (`nil "none")
-                                                        (it it))))
-                                      "---"
-                                      (vector "Purge"
-                                              `(lambda ()
-                                                 (interactive)
-                                                 (let 
((hyperdrive-current-entry ,entry))
-                                                   (call-interactively 
#'hyperdrive-purge)))
-                                              :help "Purge all local data 
about hyperdrive")))))
+               (cl-labels ((list-drives (drives)
+                             (cl-loop for drive in drives
+                                      for entry = (hyperdrive-entry-create 
:hyperdrive drive)
+                                      collect (list (hyperdrive--format-host 
drive :with-label t)
+                                                    (vector "Describe"
+                                                            `(lambda ()
+                                                               (interactive)
+                                                               (let 
((hyperdrive-current-entry ,entry))
+                                                                 
(call-interactively #'hyperdrive-describe-hyperdrive)))
+                                                            :help "Display 
information about hyperdrive")
+                                                    (vector "Find File"
+                                                            `(lambda ()
+                                                               (interactive)
+                                                               (hyperdrive-open
+                                                                 
(hyperdrive-read-entry
+                                                                  :hyperdrive 
,drive
+                                                                  
:read-version current-prefix-arg)))
+                                                            :help "Find a file 
in hyperdrive")
+                                                    (vector "View File"
+                                                            `(lambda ()
+                                                               (interactive)
+                                                               
(hyperdrive-view-file
+                                                                
(hyperdrive-read-entry
+                                                                 :hyperdrive 
,drive
+                                                                 :read-version 
current-prefix-arg)))
+                                                            :help "View a file 
in hyperdrive")
+                                                    "---"
+                                                    (vector "Upload File"
+                                                            `(lambda ()
+                                                               (interactive)
+                                                               (let* 
((filename (read-file-name "Upload file: "))
+                                                                      (entry 
(hyperdrive-read-entry :hyperdrive ,drive
+                                                                               
                     :default-path (file-name-nondirectory filename)
+                                                                               
                     :latest-version t)))
+                                                                 
(hyperdrive-upload-file filename entry)))
+                                                            :active 
`(hyperdrive-writablep ,drive)
+                                                            :help "Upload a 
file to hyperdrive")
+                                                    (vector "Upload Files"
+                                                            `(lambda ()
+                                                               (interactive)
+                                                               (let* ((files 
(hyperdrive-read-files))
+                                                                      
(target-dir (hyperdrive-read-path
+                                                                               
    :hyperdrive ,drive
+                                                                               
    :prompt "Target directory in «%s»"
+                                                                               
    :default "/")))
+                                                                 
(hyperdrive-upload-files files ,drive
+                                                                               
           :target-directory target-dir)))
+                                                            :active 
`(hyperdrive-writablep ,drive)
+                                                            :help "Upload 
files to hyperdrive")
+                                                    (vector "Mirror" 
#'hyperdrive-mirror
+                                                            ;; TODO: 
`hyperdrive-mirror''s interactive form will also prompt
+                                                            ;; for a drive. 
After changing `hyperdrive-mirror' to use
+                                                            ;; Transient.el, 
we should pass in the default drive argument.
+                                                            :active 
`(hyperdrive-writablep ,drive)
+                                                            :help "Mirror a 
directory to hyperdrive")
+                                                    "---"
+                                                    (vector "Petname"
+                                                            ;; HACK: We have 
to unquote the value of the entry because it seems that the filter
+                                                            ;; function is 
called in an environment that doesn't use lexical-binding...?
+                                                            ;; TODO: Ask about 
this and/or file a bug report.
+                                                            `(lambda ()
+                                                               (interactive)
+                                                               (let 
((hyperdrive-current-entry ,entry))
+                                                                 
(call-interactively #'hyperdrive-set-petname)))
+                                                            :help "Set petname 
for hyperdrive"
+                                                            :label
+                                                            (format "Set 
petname: «%s»"
+                                                                    (pcase 
(hyperdrive-petname drive)
+                                                                      (`nil 
"none")
+                                                                      (it 
it))))
+                                                    (vector "Nickname"
+                                                            `(lambda ()
+                                                               (interactive)
+                                                               (let 
((hyperdrive-current-entry ,entry))
+                                                                 
(call-interactively #'hyperdrive-set-nickname)))
+                                                            :help "Set 
nickname for hyperdrive"
+                                                            :active 
(hyperdrive-writablep drive)
+                                                            :label
+                                                            (format "Set 
nickname: «%s»"
+                                                                    (pcase 
(alist-get 'name (hyperdrive-metadata drive))
+                                                                      (`nil 
"none")
+                                                                      (it 
it))))
+                                                    "---"
+                                                    (vector "Purge"
+                                                            `(lambda ()
+                                                               (interactive)
+                                                               (let 
((hyperdrive-current-entry ,entry))
+                                                                 
(call-interactively #'hyperdrive-purge)))
+                                                            :help "Purge all 
local data about hyperdrive")))))
+                 (append (list ["Writable" :active nil])
+                         (or (list-drives (sort (cl-remove-if-not 
#'hyperdrive-writablep (hash-table-values hyperdrive-hyperdrives))
+                                                (lambda (a b)
+                                                  (string< 
(hyperdrive--format-host a :with-label t)
+                                                           
(hyperdrive--format-host b :with-label t)))))
+                             (list ["none" :active nil]))
+                         (list "---")
+                         (list ["Read-only" :active nil])
+                         (or (list-drives (sort (cl-remove-if 
#'hyperdrive-writablep (hash-table-values hyperdrive-hyperdrives))
+                                                (lambda (a b)
+                                                  (string< 
(hyperdrive--format-host a :with-label t)
+                                                           
(hyperdrive--format-host b :with-label t)))))
+                             (list ["none" :active nil]))))))
     ("Current"
      :active hyperdrive-current-entry
      :label (if-let* ((entry hyperdrive-current-entry))

Reply via email to