From: Artur Malabarba Date: Thu, 7 May 2015 15:11:50 +0000 (+0100) Subject: * lisp/emacs-lisp/package.el: New "external" package status X-Git-Tag: emacs-25.0.90~2162 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=14bb519;p=emacs.git * lisp/emacs-lisp/package.el: New "external" package status An external package is any installed package that's not built-in and not from `package-user-dir', which usually means it's from an entry in `package-directory-list'. They are treated much like built-in packages, in that they cannot be through the Package Menu deleted and are not considered for upgrades. (package-desc-status): Identify if a package is installed outside `package-user-dir'. (package-menu--print-info-simple) (package-menu--status-predicate): Add support for it. * etc/NEWS: Document it. --- diff --git a/etc/NEWS b/etc/NEWS index 3ab1f4b963d..48c3a2a5d2e 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -255,6 +255,17 @@ by default at least in Debian, for security reasons). ** package.el +*** New "external" package status. +An external package is any installed package that's not built-in and +not from `package-user-dir', which usually means it's from an entry in +`package-directory-list'. They are treated much like built-in +packages, in that they cannot be through the Package Menu deleted and +are not considered for upgrades. + +The effect, is that a user can manually place a specific version of a +package inside `package-directory-list' and the Package Menu will +always respect that. + *** If a package is available on multiple archives and one has higher priority (as per `package-archive-priorities') only that one is listed. This can be configured with `package-menu-hide-low-priority'. diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 7968ecde127..615631383e7 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -2457,7 +2457,9 @@ of these dependencies, similar to the list returned by (t "disabled")))) (dir ;One of the installed packages. (cond - ((not (file-exists-p (package-desc-dir pkg-desc))) "deleted") + ((not (file-exists-p dir)) "deleted") + ;; Not inside `package-user-dir'. + ((not (file-in-directory-p dir package-user-dir)) "external") ((eq pkg-desc (cadr (assq name package-alist))) (if (not signed) "unsigned" (if (package--user-selected-p name) @@ -2662,6 +2664,7 @@ Return (PKG-DESC [NAME VERSION STATUS DOC])." (let* ((status (package-desc-status pkg)) (face (pcase status (`"built-in" 'font-lock-builtin-face) + (`"external" 'font-lock-builtin-face) (`"available" 'default) (`"avail-obso" 'font-lock-comment-face) (`"new" 'bold) @@ -2977,6 +2980,8 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm." ((string= sB "unsigned") nil) ((string= sA "held") t) ((string= sB "held") nil) + ((string= sA "external") t) + ((string= sB "external") nil) ((string= sA "built-in") t) ((string= sB "built-in") nil) ((string= sA "obsolete") t)