]> git.eshelyaron.com Git - emacs.git/commitdiff
:ensure can be a list; correct handling of multiple :ensure keywords
authorJohn Wiegley <johnw@newartisans.com>
Mon, 4 Dec 2017 19:26:19 +0000 (11:26 -0800)
committerJohn Wiegley <johnw@newartisans.com>
Mon, 4 Dec 2017 19:26:19 +0000 (11:26 -0800)
Fixes https://github.com/jwiegley/use-package/issues/539

up-ensure.el
up-tests.el

index fa19e1d5a8e0136341f3a9d940bbfaff8d501df9..30f2190e9220cb2f24938b318d57626959f86b7d 100644 (file)
@@ -33,6 +33,7 @@
 
 ;;; Code:
 
+(require 'cl-lib)
 (require 'up-core)
 
 (defgroup use-package-ensure nil
@@ -58,9 +59,9 @@ See also `use-package-defaults', which uses this value."
 (defcustom use-package-ensure-function 'use-package-ensure-elpa
   "Function that ensures a package is installed.
 This function is called with three arguments: the name of the
-package declared in the `use-package' form; the argument passed
-to `:ensure'; and the current `state' plist created by previous
-handlers.
+package declared in the `use-package' form; the arguments passed
+to all `:ensure' keywords (always a list, even if only one); and
+the current `state' plist created by previous handlers.
 
 Note that this function is called whenever `:ensure' is provided,
 even if it is nil. It is up to the function to decide on the
@@ -136,38 +137,43 @@ manually updated package."
       t
     (use-package-only-one (symbol-name keyword) args
       #'(lambda (label arg)
-          (if (symbolp arg)
-              arg
+          (cond
+           ((symbolp arg)
+            (list arg))
+           ((and (listp arg) (cl-every #'symbolp arg))
+            arg)
+           (t
             (use-package-error
              (concat ":ensure wants an optional package name "
-                     "(an unquoted symbol name)")))))))
-
-(defun use-package-ensure-elpa (name ensure state &optional no-refresh)
-  (let ((package
-         (or (and (eq ensure t) (use-package-as-symbol name))
-             ensure)))
-    (when package
-      (require 'package)
-      (unless (package-installed-p package)
-        (condition-case-unless-debug err
-            (progn
-              (when (assoc package (bound-and-true-p
-                                    package-pinned-packages))
-                (package-read-all-archive-contents))
-              (if (assoc package package-archive-contents)
-                  (package-install package)
-                (package-refresh-contents)
+                     "(an unquoted symbol name)"))))))))
+
+(defun use-package-ensure-elpa (name args state &optional no-refresh)
+  (dolist (ensure args)
+    (let ((package
+           (or (and (eq ensure t) (use-package-as-symbol name))
+               ensure)))
+      (when package
+        (require 'package)
+        (unless (package-installed-p package)
+          (condition-case-unless-debug err
+              (progn
                 (when (assoc package (bound-and-true-p
                                       package-pinned-packages))
                   (package-read-all-archive-contents))
-                (package-install package))
-              t)
-          (error
-           (ignore
-            (display-warning 'use-package
-                             (format "Failed to install %s: %s"
-                                     name (error-message-string err))
-                             :error))))))))
+                (if (assoc package package-archive-contents)
+                    (package-install package)
+                  (package-refresh-contents)
+                  (when (assoc package (bound-and-true-p
+                                        package-pinned-packages))
+                    (package-read-all-archive-contents))
+                  (package-install package))
+                t)
+            (error
+             (ignore
+              (display-warning 'use-package
+                               (format "Failed to install %s: %s"
+                                       name (error-message-string err))
+                               :error)))))))))
 
 (defun use-package-handler/:ensure (name keyword ensure rest state)
   (let* ((body (use-package-process-keywords name rest state)))
@@ -184,7 +190,7 @@ manually updated package."
     body))
 
 (add-to-list 'use-package-defaults
-             '(:ensure use-package-always-ensure
+             '(:ensure (list use-package-always-ensure)
                        (lambda (args)
                          (and use-package-always-ensure
                               (not (plist-member args :load-path))))) t)
index 3bcc340eaca06feaa52844a891b3755f53f3586b..efefd07612cdcef70db75730856f92f67101bee1 100644 (file)
   (flet ((norm (&rest args)
                (apply #'use-package-normalize/:ensure
                       'foopkg :ensure args)))
-    (should (equal (norm '(t)) t))
-    (should (equal (norm '(nil)) nil))
-    (should (equal (norm '(sym)) 'sym))
+    (should (equal (norm '(t)) '(t)))
+    (should (equal (norm '(nil)) '(nil)))
+    (should (equal (norm '(sym)) '(sym)))
     (should-error (norm '(1)))
     (should-error (norm '("Hello")))))
 
     (match-expansion
      (use-package foo :ensure t)
      `(progn
-        (use-package-ensure-elpa 'foo 't 'nil)
+        (use-package-ensure-elpa 'foo '(t) 'nil)
         (require 'foo nil nil)))))
 
 (ert-deftest use-package-test/:ensure-2 ()
     (match-expansion
      (use-package foo :ensure t)
      `(progn
-        (use-package-ensure-elpa 'foo 't 'nil)
+        (use-package-ensure-elpa 'foo '(t) 'nil)
         (require 'foo nil nil)))))
 
 (ert-deftest use-package-test/:ensure-3 ()
     (match-expansion
      (use-package foo :ensure nil)
      `(progn
-        (use-package-ensure-elpa 'foo 'nil 'nil)
+        (use-package-ensure-elpa 'foo '(nil) 'nil)
         (require 'foo nil nil)))))
 
 (ert-deftest use-package-test/:ensure-4 ()
     (match-expansion
      (use-package foo :ensure nil)
      `(progn
-        (use-package-ensure-elpa 'foo 'nil 'nil)
+        (use-package-ensure-elpa 'foo '(nil) 'nil)
         (require 'foo nil nil)))))
 
 (ert-deftest use-package-test/:ensure-5 ()
     (match-expansion
      (use-package foo :ensure nil :load-path "foo")
      `(progn
-        (use-package-ensure-elpa 'foo 'nil 'nil)
+        (use-package-ensure-elpa 'foo '(nil) 'nil)
         (eval-and-compile
           (add-to-list 'load-path ,(pred stringp)))
         (require 'foo nil nil)))))
     (match-expansion
      (use-package foo :ensure nil :load-path "foo")
      `(progn
-        (use-package-ensure-elpa 'foo 'nil 'nil)
+        (use-package-ensure-elpa 'foo '(nil) 'nil)
         (eval-and-compile
           (add-to-list 'load-path ,(pred stringp)))
         (require 'foo nil nil)))))
     (match-expansion
      (use-package foo :ensure t :load-path "foo")
      `(progn
-        (use-package-ensure-elpa 'foo 't 'nil)
+        (use-package-ensure-elpa 'foo '(t) 'nil)
         (eval-and-compile
           (add-to-list 'load-path ,(pred stringp)))
         (require 'foo nil nil)))))
     (match-expansion
      (use-package foo :ensure t :load-path "foo")
      `(progn
-        (use-package-ensure-elpa 'foo 't 'nil)
+        (use-package-ensure-elpa 'foo '(t) 'nil)
         (eval-and-compile
           (add-to-list 'load-path ,(pred stringp)))
         (require 'foo nil nil)))))
       (use-package foo :ensure t)
       (should (eq tried-to-install 'foo)))))
 
+(ert-deftest use-package-test/:ensure-12 ()
+  (let ((use-package-always-ensure t))
+    (match-expansion
+     (use-package foo :ensure bar)
+     `(progn
+        (use-package-ensure-elpa 'foo '(bar) 'nil)
+        (require 'foo nil nil)))))
+
+(ert-deftest use-package-test/:ensure-13 ()
+  (let ((use-package-always-ensure t))
+    (match-expansion
+     (use-package foo :ensure bar :ensure quux)
+     `(progn
+        (use-package-ensure-elpa 'foo '(bar quux) 'nil)
+        (require 'foo nil nil)))))
+
+(ert-deftest use-package-test/:ensure-14 ()
+  (let ((use-package-always-ensure t))
+    (match-expansion
+     (use-package foo :ensure bar :ensure (quux bow))
+     `(progn
+        (use-package-ensure-elpa 'foo '(bar quux bow) 'nil)
+        (require 'foo nil nil)))))
+
 (ert-deftest use-package-test/:if-1 ()
   (match-expansion
    (use-package foo :if t)
        (bind-keys :package mu4e
                   ("<f9>" . mu4e))))))
 
-(ert-deftest use-package-test/539 ()
-  (match-expansion
-   (use-package foo
-     :requires bar
-     :after quux
-     :ensure bow)
-   `(progn
-      (use-package-ensure-elpa 'foo 'bow 'nil)
-      (when (featurep 'bar)
-        (eval-after-load 'quux
-          '(require 'foo nil nil))))))
-
 ;; Local Variables:
 ;; indent-tabs-mode: nil
 ;; no-byte-compile: t