Package: emacs;
Reported by: Jorgen Schaefer <forcer <at> forcix.cx>
Date: Sun, 7 Dec 2014 13:24:01 UTC
Severity: wishlist
Tags: patch
Fixed in version 25.1
Done: Glenn Morris <rgm <at> gnu.org>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: Jorgen Schaefer <forcer <at> forcix.cx> To: 19296 <at> debbugs.gnu.org Subject: bug#19296: [PATCH] Package archives now have priorities. Date: Sun, 7 Dec 2014 13:31:50 +0100
When installing packages by name, only packages from archives with the highest priority are considered, before versions are compared. This solves the "MELPA problem", where MELPA assigns date-based version numbers to packages which override all other archives. Giving MELPA a lower priority means packages are installed from MELPA only when the package is not available from other archives. This can be overridden manually by the user. --- lisp/emacs-lisp/package.el | 45 ++++++++++++++++++++++++++++++++++++++-- test/automated/package-test.el | 17 +++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 4e5c397..2030482 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -228,6 +228,33 @@ a package can run arbitrary code." :group 'package :version "24.1") +(defcustom package-archive-default-priority 500 + "The default priority for archives. + +This is used if the archive is not found in +`package-archive-priorities'." + :type 'integer + :risky t + :group 'package + :version "25.1") + +(defcustom package-archive-priorities nil + "An alist of priorities for packages. + +Each element has the form (ARCHIVE-ID . PRIORITY). + +When installing packages, the package with the highest version +number from the archive with the highest priority is +selected. When higher versions are available from archives with +lower priorities, the user has to select those manually. + +Archives not in this list have the priority given in +`package-archive-default-priority'." + :type 'integer + :risky t + :group 'package + :version "25.1") + (defcustom package-pinned-packages nil "An alist of packages that are pinned to specific archives. This can be useful if you have multiple package archives enabled, @@ -1063,6 +1090,7 @@ Also, add the originating archive to the `package-desc' structure." ;; Older archive-contents files have only 4 ;; elements here. (package--ac-desc-extras (cdr package))))) + (archive-priority (package-archive-priority archive)) (existing-packages (assq name package-archive-contents)) (pinned-to-archive (assoc name package-pinned-packages))) (cond @@ -1075,8 +1103,12 @@ Also, add the originating archive to the `package-desc' structure." (t (while (if (and (cdr existing-packages) - (version-list-< - version (package-desc-version (cadr existing-packages)))) + (or (< archive-priority + (package-archive-priority + (package-desc-archive (cadr existing-packages)))) + (version-list-< + version + (package-desc-version (cadr existing-packages))))) (setq existing-packages (cdr existing-packages)) (push pkg-desc (cdr existing-packages)) nil)))))) @@ -1268,6 +1300,15 @@ The file can either be a tar file or an Emacs Lisp file." "Return the archive containing the package NAME." (cdr (assoc (package-desc-archive desc) package-archives))) +(defun package-archive-priority (archive) + "Return the priority of ARCHIVE. + +The archive priorities are specified in +`package-archive-priorities' and +`package-archive-default-priority'." + (or (cdr (assoc archive package-archive-priorities)) + package-archive-default-priority)) + (defun package--download-one-archive (archive file) "Retrieve an archive file FILE from ARCHIVE, and cache it. ARCHIVE should be a cons cell of the form (NAME . LOCATION), diff --git a/test/automated/package-test.el b/test/automated/package-test.el index 6e7994a..2a337fb 100644 --- a/test/automated/package-test.el +++ b/test/automated/package-test.el @@ -230,6 +230,23 @@ Must called from within a `tar-mode' buffer." (package-refresh-contents) (package-install 'simple-single))) +(ert-deftest package-test-install-prioritized () + "Install a lower version from a higher-prioritized archive." + (with-package-test () + (let* ((newer-version (expand-file-name "data/package/newer-versions" + package-test-file-dir)) + (package-archives `(("older" . ,package-test-data-dir) + ("newer" . ,newer-version))) + (package-archive-priorities '(("newer" . 100)))) + + (package-initialize) + (package-refresh-contents) + (package-install 'simple-single) + + (let ((installed (cdr (assq 'simple-single package-alist)))) + (should (version-list-= '(1 3) + (package-desc-version installed))))))) + (ert-deftest package-test-install-multifile () "Check properties of the installed multi-file package." (with-package-test (:basedir "data/package" :install '(multi-file)) -- 1.7.10.4
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.