From 62d33b2143018e5ad23f0f34c84250c950f0d71b Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Mon, 4 Dec 2017 15:39:31 -0800 Subject: [PATCH] Support :ensure (pkg :pin archive) Fixes https://github.com/jwiegley/use-package/issues/506 --- etc/USE-PACKAGE-NEWS | 20 +++++++++ lisp/use-package/use-package-ensure.el | 23 +++++++---- test/lisp/use-package/use-package-tests.el | 48 ++++++++++++---------- 3 files changed, 61 insertions(+), 30 deletions(-) diff --git a/etc/USE-PACKAGE-NEWS b/etc/USE-PACKAGE-NEWS index 3bdd623adeb..28f76b942ea 100644 --- a/etc/USE-PACKAGE-NEWS +++ b/etc/USE-PACKAGE-NEWS @@ -50,6 +50,26 @@ for use by extension packages, indicates keywords that, if used without `:demand`, cause deferred loading (as if `:defer t` had been specified). +- The `:ensure` keyword now accepts a specific pinning sub-keyword. For + example: + + ``` elisp + (use-package foo + :pin "elpa") + ``` + + This ensure the package `foo` is installed from `"elpa"`. + + ``` elisp + (use-package foo + :ensure bar + :ensure (quux :pin "melpa")) + ``` + + This says that `foo` ensures that `bar` is installed, as well as `quux` from + `"melpa"`. It does *not* ensure that `foo` is installed, because explicit + `:ensure` keywords were given. + - New `:hook` keyword. - New `:catch` keyword. If `t` or `nil`, it enables (the default, see diff --git a/lisp/use-package/use-package-ensure.el b/lisp/use-package/use-package-ensure.el index 2ed34e4071e..083350edf9e 100644 --- a/lisp/use-package/use-package-ensure.el +++ b/lisp/use-package/use-package-ensure.el @@ -137,15 +137,17 @@ manually updated package." t (use-package-only-one (symbol-name keyword) args #'(lambda (label 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)")))))))) + (pcase arg + ((pred symbolp) + (list arg)) + (`(,(and pkg (pred symbolp)) + :pin ,(and repo (or (pred stringp) + (pred symbolp)))) + (list (cons pkg repo))) + (_ + (use-package-error + (concat ":ensure wants an optional package name " + "(an unquoted symbol name), or ( :pin )")))))))) (defun use-package-ensure-elpa (name args state &optional no-refresh) (dolist (ensure args) @@ -154,6 +156,9 @@ manually updated package." ensure))) (when package (require 'package) + (when (consp package) + (use-package-pin-package (car package) (cdr package)) + (setq package (car package))) (unless (package-installed-p package) (condition-case-unless-debug err (progn diff --git a/test/lisp/use-package/use-package-tests.el b/test/lisp/use-package/use-package-tests.el index 80bbb728675..51a57edb7d2 100644 --- a/test/lisp/use-package/use-package-tests.el +++ b/test/lisp/use-package/use-package-tests.el @@ -343,11 +343,33 @@ (require 'foo nil nil))))) (ert-deftest use-package-test/:ensure-14 () + (match-expansion + (use-package ess-site + :ensure ess1 + :ensure ess2 + :ensure (ess3 :pin "melpa-unstable") + :pin melpa-stable) + `(progn + (use-package-pin-package 'ess-site "melpa-stable") + (use-package-ensure-elpa 'ess-site + '(ess1 ess2 + (ess3 . "melpa-unstable")) + 'nil) + (require 'ess-site nil nil)))) + +(ert-deftest use-package-test/:ensure-15 () (let ((use-package-always-ensure t)) (match-expansion - (use-package foo :ensure bar :ensure (quux bow)) + (use-package foo + :pin "elpa" + :ensure bar + :ensure (quux :pin "melpa")) `(progn - (use-package-ensure-elpa 'foo '(bar quux bow) 'nil) + (use-package-pin-package 'foo "elpa") + (use-package-ensure-elpa 'foo + '(bar + (quux . "melpa")) + 'nil) (require 'foo nil nil))))) (ert-deftest use-package-test/:if-1 () @@ -1431,18 +1453,6 @@ (bind-key "f" #'w3m-lnum-print-this-url w3m-y-prefix-map nil) (bind-key "t" #'w3m-print-this-url w3m-y-prefix-map nil))))) -(ert-deftest use-package-test/506 () - (match-expansion - (use-package ess-site - :ensure ess - :pin melpa-stable) - `(progn - (use-package-pin-package 'ess-site "melpa-stable") - (use-package-ensure-elpa 'ess-site - '(ess) - 'nil) - (require 'ess-site nil nil)))) - (ert-deftest use-package-test/538 () (match-expansion (use-package mu4e @@ -1452,16 +1462,12 @@ :config (config)) `(progn - (unless - (fboundp 'mu4e) + (unless (fboundp 'mu4e) (autoload #'mu4e "mu4e" nil t)) (eval-after-load 'mu4e - '(progn - (config) - t)) + '(progn (config) t)) (ignore - (bind-keys :package mu4e - ("" . mu4e)))))) + (bind-keys :package mu4e ("" . mu4e)))))) ;; Local Variables: ;; indent-tabs-mode: nil -- 2.39.2