emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/bash-completion 8ddd315e17 1/6: Stop storing the result of


From: ELPA Syncer
Subject: [nongnu] elpa/bash-completion 8ddd315e17 1/6: Stop storing the result of complete -p.
Date: Thu, 26 Jan 2023 15:58:45 -0500 (EST)

branch: elpa/bash-completion
commit 8ddd315e17a60a759042bee89b70d2ce1f651c28
Author: Stephane Zermatten <szermatt@gmx.net>
Commit: Stephane Zermatten <stephane@fuzzy.zia>

    Stop storing the result of complete -p.
    
    Before this change, bash-completion.el would run "complete -p" once when
    initializing the connection to the Bash process and remember the result.
    
    With this change, bash-completion.el calls "complete -p <commandname>"
    for every command that's executed.
    
    This avoids ever getting into situations where what Emacs thinks the
    bash completion configuration is and what they really are doesn't match,
    which can very easily happen when bash-completion-use-separate-processes
    is set to nil.
    
    This change leaves bash-completion-build-alist untouched for now, even
    though an alist is not necessary anymore.
---
 bash-completion.el           |  26 ++++----
 test/bash-completion-test.el | 137 +++++++++++++++++++++----------------------
 2 files changed, 78 insertions(+), 85 deletions(-)

diff --git a/bash-completion.el b/bash-completion.el
index db15552bd1..6418723395 100644
--- a/bash-completion.el
+++ b/bash-completion.el
@@ -354,9 +354,6 @@ returned."
 
 (defun bash-completion--setup-bash-common (process)
   "Setup PROCESS to be ready for completion."
-  (bash-completion-send "complete -p" process)
-  (process-put process 'complete-p
-               (bash-completion-build-alist (bash-completion--get-buffer 
process)))
   (unless (zerop
            (bash-completion-send "[[ ${BASH_VERSINFO[0]} -ge 4 ]]" process))
     (error "bash-completion.el requires at least Bash 4."))
@@ -873,9 +870,8 @@ The result is a list of candidates, which might be empty."
       ;; Special 'retry-completion' exit status, typically returned by
       ;; functions bound by complete -D. Presumably, the function has
       ;; just setup completion for the current command and is asking
-      ;; us to retry once with the new configuration.
-      (bash-completion-send "complete -p" process cmd-timeout comp)
-      (process-put process 'complete-p (bash-completion-build-alist buffer))
+      ;; us to retry once with the new configuration, retrieved by
+      ;; bash-completion--customize.
       (bash-completion--customize comp process 'nodefault)
       (setq completion-status (bash-completion-send
                                (bash-completion-generate-line comp)
@@ -1314,14 +1310,13 @@ The returned alist is a slightly parsed version of the 
output of
 
 (defun bash-completion--customize (comp process &optional nodefault)
   (unless (eq 'command (bash-completion--type comp))
-    (let ((compgen-args-alist
-           (process-get process 'complete-p))
-          (command-name (bash-completion--command comp)))
-      ;; TODO: first lookup the full command path, then only the
-      ;; command name.
-      (setf (bash-completion--compgen-args comp)
-            (or (cdr (assoc command-name compgen-args-alist))
-                (and (not nodefault) (cdr (assoc nil compgen-args-alist))))))))
+    (bash-completion-send
+     (concat "complete -p "
+             (bash-completion-quote (bash-completion--command comp))
+             " 2>/dev/null || complete -p -D"))
+    (setf (bash-completion--compgen-args comp)
+          (cdr (car (bash-completion-build-alist
+                     (bash-completion--get-buffer process)))))))
 
 (defun bash-completion-generate-line (comp)
   "Generate a bash command to call \"compgen\" for COMP.
@@ -1576,8 +1571,7 @@ Return the status code of the command, as a number."
     (bash-completion--debug-print-info 'use-separate-processes)
     (bash-completion--debug-print 'emacs-version emacs-version)
     (bash-completion--debug-print-procinfo 'completion-ignore-case)
-    (bash-completion--debug-print-info 'context)
-    (bash-completion--debug-print-procinfo 'complete-p)))
+    (bash-completion--debug-print-info 'context)))
 
 (defun bash-completion--debug-print-info (symbol &optional eof)
   "Print variable SYMBOL from `bash-completion-debug-info'.
diff --git a/test/bash-completion-test.el b/test/bash-completion-test.el
index 7d477d8f79..ad792b4893 100644
--- a/test/bash-completion-test.el
+++ b/test/bash-completion-test.el
@@ -452,30 +452,6 @@ garbage
                :stub "worl"
                :unparsed-stub "worl"))))))
 
-(ert-deftest bash-completion-customize-test ()
-  (cl-letf (((symbol-function 'process-get)
-             (lambda (process prop)
-               (cond
-                ((and (eq 'process process)
-                      (eq 'complete-p prop))
-                 '((nil "-F" "__default")
-                   ("zorg" "-F" "__zorg")))
-                ((and (eq 'process process)
-                      (eq 'wordbreaks prop)) "\"'@><=;|&(:")
-                (t (error "unexpected: (process-get %s %s)"
-                          process prop))))))
-    (let ((comp (bash-completion--make :cword 1)))
-      (setf (bash-completion--words comp) '("zorg" "world"))
-      (bash-completion--customize comp 'process)
-      (should (equal '("-F" "__zorg") (bash-completion--compgen-args comp)))
-
-      (setf (bash-completion--words comp) '("notzorg" "world"))
-      (bash-completion--customize comp 'process)
-      (should (equal '("-F" "__default") (bash-completion--compgen-args comp)))
-
-      (bash-completion--customize comp 'process 'nodefault)
-      (should (null (bash-completion--compgen-args comp))))))
-
 (ert-deftest bash-completion--find-last-test ()
   (should (equal nil (bash-completion--find-last ?a "xxxxx")))
   (should (equal 3 (bash-completion--find-last ?d "abcdef")))
@@ -924,7 +900,6 @@ The body is run with a test buffer as current buffer. Fill 
it with the command-l
 before calling `bash-completion-dynamic-complete-nocomint'.
 "
   `(let ((default-directory "/tmp/test")
-         (bash-completion-alist '())
          (bash-completion-use-separate-processes t)
          (wordbreaks "@><=;|&(:")
          (bash-completion-nospace nil))
@@ -940,14 +915,10 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
            (cl-letf (((symbol-function 'bash-completion--get-process) (lambda 
() 'process))
                      ((symbol-function 'process-put)
                       (lambda (process prop value)
-                        (cond ((and (eq 'process process) (eq 'complete-p 
prop))
-                               (setq bash-completion-alist value))
-                              (t (error "unexpected: (process-put %s %s)" 
process prop)))))
+                        (error "unexpected: (process-put %s %s)" process 
prop)))
                      ((symbol-function 'process-get)
                       (lambda (process prop)
                         (cond
-                         ((and (eq 'process process) (eq 'complete-p prop))
-                          bash-completion-alist)
                          ((and (eq 'process process) (eq 'wordbreaks prop))
                           wordbreaks)
                          ((and (eq 'process process) (eq 
'completion-ignore-case prop))
@@ -961,14 +932,27 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
                       (lambda (commandline &optional process timeout 
debug-context)
                         (with-current-buffer --process-buffer
                           (delete-region (point-min) (point-max))
-                          (insert (pop --send-results))
-                          (push commandline --captured-commands)
+                          (let ((cell --send-results)
+                                (found nil))
+                            (while (and (not found) cell)
+                              (let ((result (car cell)))
+                                (setq cell (cdr cell))
+                                (when (and (cdr result)
+                                           (string-match-p (car result) 
commandline))
+                                  (insert (cdr result))
+                                  (setcdr result nil)
+                                  (push commandline --captured-commands)
+                                  (setq found t))))
+                            (unless found
+                              (error "nothing for '%s' in --send-results (%s)"
+                                     commandline --send-results)))
                           0))))
              (progn ,@body)))))))
 
 (ert-deftest bash-completion-simple-complete-test ()
   (--with-fake-bash-completion-send
-   (push "hell\nhello1\nhello2\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "hell\nhello1\nhello2\n") --send-results)
    (insert "$ cat he")
    (should (equal
             (list 7 9 '("hell" "hello1" "hello2"))
@@ -978,7 +962,8 @@ before calling `bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-simple-dynamic-table-test ()
   (--with-fake-bash-completion-send
-   (push "hell\nhello1\nhello2\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "hell\nhello1\nhello2\n") --send-results)
    (insert "$ cat he")
    (pcase-let ((`(,stub-start ,stub-end ,completions)
                 (bash-completion-dynamic-complete-nocomint
@@ -990,7 +975,8 @@ before calling `bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-single-completion-test ()
   (--with-fake-bash-completion-send
-   (push "hello\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "hello\n") --send-results)
    (insert "$ cat he")
    (should (equal
             '("hello ")
@@ -999,7 +985,8 @@ before calling `bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-single-completion-double-quotes ()
   (--with-fake-bash-completion-send
-   (push "hello\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "hello\n") --send-results)
    (insert "$ cat \"he")
    (should (equal
             '("\"hello\" ")
@@ -1007,7 +994,8 @@ before calling `bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-single-completion-single-quotes ()
   (--with-fake-bash-completion-send
-   (push "hello\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "hello\n") --send-results)
    (insert "$ cat 'he")
    (should (equal
             '("'hello' ")
@@ -1015,7 +1003,8 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-completion-with-double-quotes ()
   (--with-fake-bash-completion-send
-   (push "hell\nhello\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "hell\nhello\n") --send-results)
    (insert "$ cat \"he")
    (should (equal
             '("\"hell\"" "\"hello\"")
@@ -1023,7 +1012,8 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-trailing-default-completion ()
   (--with-fake-bash-completion-send
-   (push "without space\nwith space \nwith slash/\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "without space\nwith space \nwith slash/\n") 
--send-results)
    (insert "$ ls with")
    (let ((bash-completion-nospace nil))
      (should (equal
@@ -1032,7 +1022,8 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-trailing-default-completion-nospace ()
   (--with-fake-bash-completion-send
-   (push "without space\nwith space \nwith slash/\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "without space\nwith space \nwith slash/\n") 
--send-results)
    (insert "$ ls with")
    (let ((bash-completion-nospace t))
      (should (equal
@@ -1041,8 +1032,8 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-trailing-custom-completion ()
   (--with-fake-bash-completion-send
-   (setq bash-completion-alist '(("ls" "compgen" "args")))
-   (push "without space\nwith space \nwith slash/\n" --send-results)
+   (push '("complete -p" . "complete -compgen -args ls\n") --send-results)
+   (push '("compgen -compgen -args" . "without space\nwith space \nwith 
slash/\n") --send-results)
    (insert "$ ls with")
    (let ((bash-completion-nospace nil))
      (should (equal
@@ -1051,8 +1042,8 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-trailing-custom-completion-nospace ()
   (--with-fake-bash-completion-send
-   (setq bash-completion-alist '(("ls" "compgen" "args")))
-   (push "without space\nwith space \nwith slash/\n" --send-results)
+   (push '("complete -p" . "complete -compgen -args ls\n") --send-results)
+   (push '("compgen -compgen -args" . "without space\nwith space \nwith 
slash/\n") --send-results)
    (insert "$ ls with")
    (let ((bash-completion-nospace t))
      (should (equal
@@ -1061,8 +1052,8 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-trailing-custom-flag-completion ()
   (--with-fake-bash-completion-send
-   (setq bash-completion-alist '(("ls" "compgen" "args")))
-   (push "--color\n--color=\n" --send-results)
+   (push '("complete -p" . "complete -compgen -args ls\n") --send-results)
+   (push '("compgen -compgen -args" . "--color\n--color=\n") --send-results)
    (insert "$ ls --c")
    (let ((bash-completion-nospace nil))
      (should (equal
@@ -1073,20 +1064,22 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
   (--with-fake-bash-completion-send
    (push "/tmp/test/Documents" --directories)
    (push "/tmp/test/Documents/Modes d'emplois" --directories)
-   (push "/tmp/test/Documents\n" --send-results)
-   (push "Documents\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "/tmp/test/Documents\n") --send-results)
+   (push '("compgen" . "Documents\n") --send-results)
    (insert "$ cat Doc")
    (should (equal
             '(7 10 ("Documents/"))
             (bash-completion-dynamic-complete-nocomint 3 (point))))
    (insert "uments/")
-   (push "Documents/Modes d'emplois\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "Documents/Modes d'emplois\n") --send-results)
    (should (equal
             '("Documents/Modes\\ d\\'emplois/")
             (nth 2 (bash-completion-dynamic-complete-nocomint 3 (point)))))
    (insert "Modes\\ d\\'emplois/")
-   (push "Documents/Modes d'emplois/KAR 1.pdf\nDocuments/Modes d'emplois/KAR 
2.pdf\n"
-         --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "Documents/Modes d'emplois/KAR 1.pdf\nDocuments/Modes 
d'emplois/KAR 2.pdf\n") --send-results)
    (should (equal
             '("Documents/Modes\\ d\\'emplois/KAR\\ 1.pdf"
               "Documents/Modes\\ d\\'emplois/KAR\\ 2.pdf")
@@ -1101,20 +1094,22 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
   (--with-fake-bash-completion-send
    (push "/tmp/test/Documents" --directories)
    (push "/tmp/test/Documents/Modes d'emplois" --directories)
-   (push "/tmp/test/Documents\n" --send-results)
-   (push "Documents\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "/tmp/test/Documents\n") --send-results)
+   (push '("compgen" . "Documents\n") --send-results)
    (insert "$ cat 'Doc")
    (should (equal
             '(7 11 ("'Documents/"))
             (bash-completion-dynamic-complete-nocomint 3 (point))))
    (insert "uments/")
-   (push "Documents/Modes d'emplois\n" --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "Documents/Modes d'emplois\n") --send-results)
    (should (equal
             '("'Documents/Modes d'\\''emplois/")
             (nth 2(bash-completion-dynamic-complete-nocomint 3 (point)))))
    (insert "Modes d'\\''emplois/")
-   (push "Documents/Modes d'emplois/KAR 1.pdf\nDocuments/Modes d'emplois/KAR 
2.pdf\n"
-         --send-results)
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "Documents/Modes d'emplois/KAR 1.pdf\nDocuments/Modes 
d'emplois/KAR 2.pdf\n") --send-results)
    (should (equal
             '("'Documents/Modes d'\\''emplois/KAR 1.pdf'"
               "'Documents/Modes d'\\''emplois/KAR 2.pdf'")
@@ -1123,7 +1118,7 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 (ert-deftest bash-completion-complete-command-with-dir ()
   (--with-fake-bash-completion-send
    (push "/tmp/test/bin" --directories)
-   (push "bin\nbind\n" --send-results)
+   (push '("compgen" . "bin\nbind\n") --send-results)
    (insert "$ b")
    (should (equal
             '("bin/" "bind")
@@ -1134,7 +1129,7 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-complete-command-with-space ()
   (--with-fake-bash-completion-send
-   (push "some command\n" --send-results)
+   (push '("compgen" . "some command\n") --send-results)
    (insert "$ some\\ c")
    (should (equal
             '("some\\ command ")
@@ -1145,15 +1140,18 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-failed-completion ()
   (--with-fake-bash-completion-send
-   (setq --send-results '("" "bad"))
+   (push '("complete -p" . "\n") --send-results)
+   (push '("compgen" . "\nbad\n") --send-results)
+   (push '("compgen" . "") --send-results)
    (insert "$ ls --")
    (should
     (null (nth 2 (bash-completion-dynamic-complete-nocomint 3 (point)))))))
 
 (ert-deftest bash-completion-wordbreak-completion ()
   (--with-fake-bash-completion-send
+   (push '("complete -p" . "\n") --send-results)
    (push "/tmp/test/bin" --directories)
-   (setq --send-results '("./binary\n./bind\n./bin\n"))
+   (push '("compgen" . "./binary\n./bind\n./bin\n") --send-results)
    (insert "$ export PATH=$PATH:./b")
    (should
     (equal '(21 24 ("./binary" "./bind" "./bin/"))
@@ -1161,8 +1159,9 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-single-wordbreak-completion ()
   (--with-fake-bash-completion-send
+   (push '("complete -p" . "\n") --send-results)
    (push "/tmp/test/bin" --directories)
-   (setq --send-results '("./world\n"))
+   (push '("compgen" . "./world\n") --send-results)
    (insert "$ set a=./hello:./w")
    (should
     (equal '(17 20 ("./world "))
@@ -1170,8 +1169,8 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-single-custom-completion ()
   (--with-fake-bash-completion-send
-   (setq bash-completion-alist '(("ls" "compgen" "args")))
-   (push "--escape\n" --send-results)
+   (push '("complete -p" . "complete -compgen -args ls\n") --send-results)
+   (push '("compgen -compgen -args" . "--escape\n") --send-results)
    (insert "$ ls --esc")
    (let ((bash-completion-nospace nil))
      (should (equal
@@ -1180,8 +1179,8 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-single-custom-completion-with-wordbreak-end ()
   (--with-fake-bash-completion-send
-   (setq bash-completion-alist '(("ls" "compgen" "args")))
-   (push "--color=\n" --send-results)
+   (push '("complete -p" . "complete -compgen -args ls\n") --send-results)
+   (push '("compgen -compgen -args" . "--color=\n") --send-results)
    (insert "$ ls --col")
    (let ((bash-completion-nospace nil))
      (should (equal
@@ -1190,8 +1189,8 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-single-custom-completion-as-directory-explicit ()
   (--with-fake-bash-completion-send
-   (setq bash-completion-alist '(("ls" "compgen" "args")))
-   (push "somedir/\n" --send-results)
+   (push '("complete -p" . "complete -compgen -args ls\n") --send-results)
+   (push '("compgen -compgen -args" . "somedir/\n") --send-results)
    (insert "$ ls some")
    (let ((bash-completion-nospace nil))
      (should (equal
@@ -1200,11 +1199,11 @@ before calling 
`bash-completion-dynamic-complete-nocomint'.
 
 (ert-deftest bash-completion-single-custom-completion-as-directory-with-option 
()
   (--with-fake-bash-completion-send
-   (setq bash-completion-alist '(("ls" "compgen" "args" "-o" "filenames")))
+   (push '("complete -p" . "complete -compgen -args -o filenames ls\n") 
--send-results)
    ;; note that adding a / after a completion is not always the right thing
    ;; to do. See github issue #19.
    (push "/tmp/test/somedir" --directories)
-   (push "somedir\n" --send-results)
+   (push '("compgen -compgen -args -o filenames" . "somedir\n") --send-results)
    (insert "$ ls some")
    (let ((bash-completion-nospace nil))
      (should (equal



reply via email to

[Prev in Thread] Current Thread [Next in Thread]