aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/ChangeLog6
-rw-r--r--lisp/emacs-lisp/package.el666
2 files changed, 348 insertions, 324 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index fe0a3dba1a0..dd8605a0f20 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,9 @@
12015-02-02 Artur Malabarba <bruce.connor.am@gmail.com>
2
3 * emacs-lisp/package.el (package--find-non-dependencies): New
4 function.
5 (package-initialize): Use it to populate `package-selected-packages'.
6
12015-02-02 Michael Albinus <michael.albinus@gmx.de> 72015-02-02 Michael Albinus <michael.albinus@gmx.de>
2 8
3 * net/tramp-sh.el (tramp-histfile-override): Add another choice 'unset. 9 * net/tramp-sh.el (tramp-histfile-override): Add another choice 'unset.
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index d95bc5e6d73..9a29d63ced2 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -295,8 +295,8 @@ packages in `package-directory-list'."
295 (let (result) 295 (let (result)
296 (dolist (f load-path) 296 (dolist (f load-path)
297 (and (stringp f) 297 (and (stringp f)
298 (equal (file-name-nondirectory f) "site-lisp") 298 (equal (file-name-nondirectory f) "site-lisp")
299 (push (expand-file-name "elpa" f) result))) 299 (push (expand-file-name "elpa" f) result)))
300 (nreverse result)) 300 (nreverse result))
301 "List of additional directories containing Emacs Lisp packages. 301 "List of additional directories containing Emacs Lisp packages.
302Each directory name should be absolute. 302Each directory name should be absolute.
@@ -320,8 +320,8 @@ it is unsigned.
320This also applies to the \"archive-contents\" file that lists the 320This also applies to the \"archive-contents\" file that lists the
321contents of the archive." 321contents of the archive."
322 :type '(choice (const nil :tag "Never") 322 :type '(choice (const nil :tag "Never")
323 (const allow-unsigned :tag "Allow unsigned") 323 (const allow-unsigned :tag "Allow unsigned")
324 (const t :tag "Check always")) 324 (const t :tag "Check always"))
325 :risky t 325 :risky t
326 :group 'package 326 :group 'package
327 :version "24.4") 327 :version "24.4")
@@ -387,20 +387,20 @@ Slots:
387`version' Version of the package, as a version list. 387`version' Version of the package, as a version list.
388 388
389`summary' Short description of the package, typically taken from 389`summary' Short description of the package, typically taken from
390 the first line of the file. 390 the first line of the file.
391 391
392`reqs' Requirements of the package. A list of (PACKAGE 392`reqs' Requirements of the package. A list of (PACKAGE
393 VERSION-LIST) naming the dependent package and the minimum 393 VERSION-LIST) naming the dependent package and the minimum
394 required version. 394 required version.
395 395
396`kind' The distribution format of the package. Currently, it is 396`kind' The distribution format of the package. Currently, it is
397 either `single' or `tar'. 397 either `single' or `tar'.
398 398
399`archive' The name of the archive (as a string) whence this 399`archive' The name of the archive (as a string) whence this
400 package came. 400 package came.
401 401
402`dir' The directory where the package is installed (if installed), 402`dir' The directory where the package is installed (if installed),
403 `builtin' if it is built-in, or nil otherwise. 403 `builtin' if it is built-in, or nil otherwise.
404 404
405`extras' Optional alist of additional keyword-value pairs. 405`extras' Optional alist of additional keyword-value pairs.
406 406
@@ -477,32 +477,32 @@ This is, approximately, the inverse of `version-to-list'.
477 "" 477 ""
478 (let ((str-list (list "." (int-to-string (car vlist))))) 478 (let ((str-list (list "." (int-to-string (car vlist)))))
479 (dolist (num (cdr vlist)) 479 (dolist (num (cdr vlist))
480 (cond 480 (cond
481 ((>= num 0) 481 ((>= num 0)
482 (push (int-to-string num) str-list) 482 (push (int-to-string num) str-list)
483 (push "." str-list)) 483 (push "." str-list))
484 ((< num -4) 484 ((< num -4)
485 (error "Invalid version list `%s'" vlist)) 485 (error "Invalid version list `%s'" vlist))
486 (t 486 (t
487 ;; pre, or beta, or alpha 487 ;; pre, or beta, or alpha
488 (cond ((equal "." (car str-list)) 488 (cond ((equal "." (car str-list))
489 (pop str-list)) 489 (pop str-list))
490 ((not (string-match "[0-9]+" (car str-list))) 490 ((not (string-match "[0-9]+" (car str-list)))
491 (error "Invalid version list `%s'" vlist))) 491 (error "Invalid version list `%s'" vlist)))
492 (push (cond ((= num -1) "pre") 492 (push (cond ((= num -1) "pre")
493 ((= num -2) "beta") 493 ((= num -2) "beta")
494 ((= num -3) "alpha") 494 ((= num -3) "alpha")
495 ((= num -4) "snapshot")) 495 ((= num -4) "snapshot"))
496 str-list)))) 496 str-list))))
497 (if (equal "." (car str-list)) 497 (if (equal "." (car str-list))
498 (pop str-list)) 498 (pop str-list))
499 (apply 'concat (nreverse str-list))))) 499 (apply 'concat (nreverse str-list)))))
500 500
501(defun package-load-descriptor (pkg-dir) 501(defun package-load-descriptor (pkg-dir)
502 "Load the description file in directory PKG-DIR." 502 "Load the description file in directory PKG-DIR."
503 (let ((pkg-file (expand-file-name (package--description-file pkg-dir) 503 (let ((pkg-file (expand-file-name (package--description-file pkg-dir)
504 pkg-dir)) 504 pkg-dir))
505 (signed-file (concat pkg-dir ".signed"))) 505 (signed-file (concat pkg-dir ".signed")))
506 (when (file-exists-p pkg-file) 506 (when (file-exists-p pkg-file)
507 (with-temp-buffer 507 (with-temp-buffer
508 (insert-file-contents pkg-file) 508 (insert-file-contents pkg-file)
@@ -510,8 +510,8 @@ This is, approximately, the inverse of `version-to-list'.
510 (let ((pkg-desc (package-process-define-package 510 (let ((pkg-desc (package-process-define-package
511 (read (current-buffer)) pkg-file))) 511 (read (current-buffer)) pkg-file)))
512 (setf (package-desc-dir pkg-desc) pkg-dir) 512 (setf (package-desc-dir pkg-desc) pkg-dir)
513 (if (file-exists-p signed-file) 513 (if (file-exists-p signed-file)
514 (setf (package-desc-signed pkg-desc) t)) 514 (setf (package-desc-signed pkg-desc) t))
515 pkg-desc))))) 515 pkg-desc)))))
516 516
517(defun package-load-all-descriptors () 517(defun package-load-all-descriptors ()
@@ -551,11 +551,11 @@ If RELOAD is non-nil, also `load' any files inside the package which
551correspond to previously loaded files (those returned by 551correspond to previously loaded files (those returned by
552`package--list-loaded-files')." 552`package--list-loaded-files')."
553 (let* ((name (package-desc-name pkg-desc)) 553 (let* ((name (package-desc-name pkg-desc))
554 (pkg-dir (package-desc-dir pkg-desc)) 554 (pkg-dir (package-desc-dir pkg-desc))
555 (pkg-dir-dir (file-name-as-directory pkg-dir))) 555 (pkg-dir-dir (file-name-as-directory pkg-dir)))
556 (unless pkg-dir 556 (unless pkg-dir
557 (error "Internal error: unable to find directory for `%s'" 557 (error "Internal error: unable to find directory for `%s'"
558 (package-desc-full-name pkg-desc))) 558 (package-desc-full-name pkg-desc)))
559 ;; Add to load path, add autoloads, and activate the package. 559 ;; Add to load path, add autoloads, and activate the package.
560 (let* ((old-lp load-path) 560 (let* ((old-lp load-path)
561 (autoloads-file (expand-file-name 561 (autoloads-file (expand-file-name
@@ -575,7 +575,7 @@ correspond to previously loaded files (those returned by
575 ;; depends on this new definition, not doing this update would cause 575 ;; depends on this new definition, not doing this update would cause
576 ;; compilation errors and break the installation. 576 ;; compilation errors and break the installation.
577 (with-demoted-errors "Error in package-activate-1: %s" 577 (with-demoted-errors "Error in package-activate-1: %s"
578 (mapc (lambda (feature) (load feature nil t)) 578 (mapc (lambda (feature) (load feature nil t))
579 ;; Skip autoloads file since we already evaluated it above. 579 ;; Skip autoloads file since we already evaluated it above.
580 (remove (file-truename autoloads-file) loaded-files-list)))) 580 (remove (file-truename autoloads-file) loaded-files-list))))
581 ;; Add info node. 581 ;; Add info node.
@@ -674,12 +674,12 @@ If FORCE is true, (re-)activate it if it's already activated."
674 (dolist (req (package-desc-reqs pkg-vec)) 674 (dolist (req (package-desc-reqs pkg-vec))
675 (unless (package-activate (car req)) 675 (unless (package-activate (car req))
676 (throw 'dep-failure req)))))) 676 (throw 'dep-failure req))))))
677 (if fail 677 (if fail
678 (warn "Unable to activate package `%s'. 678 (warn "Unable to activate package `%s'.
679Required package `%s-%s' is unavailable" 679Required package `%s-%s' is unavailable"
680 package (car fail) (package-version-join (cadr fail))) 680 package (car fail) (package-version-join (cadr fail)))
681 ;; If all goes well, activate the package itself. 681 ;; If all goes well, activate the package itself.
682 (package-activate-1 pkg-vec force))))))) 682 (package-activate-1 pkg-vec force)))))))
683 683
684(defun define-package (_name-string _version-string 684(defun define-package (_name-string _version-string
685 &optional _docstring _requirements 685 &optional _docstring _requirements
@@ -722,17 +722,17 @@ EXTRA-PROPERTIES is currently unused."
722 (unless (file-exists-p file) 722 (unless (file-exists-p file)
723 (write-region 723 (write-region
724 (concat ";;; " (file-name-nondirectory file) 724 (concat ";;; " (file-name-nondirectory file)
725 " --- automatically extracted autoloads\n" 725 " --- automatically extracted autoloads\n"
726 ";;\n" 726 ";;\n"
727 ";;; Code:\n" 727 ";;; Code:\n"
728 "(add-to-list 'load-path (or (file-name-directory #$) (car load-path)))\n" 728 "(add-to-list 'load-path (or (file-name-directory #$) (car load-path)))\n"
729 " \n;; Local Variables:\n" 729 " \n;; Local Variables:\n"
730 ";; version-control: never\n" 730 ";; version-control: never\n"
731 ";; no-byte-compile: t\n" 731 ";; no-byte-compile: t\n"
732 ";; no-update-autoloads: t\n" 732 ";; no-update-autoloads: t\n"
733 ";; End:\n" 733 ";; End:\n"
734 ";;; " (file-name-nondirectory file) 734 ";;; " (file-name-nondirectory file)
735 " ends here\n") 735 " ends here\n")
736 nil file nil 'silent)) 736 nil file nil 'silent))
737 file) 737 file)
738 738
@@ -741,10 +741,10 @@ EXTRA-PROPERTIES is currently unused."
741 741
742(defun package-generate-autoloads (name pkg-dir) 742(defun package-generate-autoloads (name pkg-dir)
743 (let* ((auto-name (format "%s-autoloads.el" name)) 743 (let* ((auto-name (format "%s-autoloads.el" name))
744 ;;(ignore-name (concat name "-pkg.el")) 744 ;;(ignore-name (concat name "-pkg.el"))
745 (generated-autoload-file (expand-file-name auto-name pkg-dir)) 745 (generated-autoload-file (expand-file-name auto-name pkg-dir))
746 (backup-inhibited t) 746 (backup-inhibited t)
747 (version-control 'never)) 747 (version-control 'never))
748 (package-autoload-ensure-default-file generated-autoload-file) 748 (package-autoload-ensure-default-file generated-autoload-file)
749 (update-directory-autoloads pkg-dir) 749 (update-directory-autoloads pkg-dir)
750 (let ((buf (find-buffer-visiting generated-autoload-file))) 750 (let ((buf (find-buffer-visiting generated-autoload-file)))
@@ -764,15 +764,15 @@ untar into a directory named DIR; otherwise, signal an error."
764 (tar-mode) 764 (tar-mode)
765 ;; Make sure everything extracts into DIR. 765 ;; Make sure everything extracts into DIR.
766 (let ((regexp (concat "\\`" (regexp-quote (expand-file-name dir)) "/")) 766 (let ((regexp (concat "\\`" (regexp-quote (expand-file-name dir)) "/"))
767 (case-fold-search (memq system-type '(windows-nt ms-dos cygwin)))) 767 (case-fold-search (memq system-type '(windows-nt ms-dos cygwin))))
768 (dolist (tar-data tar-parse-info) 768 (dolist (tar-data tar-parse-info)
769 (let ((name (expand-file-name (tar-header-name tar-data)))) 769 (let ((name (expand-file-name (tar-header-name tar-data))))
770 (or (string-match regexp name) 770 (or (string-match regexp name)
771 ;; Tarballs created by some utilities don't list 771 ;; Tarballs created by some utilities don't list
772 ;; directories with a trailing slash (Bug#13136). 772 ;; directories with a trailing slash (Bug#13136).
773 (and (string-equal dir name) 773 (and (string-equal dir name)
774 (eq (tar-header-link-type tar-data) 5)) 774 (eq (tar-header-link-type tar-data) 5))
775 (error "Package does not untar cleanly into directory %s/" dir))))) 775 (error "Package does not untar cleanly into directory %s/" dir)))))
776 (tar-untar-buffer)) 776 (tar-untar-buffer))
777 777
778(defun package-generate-description-file (pkg-desc pkg-file) 778(defun package-generate-description-file (pkg-desc pkg-file)
@@ -811,7 +811,7 @@ untar into a directory named DIR; otherwise, signal an error."
811 "Install the contents of the current buffer as a package." 811 "Install the contents of the current buffer as a package."
812 (let* ((name (package-desc-name pkg-desc)) 812 (let* ((name (package-desc-name pkg-desc))
813 (dirname (package-desc-full-name pkg-desc)) 813 (dirname (package-desc-full-name pkg-desc))
814 (pkg-dir (expand-file-name dirname package-user-dir))) 814 (pkg-dir (expand-file-name dirname package-user-dir)))
815 (pcase (package-desc-kind pkg-desc) 815 (pcase (package-desc-kind pkg-desc)
816 (`dir 816 (`dir
817 (make-directory pkg-dir t) 817 (make-directory pkg-dir t)
@@ -880,28 +880,28 @@ buffer is killed afterwards. Return the last value in BODY."
880 (declare (indent 2) (debug t)) 880 (declare (indent 2) (debug t))
881 `(with-temp-buffer 881 `(with-temp-buffer
882 (if (string-match-p "\\`https?:" ,location) 882 (if (string-match-p "\\`https?:" ,location)
883 (url-insert-file-contents (concat ,location ,file)) 883 (url-insert-file-contents (concat ,location ,file))
884 (unless (file-name-absolute-p ,location) 884 (unless (file-name-absolute-p ,location)
885 (error "Archive location %s is not an absolute file name" 885 (error "Archive location %s is not an absolute file name"
886 ,location)) 886 ,location))
887 (insert-file-contents (expand-file-name ,file ,location))) 887 (insert-file-contents (expand-file-name ,file ,location)))
888 ,@body)) 888 ,@body))
889 889
890(defun package--archive-file-exists-p (location file) 890(defun package--archive-file-exists-p (location file)
891 (let ((http (string-match "\\`https?:" location))) 891 (let ((http (string-match "\\`https?:" location)))
892 (if http 892 (if http
893 (progn 893 (progn
894 (require 'url-http) 894 (require 'url-http)
895 (url-http-file-exists-p (concat location file))) 895 (url-http-file-exists-p (concat location file)))
896 (file-exists-p (expand-file-name file location))))) 896 (file-exists-p (expand-file-name file location)))))
897 897
898(declare-function epg-make-context "epg" 898(declare-function epg-make-context "epg"
899 (&optional protocol armor textmode include-certs 899 (&optional protocol armor textmode include-certs
900 cipher-algorithm 900 cipher-algorithm
901 digest-algorithm 901 digest-algorithm
902 compress-algorithm)) 902 compress-algorithm))
903(declare-function epg-verify-string "epg" (context signature 903(declare-function epg-verify-string "epg" (context signature
904 &optional signed-text)) 904 &optional signed-text))
905(declare-function epg-context-result-for "epg" (context name)) 905(declare-function epg-context-result-for "epg" (context name))
906(declare-function epg-signature-status "epg" (signature)) 906(declare-function epg-signature-status "epg" (signature))
907(declare-function epg-signature-to-string "epg" (signature)) 907(declare-function epg-signature-to-string "epg" (signature))
@@ -910,13 +910,13 @@ buffer is killed afterwards. Return the last value in BODY."
910 (unless (equal (epg-context-error-output context) "") 910 (unless (equal (epg-context-error-output context) "")
911 (with-output-to-temp-buffer "*Error*" 911 (with-output-to-temp-buffer "*Error*"
912 (with-current-buffer standard-output 912 (with-current-buffer standard-output
913 (if (epg-context-result-for context 'verify) 913 (if (epg-context-result-for context 'verify)
914 (insert (format "Failed to verify signature %s:\n" sig-file) 914 (insert (format "Failed to verify signature %s:\n" sig-file)
915 (mapconcat #'epg-signature-to-string 915 (mapconcat #'epg-signature-to-string
916 (epg-context-result-for context 'verify) 916 (epg-context-result-for context 'verify)
917 "\n")) 917 "\n"))
918 (insert (format "Error while verifying signature %s:\n" sig-file))) 918 (insert (format "Error while verifying signature %s:\n" sig-file)))
919 (insert "\nCommand output:\n" (epg-context-error-output context)))))) 919 (insert "\nCommand output:\n" (epg-context-error-output context))))))
920 920
921(defun package--check-signature (location file) 921(defun package--check-signature (location file)
922 "Check signature of the current buffer. 922 "Check signature of the current buffer.
@@ -925,10 +925,10 @@ GnuPG keyring is located under \"gnupg\" in `package-user-dir'."
925 (homedir (expand-file-name "gnupg" package-user-dir)) 925 (homedir (expand-file-name "gnupg" package-user-dir))
926 (sig-file (concat file ".sig")) 926 (sig-file (concat file ".sig"))
927 (sig-content (package--with-work-buffer location sig-file 927 (sig-content (package--with-work-buffer location sig-file
928 (buffer-string)))) 928 (buffer-string))))
929 (setf (epg-context-home-directory context) homedir) 929 (setf (epg-context-home-directory context) homedir)
930 (condition-case error 930 (condition-case error
931 (epg-verify-string context sig-content (buffer-string)) 931 (epg-verify-string context sig-content (buffer-string))
932 (error 932 (error
933 (package--display-verify-error context sig-file) 933 (package--display-verify-error context sig-file)
934 (signal (car error) (cdr error)))) 934 (signal (car error) (cdr error))))
@@ -936,18 +936,18 @@ GnuPG keyring is located under \"gnupg\" in `package-user-dir'."
936 ;; The .sig file may contain multiple signatures. Success if one 936 ;; The .sig file may contain multiple signatures. Success if one
937 ;; of the signatures is good. 937 ;; of the signatures is good.
938 (dolist (sig (epg-context-result-for context 'verify)) 938 (dolist (sig (epg-context-result-for context 'verify))
939 (if (eq (epg-signature-status sig) 'good) 939 (if (eq (epg-signature-status sig) 'good)
940 (push sig good-signatures) 940 (push sig good-signatures)
941 ;; If package-check-signature is allow-unsigned, don't 941 ;; If package-check-signature is allow-unsigned, don't
942 ;; signal error when we can't verify signature because of 942 ;; signal error when we can't verify signature because of
943 ;; missing public key. Other errors are still treated as 943 ;; missing public key. Other errors are still treated as
944 ;; fatal (bug#17625). 944 ;; fatal (bug#17625).
945 (unless (and (eq package-check-signature 'allow-unsigned) 945 (unless (and (eq package-check-signature 'allow-unsigned)
946 (eq (epg-signature-status sig) 'no-pubkey)) 946 (eq (epg-signature-status sig) 'no-pubkey))
947 (setq had-fatal-error t)))) 947 (setq had-fatal-error t))))
948 (when (and (null good-signatures) had-fatal-error) 948 (when (and (null good-signatures) had-fatal-error)
949 (package--display-verify-error context sig-file) 949 (package--display-verify-error context sig-file)
950 (error "Failed to verify signature %s" sig-file)) 950 (error "Failed to verify signature %s" sig-file))
951 good-signatures))) 951 good-signatures)))
952 952
953(defun package-install-from-archive (pkg-desc) 953(defun package-install-from-archive (pkg-desc)
@@ -956,37 +956,37 @@ GnuPG keyring is located under \"gnupg\" in `package-user-dir'."
956 (when (eq (package-desc-kind pkg-desc) 'dir) 956 (when (eq (package-desc-kind pkg-desc) 'dir)
957 (error "Can't install directory package from archive")) 957 (error "Can't install directory package from archive"))
958 (let* ((location (package-archive-base pkg-desc)) 958 (let* ((location (package-archive-base pkg-desc))
959 (file (concat (package-desc-full-name pkg-desc) 959 (file (concat (package-desc-full-name pkg-desc)
960 (package-desc-suffix pkg-desc))) 960 (package-desc-suffix pkg-desc)))
961 (sig-file (concat file ".sig")) 961 (sig-file (concat file ".sig"))
962 good-signatures pkg-descs) 962 good-signatures pkg-descs)
963 (package--with-work-buffer location file 963 (package--with-work-buffer location file
964 (if (and package-check-signature 964 (if (and package-check-signature
965 (not (member (package-desc-archive pkg-desc) 965 (not (member (package-desc-archive pkg-desc)
966 package-unsigned-archives))) 966 package-unsigned-archives)))
967 (if (package--archive-file-exists-p location sig-file) 967 (if (package--archive-file-exists-p location sig-file)
968 (setq good-signatures (package--check-signature location file)) 968 (setq good-signatures (package--check-signature location file))
969 (unless (eq package-check-signature 'allow-unsigned) 969 (unless (eq package-check-signature 'allow-unsigned)
970 (error "Unsigned package: `%s'" 970 (error "Unsigned package: `%s'"
971 (package-desc-name pkg-desc))))) 971 (package-desc-name pkg-desc)))))
972 (package-unpack pkg-desc)) 972 (package-unpack pkg-desc))
973 ;; Here the package has been installed successfully, mark it as 973 ;; Here the package has been installed successfully, mark it as
974 ;; signed if appropriate. 974 ;; signed if appropriate.
975 (when good-signatures 975 (when good-signatures
976 ;; Write out good signatures into NAME-VERSION.signed file. 976 ;; Write out good signatures into NAME-VERSION.signed file.
977 (write-region (mapconcat #'epg-signature-to-string good-signatures "\n") 977 (write-region (mapconcat #'epg-signature-to-string good-signatures "\n")
978 nil 978 nil
979 (expand-file-name 979 (expand-file-name
980 (concat (package-desc-full-name pkg-desc) 980 (concat (package-desc-full-name pkg-desc)
981 ".signed") 981 ".signed")
982 package-user-dir) 982 package-user-dir)
983 nil 'silent) 983 nil 'silent)
984 ;; Update the old pkg-desc which will be shown on the description buffer. 984 ;; Update the old pkg-desc which will be shown on the description buffer.
985 (setf (package-desc-signed pkg-desc) t) 985 (setf (package-desc-signed pkg-desc) t)
986 ;; Update the new (activated) pkg-desc as well. 986 ;; Update the new (activated) pkg-desc as well.
987 (setq pkg-descs (cdr (assq (package-desc-name pkg-desc) package-alist))) 987 (setq pkg-descs (cdr (assq (package-desc-name pkg-desc) package-alist)))
988 (if pkg-descs 988 (if pkg-descs
989 (setf (package-desc-signed (car pkg-descs)) t))))) 989 (setf (package-desc-signed (car pkg-descs)) t)))))
990 990
991(defvar package--initialized nil) 991(defvar package--initialized nil)
992 992
@@ -997,8 +997,8 @@ MIN-VERSION should be a version list."
997 (or 997 (or
998 (let ((pkg-descs (cdr (assq package package-alist)))) 998 (let ((pkg-descs (cdr (assq package package-alist))))
999 (and pkg-descs 999 (and pkg-descs
1000 (version-list-<= min-version 1000 (version-list-<= min-version
1001 (package-desc-version (car pkg-descs))))) 1001 (package-desc-version (car pkg-descs)))))
1002 ;; Also check built-in packages. 1002 ;; Also check built-in packages.
1003 (package-built-in-p package min-version))) 1003 (package-built-in-p package min-version)))
1004 1004
@@ -1024,7 +1024,7 @@ SEEN is used internally to detect infinite recursion."
1024 ;; older bar-1.3). 1024 ;; older bar-1.3).
1025 (dolist (elt requirements) 1025 (dolist (elt requirements)
1026 (let* ((next-pkg (car elt)) 1026 (let* ((next-pkg (car elt))
1027 (next-version (cadr elt)) 1027 (next-version (cadr elt))
1028 (already ())) 1028 (already ()))
1029 (dolist (pkg packages) 1029 (dolist (pkg packages)
1030 (if (eq next-pkg (package-desc-name pkg)) 1030 (if (eq next-pkg (package-desc-name pkg))
@@ -1048,9 +1048,9 @@ SEEN is used internally to detect infinite recursion."
1048 ((package-installed-p next-pkg next-version) nil) 1048 ((package-installed-p next-pkg next-version) nil)
1049 1049
1050 (t 1050 (t
1051 ;; A package is required, but not installed. It might also be 1051 ;; A package is required, but not installed. It might also be
1052 ;; blocked via `package-load-list'. 1052 ;; blocked via `package-load-list'.
1053 (let ((pkg-descs (cdr (assq next-pkg package-archive-contents))) 1053 (let ((pkg-descs (cdr (assq next-pkg package-archive-contents)))
1054 (found nil) 1054 (found nil)
1055 (problem nil)) 1055 (problem nil))
1056 (while (and pkg-descs (not found)) 1056 (while (and pkg-descs (not found))
@@ -1074,14 +1074,14 @@ but version %s required"
1074 (format "Required package '%s' is disabled" 1074 (format "Required package '%s' is disabled"
1075 next-pkg))))) 1075 next-pkg)))))
1076 (t (setq found pkg-desc))))) 1076 (t (setq found pkg-desc)))))
1077 (unless found 1077 (unless found
1078 (if problem 1078 (if problem
1079 (error "%s" problem) 1079 (error "%s" problem)
1080 (error "Package `%s-%s' is unavailable" 1080 (error "Package `%s-%s' is unavailable"
1081 next-pkg (package-version-join next-version)))) 1081 next-pkg (package-version-join next-version))))
1082 (setq packages 1082 (setq packages
1083 (package-compute-transaction (cons found packages) 1083 (package-compute-transaction (cons found packages)
1084 (package-desc-reqs found) 1084 (package-desc-reqs found)
1085 (cons found seen)))))))) 1085 (cons found seen))))))))
1086 packages) 1086 packages)
1087 1087
@@ -1089,13 +1089,13 @@ but version %s required"
1089 "Read a Lisp expression from STR. 1089 "Read a Lisp expression from STR.
1090Signal an error if the entire string was not used." 1090Signal an error if the entire string was not used."
1091 (let* ((read-data (read-from-string str)) 1091 (let* ((read-data (read-from-string str))
1092 (more-left 1092 (more-left
1093 (condition-case nil 1093 (condition-case nil
1094 ;; The call to `ignore' suppresses a compiler warning. 1094 ;; The call to `ignore' suppresses a compiler warning.
1095 (progn (ignore (read-from-string 1095 (progn (ignore (read-from-string
1096 (substring str (cdr read-data)))) 1096 (substring str (cdr read-data))))
1097 t) 1097 t)
1098 (end-of-file nil)))) 1098 (end-of-file nil))))
1099 (if more-left 1099 (if more-left
1100 (error "Can't read whole string") 1100 (error "Can't read whole string")
1101 (car read-data)))) 1101 (car read-data))))
@@ -1107,12 +1107,12 @@ Will throw an error if the archive version is too new."
1107 (let ((filename (expand-file-name file package-user-dir))) 1107 (let ((filename (expand-file-name file package-user-dir)))
1108 (when (file-exists-p filename) 1108 (when (file-exists-p filename)
1109 (with-temp-buffer 1109 (with-temp-buffer
1110 (insert-file-contents-literally filename) 1110 (insert-file-contents-literally filename)
1111 (let ((contents (read (current-buffer)))) 1111 (let ((contents (read (current-buffer))))
1112 (if (> (car contents) package-archive-version) 1112 (if (> (car contents) package-archive-version)
1113 (error "Package archive version %d is higher than %d" 1113 (error "Package archive version %d is higher than %d"
1114 (car contents) package-archive-version)) 1114 (car contents) package-archive-version))
1115 (cdr contents)))))) 1115 (cdr contents))))))
1116 1116
1117(defun package-read-all-archive-contents () 1117(defun package-read-all-archive-contents ()
1118 "Re-read `archive-contents', if it exists. 1118 "Re-read `archive-contents', if it exists.
@@ -1128,10 +1128,10 @@ If the archive version is too new, signal an error."
1128 ;; Version 1 of 'archive-contents' is identical to our internal 1128 ;; Version 1 of 'archive-contents' is identical to our internal
1129 ;; representation. 1129 ;; representation.
1130 (let* ((contents-file (format "archives/%s/archive-contents" archive)) 1130 (let* ((contents-file (format "archives/%s/archive-contents" archive))
1131 (contents (package--read-archive-file contents-file))) 1131 (contents (package--read-archive-file contents-file)))
1132 (when contents 1132 (when contents
1133 (dolist (package contents) 1133 (dolist (package contents)
1134 (package--add-to-archive-contents package archive))))) 1134 (package--add-to-archive-contents package archive)))))
1135 1135
1136;; Package descriptor objects used inside the "archive-contents" file. 1136;; Package descriptor objects used inside the "archive-contents" file.
1137;; Changing this defstruct implies changing the format of the 1137;; Changing this defstruct implies changing the format of the
@@ -1250,8 +1250,8 @@ Otherwise return nil."
1250 (when (string-match "\\`[ \t]*[$]Revision:[ \t]+" str) 1250 (when (string-match "\\`[ \t]*[$]Revision:[ \t]+" str)
1251 (setq str (substring str (match-end 0)))) 1251 (setq str (substring str (match-end 0))))
1252 (condition-case nil 1252 (condition-case nil
1253 (if (version-to-list str) 1253 (if (version-to-list str)
1254 str) 1254 str)
1255 (error nil)))) 1255 (error nil))))
1256 1256
1257(declare-function lm-homepage "lisp-mnt" (&optional file)) 1257(declare-function lm-homepage "lisp-mnt" (&optional file))
@@ -1285,8 +1285,8 @@ boundaries."
1285 (unless (re-search-forward "^;;; \\([^ ]*\\)\\.el ---[ \t]*\\(.*?\\)[ \t]*\\(-\\*-.*-\\*-[ \t]*\\)?$" nil t) 1285 (unless (re-search-forward "^;;; \\([^ ]*\\)\\.el ---[ \t]*\\(.*?\\)[ \t]*\\(-\\*-.*-\\*-[ \t]*\\)?$" nil t)
1286 (error "Package lacks a file header")) 1286 (error "Package lacks a file header"))
1287 (let ((file-name (match-string-no-properties 1)) 1287 (let ((file-name (match-string-no-properties 1))
1288 (desc (match-string-no-properties 2)) 1288 (desc (match-string-no-properties 2))
1289 (start (line-beginning-position))) 1289 (start (line-beginning-position)))
1290 (unless (search-forward (concat ";;; " file-name ".el ends here")) 1290 (unless (search-forward (concat ";;; " file-name ".el ends here"))
1291 (error "Package lacks a terminating comment")) 1291 (error "Package lacks a terminating comment"))
1292 ;; Try to include a trailing newline. 1292 ;; Try to include a trailing newline.
@@ -1295,15 +1295,15 @@ boundaries."
1295 (require 'lisp-mnt) 1295 (require 'lisp-mnt)
1296 ;; Use some headers we've invented to drive the process. 1296 ;; Use some headers we've invented to drive the process.
1297 (let* ((requires-str (lm-header "package-requires")) 1297 (let* ((requires-str (lm-header "package-requires"))
1298 ;; Prefer Package-Version; if defined, the package author 1298 ;; Prefer Package-Version; if defined, the package author
1299 ;; probably wants us to use it. Otherwise try Version. 1299 ;; probably wants us to use it. Otherwise try Version.
1300 (pkg-version 1300 (pkg-version
1301 (or (package-strip-rcs-id (lm-header "package-version")) 1301 (or (package-strip-rcs-id (lm-header "package-version"))
1302 (package-strip-rcs-id (lm-header "version")))) 1302 (package-strip-rcs-id (lm-header "version"))))
1303 (homepage (lm-homepage))) 1303 (homepage (lm-homepage)))
1304 (unless pkg-version 1304 (unless pkg-version
1305 (error 1305 (error
1306 "Package lacks a \"Version\" or \"Package-Version\" header")) 1306 "Package lacks a \"Version\" or \"Package-Version\" header"))
1307 (package-desc-from-define 1307 (package-desc-from-define
1308 file-name pkg-version desc 1308 file-name pkg-version desc
1309 (if requires-str 1309 (if requires-str
@@ -1564,33 +1564,33 @@ ARCHIVE should be a cons cell of the form (NAME . LOCATION),
1564similar to an entry in `package-alist'. Save the cached copy to 1564similar to an entry in `package-alist'. Save the cached copy to
1565\"archives/NAME/archive-contents\" in `package-user-dir'." 1565\"archives/NAME/archive-contents\" in `package-user-dir'."
1566 (let ((dir (expand-file-name (format "archives/%s" (car archive)) 1566 (let ((dir (expand-file-name (format "archives/%s" (car archive))
1567 package-user-dir)) 1567 package-user-dir))
1568 (sig-file (concat file ".sig")) 1568 (sig-file (concat file ".sig"))
1569 good-signatures) 1569 good-signatures)
1570 (package--with-work-buffer (cdr archive) file 1570 (package--with-work-buffer (cdr archive) file
1571 ;; Check signature of archive-contents, if desired. 1571 ;; Check signature of archive-contents, if desired.
1572 (if (and package-check-signature 1572 (if (and package-check-signature
1573 (not (member archive package-unsigned-archives))) 1573 (not (member archive package-unsigned-archives)))
1574 (if (package--archive-file-exists-p (cdr archive) sig-file) 1574 (if (package--archive-file-exists-p (cdr archive) sig-file)
1575 (setq good-signatures (package--check-signature (cdr archive) 1575 (setq good-signatures (package--check-signature (cdr archive)
1576 file)) 1576 file))
1577 (unless (eq package-check-signature 'allow-unsigned) 1577 (unless (eq package-check-signature 'allow-unsigned)
1578 (error "Unsigned archive `%s'" 1578 (error "Unsigned archive `%s'"
1579 (car archive))))) 1579 (car archive)))))
1580 ;; Read the retrieved buffer to make sure it is valid (e.g. it 1580 ;; Read the retrieved buffer to make sure it is valid (e.g. it
1581 ;; may fetch a URL redirect page). 1581 ;; may fetch a URL redirect page).
1582 (when (listp (read (current-buffer))) 1582 (when (listp (read (current-buffer)))
1583 (make-directory dir t) 1583 (make-directory dir t)
1584 (write-region nil nil (expand-file-name file dir) nil 'silent))) 1584 (write-region nil nil (expand-file-name file dir) nil 'silent)))
1585 (when good-signatures 1585 (when good-signatures
1586 ;; Write out good signatures into archive-contents.signed file. 1586 ;; Write out good signatures into archive-contents.signed file.
1587 (write-region (mapconcat #'epg-signature-to-string good-signatures "\n") 1587 (write-region (mapconcat #'epg-signature-to-string good-signatures "\n")
1588 nil 1588 nil
1589 (expand-file-name (concat file ".signed") dir) 1589 (expand-file-name (concat file ".signed") dir)
1590 nil 'silent)))) 1590 nil 'silent))))
1591 1591
1592(declare-function epg-check-configuration "epg-config" 1592(declare-function epg-check-configuration "epg-config"
1593 (config &optional minimum-version)) 1593 (config &optional minimum-version))
1594(declare-function epg-configuration "epg-config" ()) 1594(declare-function epg-configuration "epg-config" ())
1595(declare-function epg-import-keys-from-file "epg" (context keys)) 1595(declare-function epg-import-keys-from-file "epg" (context keys))
1596 1596
@@ -1600,7 +1600,7 @@ similar to an entry in `package-alist'. Save the cached copy to
1600 (interactive "fFile: ") 1600 (interactive "fFile: ")
1601 (setq file (expand-file-name file)) 1601 (setq file (expand-file-name file))
1602 (let ((context (epg-make-context 'OpenPGP)) 1602 (let ((context (epg-make-context 'OpenPGP))
1603 (homedir (expand-file-name "gnupg" package-user-dir))) 1603 (homedir (expand-file-name "gnupg" package-user-dir)))
1604 (with-file-modes 448 1604 (with-file-modes 448
1605 (make-directory homedir t)) 1605 (make-directory homedir t))
1606 (setf (epg-context-home-directory context) homedir) 1606 (setf (epg-context-home-directory context) homedir)
@@ -1618,20 +1618,35 @@ makes them available for download."
1618 (unless (file-exists-p package-user-dir) 1618 (unless (file-exists-p package-user-dir)
1619 (make-directory package-user-dir t)) 1619 (make-directory package-user-dir t))
1620 (let ((default-keyring (expand-file-name "package-keyring.gpg" 1620 (let ((default-keyring (expand-file-name "package-keyring.gpg"
1621 data-directory))) 1621 data-directory)))
1622 (when (and package-check-signature (file-exists-p default-keyring)) 1622 (when (and package-check-signature (file-exists-p default-keyring))
1623 (condition-case-unless-debug error 1623 (condition-case-unless-debug error
1624 (progn 1624 (progn
1625 (epg-check-configuration (epg-configuration)) 1625 (epg-check-configuration (epg-configuration))
1626 (package-import-keyring default-keyring)) 1626 (package-import-keyring default-keyring))
1627 (error (message "Cannot import default keyring: %S" (cdr error)))))) 1627 (error (message "Cannot import default keyring: %S" (cdr error))))))
1628 (dolist (archive package-archives) 1628 (dolist (archive package-archives)
1629 (condition-case-unless-debug nil 1629 (condition-case-unless-debug nil
1630 (package--download-one-archive archive "archive-contents") 1630 (package--download-one-archive archive "archive-contents")
1631 (error (message "Failed to download `%s' archive." 1631 (error (message "Failed to download `%s' archive."
1632 (car archive))))) 1632 (car archive)))))
1633 (package-read-all-archive-contents)) 1633 (package-read-all-archive-contents))
1634 1634
1635(defun package--find-non-dependencies ()
1636 "Return a list of installed packages which are not dependencies.
1637Finds all packages in `package-alist' which are not dependencies
1638of any other packages.
1639Used to populate `package-selected-packages'."
1640 (let ((dep-list
1641 (delete-dups
1642 (apply #'append
1643 (mapcar (lambda (p) (mapcar #'car (package-desc-reqs (cadr p))))
1644 package-alist)))))
1645 (cl-loop for p in package-alist
1646 for name = (car p)
1647 unless (memq name dep-list)
1648 collect name)))
1649
1635;;;###autoload 1650;;;###autoload
1636(defun package-initialize (&optional no-activate) 1651(defun package-initialize (&optional no-activate)
1637 "Load Emacs Lisp packages, and activate them. 1652 "Load Emacs Lisp packages, and activate them.
@@ -1644,6 +1659,9 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
1644 (unless no-activate 1659 (unless no-activate
1645 (dolist (elt package-alist) 1660 (dolist (elt package-alist)
1646 (package-activate (car elt)))) 1661 (package-activate (car elt))))
1662 (when (and package-alist (not package-selected-packages))
1663 (customize-save-variable 'package-selected-packages
1664 (package--find-non-dependencies)))
1647 (setq package--initialized t)) 1665 (setq package--initialized t))
1648 1666
1649 1667
@@ -1674,10 +1692,10 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
1674 (if (not (or (package-desc-p package) (and package (symbolp package)))) 1692 (if (not (or (package-desc-p package) (and package (symbolp package))))
1675 (message "No package specified") 1693 (message "No package specified")
1676 (help-setup-xref (list #'describe-package package) 1694 (help-setup-xref (list #'describe-package package)
1677 (called-interactively-p 'interactive)) 1695 (called-interactively-p 'interactive))
1678 (with-help-window (help-buffer) 1696 (with-help-window (help-buffer)
1679 (with-current-buffer standard-output 1697 (with-current-buffer standard-output
1680 (describe-package-1 package))))) 1698 (describe-package-1 package)))))
1681 1699
1682(defun describe-package-1 (pkg) 1700(defun describe-package-1 (pkg)
1683 (require 'lisp-mnt) 1701 (require 'lisp-mnt)
@@ -1708,64 +1726,64 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
1708 1726
1709 (insert " " (propertize "Status" 'font-lock-face 'bold) ": ") 1727 (insert " " (propertize "Status" 'font-lock-face 'bold) ": ")
1710 (cond (built-in 1728 (cond (built-in
1711 (insert (propertize (capitalize status) 1729 (insert (propertize (capitalize status)
1712 'font-lock-face 'font-lock-builtin-face) 1730 'font-lock-face 'font-lock-builtin-face)
1713 ".")) 1731 "."))
1714 (pkg-dir 1732 (pkg-dir
1715 (insert (propertize (if (equal status "unsigned") 1733 (insert (propertize (if (equal status "unsigned")
1716 "Installed" 1734 "Installed"
1717 (capitalize status)) ;FIXME: Why comment-face? 1735 (capitalize status)) ;FIXME: Why comment-face?
1718 'font-lock-face 'font-lock-comment-face)) 1736 'font-lock-face 'font-lock-comment-face))
1719 (insert " in `") 1737 (insert " in `")
1720 ;; Todo: Add button for uninstalling. 1738 ;; Todo: Add button for uninstalling.
1721 (help-insert-xref-button (abbreviate-file-name 1739 (help-insert-xref-button (abbreviate-file-name
1722 (file-name-as-directory pkg-dir)) 1740 (file-name-as-directory pkg-dir))
1723 'help-package-def pkg-dir) 1741 'help-package-def pkg-dir)
1724 (if (and (package-built-in-p name) 1742 (if (and (package-built-in-p name)
1725 (not (package-built-in-p name version))) 1743 (not (package-built-in-p name version)))
1726 (insert "',\n shadowing a " 1744 (insert "',\n shadowing a "
1727 (propertize "built-in package" 1745 (propertize "built-in package"
1728 'font-lock-face 'font-lock-builtin-face)) 1746 'font-lock-face 'font-lock-builtin-face))
1729 (insert "'")) 1747 (insert "'"))
1730 (if signed 1748 (if signed
1731 (insert ".") 1749 (insert ".")
1732 (insert " (unsigned)."))) 1750 (insert " (unsigned).")))
1733 (installable 1751 (installable
1734 (insert (capitalize status)) 1752 (insert (capitalize status))
1735 (insert " from " (format "%s" archive)) 1753 (insert " from " (format "%s" archive))
1736 (insert " -- ") 1754 (insert " -- ")
1737 (package-make-button 1755 (package-make-button
1738 "Install" 1756 "Install"
1739 'action 'package-install-button-action 1757 'action 'package-install-button-action
1740 'package-desc desc)) 1758 'package-desc desc))
1741 (t (insert (capitalize status) "."))) 1759 (t (insert (capitalize status) ".")))
1742 (insert "\n") 1760 (insert "\n")
1743 (insert " " (propertize "Archive" 'font-lock-face 'bold) 1761 (insert " " (propertize "Archive" 'font-lock-face 'bold)
1744 ": " (or archive "n/a") "\n") 1762 ": " (or archive "n/a") "\n")
1745 (and version 1763 (and version
1746 (insert " " 1764 (insert " "
1747 (propertize "Version" 'font-lock-face 'bold) ": " 1765 (propertize "Version" 'font-lock-face 'bold) ": "
1748 (package-version-join version) "\n")) 1766 (package-version-join version) "\n"))
1749 1767
1750 (setq reqs (if desc (package-desc-reqs desc))) 1768 (setq reqs (if desc (package-desc-reqs desc)))
1751 (when reqs 1769 (when reqs
1752 (insert " " (propertize "Requires" 'font-lock-face 'bold) ": ") 1770 (insert " " (propertize "Requires" 'font-lock-face 'bold) ": ")
1753 (let ((first t) 1771 (let ((first t)
1754 name vers text) 1772 name vers text)
1755 (dolist (req reqs) 1773 (dolist (req reqs)
1756 (setq name (car req) 1774 (setq name (car req)
1757 vers (cadr req) 1775 vers (cadr req)
1758 text (format "%s-%s" (symbol-name name) 1776 text (format "%s-%s" (symbol-name name)
1759 (package-version-join vers))) 1777 (package-version-join vers)))
1760 (cond (first (setq first nil)) 1778 (cond (first (setq first nil))
1761 ((>= (+ 2 (current-column) (length text)) 1779 ((>= (+ 2 (current-column) (length text))
1762 (window-width)) 1780 (window-width))
1763 (insert ",\n ")) 1781 (insert ",\n "))
1764 (t (insert ", "))) 1782 (t (insert ", ")))
1765 (help-insert-xref-button text 'help-package name)) 1783 (help-insert-xref-button text 'help-package name))
1766 (insert "\n"))) 1784 (insert "\n")))
1767 (insert " " (propertize "Summary" 'font-lock-face 'bold) 1785 (insert " " (propertize "Summary" 'font-lock-face 'bold)
1768 ": " (if desc (package-desc-summary desc)) "\n") 1786 ": " (if desc (package-desc-summary desc)) "\n")
1769 (when homepage 1787 (when homepage
1770 (insert " " (propertize "Homepage" 'font-lock-face 'bold) ": ") 1788 (insert " " (propertize "Homepage" 'font-lock-face 'bold) ": ")
1771 (help-insert-xref-button homepage 'help-url homepage) 1789 (help-insert-xref-button homepage 'help-url homepage)
@@ -1807,23 +1825,23 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
1807 (insert "\n") 1825 (insert "\n")
1808 1826
1809 (if built-in 1827 (if built-in
1810 ;; For built-in packages, insert the commentary. 1828 ;; For built-in packages, insert the commentary.
1811 (let ((fn (locate-file (format "%s.el" name) load-path 1829 (let ((fn (locate-file (format "%s.el" name) load-path
1812 load-file-rep-suffixes)) 1830 load-file-rep-suffixes))
1813 (opoint (point))) 1831 (opoint (point)))
1814 (insert (or (lm-commentary fn) "")) 1832 (insert (or (lm-commentary fn) ""))
1815 (save-excursion 1833 (save-excursion
1816 (goto-char opoint) 1834 (goto-char opoint)
1817 (when (re-search-forward "^;;; Commentary:\n" nil t) 1835 (when (re-search-forward "^;;; Commentary:\n" nil t)
1818 (replace-match "")) 1836 (replace-match ""))
1819 (while (re-search-forward "^\\(;+ ?\\)" nil t) 1837 (while (re-search-forward "^\\(;+ ?\\)" nil t)
1820 (replace-match "")))) 1838 (replace-match ""))))
1821 (let ((readme (expand-file-name (format "%s-readme.txt" name) 1839 (let ((readme (expand-file-name (format "%s-readme.txt" name)
1822 package-user-dir)) 1840 package-user-dir))
1823 readme-string) 1841 readme-string)
1824 ;; For elpa packages, try downloading the commentary. If that 1842 ;; For elpa packages, try downloading the commentary. If that
1825 ;; fails, try an existing readme file in `package-user-dir'. 1843 ;; fails, try an existing readme file in `package-user-dir'.
1826 (cond ((condition-case nil 1844 (cond ((condition-case nil
1827 (save-excursion 1845 (save-excursion
1828 (package--with-work-buffer 1846 (package--with-work-buffer
1829 (package-archive-base desc) 1847 (package-archive-base desc)
@@ -1837,11 +1855,11 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
1837 nil 'silent) 1855 nil 'silent)
1838 (setq readme-string (buffer-string)) 1856 (setq readme-string (buffer-string))
1839 t)) 1857 t))
1840 (error nil)) 1858 (error nil))
1841 (insert readme-string)) 1859 (insert readme-string))
1842 ((file-readable-p readme) 1860 ((file-readable-p readme)
1843 (insert-file-contents readme) 1861 (insert-file-contents readme)
1844 (goto-char (point-max)))))))) 1862 (goto-char (point-max))))))))
1845 1863
1846(defun package-install-button-action (button) 1864(defun package-install-button-action (button)
1847 (let ((pkg-desc (button-get button 'package-desc))) 1865 (let ((pkg-desc (button-get button 'package-desc)))
@@ -1870,7 +1888,7 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
1870 1888
1871(defvar package-menu-mode-map 1889(defvar package-menu-mode-map
1872 (let ((map (make-sparse-keymap)) 1890 (let ((map (make-sparse-keymap))
1873 (menu-map (make-sparse-keymap "Package"))) 1891 (menu-map (make-sparse-keymap "Package")))
1874 (set-keymap-parent map tabulated-list-mode-map) 1892 (set-keymap-parent map tabulated-list-mode-map)
1875 (define-key map "\C-m" 'package-menu-describe-package) 1893 (define-key map "\C-m" 'package-menu-describe-package)
1876 (define-key map "u" 'package-menu-mark-unmark) 1894 (define-key map "u" 'package-menu-mark-unmark)
@@ -1887,54 +1905,54 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
1887 (define-key map [menu-bar package-menu] (cons "Package" menu-map)) 1905 (define-key map [menu-bar package-menu] (cons "Package" menu-map))
1888 (define-key menu-map [mq] 1906 (define-key menu-map [mq]
1889 '(menu-item "Quit" quit-window 1907 '(menu-item "Quit" quit-window
1890 :help "Quit package selection")) 1908 :help "Quit package selection"))
1891 (define-key menu-map [s1] '("--")) 1909 (define-key menu-map [s1] '("--"))
1892 (define-key menu-map [mn] 1910 (define-key menu-map [mn]
1893 '(menu-item "Next" next-line 1911 '(menu-item "Next" next-line
1894 :help "Next Line")) 1912 :help "Next Line"))
1895 (define-key menu-map [mp] 1913 (define-key menu-map [mp]
1896 '(menu-item "Previous" previous-line 1914 '(menu-item "Previous" previous-line
1897 :help "Previous Line")) 1915 :help "Previous Line"))
1898 (define-key menu-map [s2] '("--")) 1916 (define-key menu-map [s2] '("--"))
1899 (define-key menu-map [mu] 1917 (define-key menu-map [mu]
1900 '(menu-item "Unmark" package-menu-mark-unmark 1918 '(menu-item "Unmark" package-menu-mark-unmark
1901 :help "Clear any marks on a package and move to the next line")) 1919 :help "Clear any marks on a package and move to the next line"))
1902 (define-key menu-map [munm] 1920 (define-key menu-map [munm]
1903 '(menu-item "Unmark Backwards" package-menu-backup-unmark 1921 '(menu-item "Unmark Backwards" package-menu-backup-unmark
1904 :help "Back up one line and clear any marks on that package")) 1922 :help "Back up one line and clear any marks on that package"))
1905 (define-key menu-map [md] 1923 (define-key menu-map [md]
1906 '(menu-item "Mark for Deletion" package-menu-mark-delete 1924 '(menu-item "Mark for Deletion" package-menu-mark-delete
1907 :help "Mark a package for deletion and move to the next line")) 1925 :help "Mark a package for deletion and move to the next line"))
1908 (define-key menu-map [mi] 1926 (define-key menu-map [mi]
1909 '(menu-item "Mark for Install" package-menu-mark-install 1927 '(menu-item "Mark for Install" package-menu-mark-install
1910 :help "Mark a package for installation and move to the next line")) 1928 :help "Mark a package for installation and move to the next line"))
1911 (define-key menu-map [mupgrades] 1929 (define-key menu-map [mupgrades]
1912 '(menu-item "Mark Upgradable Packages" package-menu-mark-upgrades 1930 '(menu-item "Mark Upgradable Packages" package-menu-mark-upgrades
1913 :help "Mark packages that have a newer version for upgrading")) 1931 :help "Mark packages that have a newer version for upgrading"))
1914 (define-key menu-map [s3] '("--")) 1932 (define-key menu-map [s3] '("--"))
1915 (define-key menu-map [mf] 1933 (define-key menu-map [mf]
1916 '(menu-item "Filter Package List..." package-menu-filter 1934 '(menu-item "Filter Package List..." package-menu-filter
1917 :help "Filter package selection (q to go back)")) 1935 :help "Filter package selection (q to go back)"))
1918 (define-key menu-map [mg] 1936 (define-key menu-map [mg]
1919 '(menu-item "Update Package List" revert-buffer 1937 '(menu-item "Update Package List" revert-buffer
1920 :help "Update the list of packages")) 1938 :help "Update the list of packages"))
1921 (define-key menu-map [mr] 1939 (define-key menu-map [mr]
1922 '(menu-item "Refresh Package List" package-menu-refresh 1940 '(menu-item "Refresh Package List" package-menu-refresh
1923 :help "Download the ELPA archive")) 1941 :help "Download the ELPA archive"))
1924 (define-key menu-map [s4] '("--")) 1942 (define-key menu-map [s4] '("--"))
1925 (define-key menu-map [mt] 1943 (define-key menu-map [mt]
1926 '(menu-item "Mark Obsolete Packages" package-menu-mark-obsolete-for-deletion 1944 '(menu-item "Mark Obsolete Packages" package-menu-mark-obsolete-for-deletion
1927 :help "Mark all obsolete packages for deletion")) 1945 :help "Mark all obsolete packages for deletion"))
1928 (define-key menu-map [mx] 1946 (define-key menu-map [mx]
1929 '(menu-item "Execute Actions" package-menu-execute 1947 '(menu-item "Execute Actions" package-menu-execute
1930 :help "Perform all the marked actions")) 1948 :help "Perform all the marked actions"))
1931 (define-key menu-map [s5] '("--")) 1949 (define-key menu-map [s5] '("--"))
1932 (define-key menu-map [mh] 1950 (define-key menu-map [mh]
1933 '(menu-item "Help" package-menu-quick-help 1951 '(menu-item "Help" package-menu-quick-help
1934 :help "Show short key binding help for package-menu-mode")) 1952 :help "Show short key binding help for package-menu-mode"))
1935 (define-key menu-map [mc] 1953 (define-key menu-map [mc]
1936 '(menu-item "Describe Package" package-menu-describe-package 1954 '(menu-item "Describe Package" package-menu-describe-package
1937 :help "Display information about this package")) 1955 :help "Display information about this package"))
1938 map) 1956 map)
1939 "Local keymap for `package-menu-mode' buffers.") 1957 "Local keymap for `package-menu-mode' buffers.")
1940 1958
@@ -2029,8 +2047,8 @@ KEYWORDS should be nil or a list of keywords."
2029 (package--has-keyword-p (package--from-builtin elt) keywords) 2047 (package--has-keyword-p (package--from-builtin elt) keywords)
2030 (or package-list-unversioned 2048 (or package-list-unversioned
2031 (package--bi-desc-version (cdr elt))) 2049 (package--bi-desc-version (cdr elt)))
2032 (or (eq packages t) (memq name packages))) 2050 (or (eq packages t) (memq name packages)))
2033 (package--push (package--from-builtin elt) "built-in" info-list))) 2051 (package--push (package--from-builtin elt) "built-in" info-list)))
2034 2052
2035 ;; Available and disabled packages: 2053 ;; Available and disabled packages:
2036 (dolist (elt package-archive-contents) 2054 (dolist (elt package-archive-contents)
@@ -2075,7 +2093,7 @@ Built-in packages are converted with `package--from-builtin'."
2075 (when (and (not (eq name 'emacs)) ; Hide the `emacs' package. 2093 (when (and (not (eq name 'emacs)) ; Hide the `emacs' package.
2076 (or package-list-unversioned 2094 (or package-list-unversioned
2077 (package--bi-desc-version (cdr elt))) 2095 (package--bi-desc-version (cdr elt)))
2078 (or (eq packages t) (memq name packages))) 2096 (or (eq packages t) (memq name packages)))
2079 (funcall function (package--from-builtin elt)))) 2097 (funcall function (package--from-builtin elt))))
2080 2098
2081 ;; Available and disabled packages: 2099 ;; Available and disabled packages:
@@ -2126,8 +2144,8 @@ shown."
2126PKG has the form (PKG-DESC . STATUS). 2144PKG has the form (PKG-DESC . STATUS).
2127Return (PKG-DESC [NAME VERSION STATUS DOC])." 2145Return (PKG-DESC [NAME VERSION STATUS DOC])."
2128 (let* ((pkg-desc (car pkg)) 2146 (let* ((pkg-desc (car pkg))
2129 (status (cdr pkg)) 2147 (status (cdr pkg))
2130 (face (pcase status 2148 (face (pcase status
2131 (`"built-in" 'font-lock-builtin-face) 2149 (`"built-in" 'font-lock-builtin-face)
2132 (`"available" 'default) 2150 (`"available" 'default)
2133 (`"new" 'bold) 2151 (`"new" 'bold)
@@ -2137,7 +2155,7 @@ Return (PKG-DESC [NAME VERSION STATUS DOC])."
2137 (`"unsigned" 'font-lock-warning-face) 2155 (`"unsigned" 'font-lock-warning-face)
2138 (_ 'font-lock-warning-face)))) ; obsolete. 2156 (_ 'font-lock-warning-face)))) ; obsolete.
2139 (list pkg-desc 2157 (list pkg-desc
2140 `[,(list (symbol-name (package-desc-name pkg-desc)) 2158 `[,(list (symbol-name (package-desc-name pkg-desc))
2141 'face 'link 2159 'face 'link
2142 'follow-link t 2160 'follow-link t
2143 'package-desc pkg-desc 2161 'package-desc pkg-desc
@@ -2167,9 +2185,9 @@ This fetches the contents of each archive specified in
2167If optional arg BUTTON is non-nil, describe its associated package." 2185If optional arg BUTTON is non-nil, describe its associated package."
2168 (interactive) 2186 (interactive)
2169 (let ((pkg-desc (if button (button-get button 'package-desc) 2187 (let ((pkg-desc (if button (button-get button 'package-desc)
2170 (tabulated-list-get-id)))) 2188 (tabulated-list-get-id))))
2171 (if pkg-desc 2189 (if pkg-desc
2172 (describe-package pkg-desc) 2190 (describe-package pkg-desc)
2173 (user-error "No package here")))) 2191 (user-error "No package here"))))
2174 2192
2175;; fixme numeric argument 2193;; fixme numeric argument
@@ -2205,8 +2223,8 @@ If optional arg BUTTON is non-nil, describe its associated package."
2205 (goto-char (point-min)) 2223 (goto-char (point-min))
2206 (while (not (eobp)) 2224 (while (not (eobp))
2207 (if (equal (package-menu-get-status) "obsolete") 2225 (if (equal (package-menu-get-status) "obsolete")
2208 (tabulated-list-put-tag "D" t) 2226 (tabulated-list-put-tag "D" t)
2209 (forward-line 1))))) 2227 (forward-line 1)))))
2210 2228
2211(defun package-menu-quick-help () 2229(defun package-menu-quick-help ()
2212 "Show short key binding help for package-menu-mode." 2230 "Show short key binding help for package-menu-mode."
@@ -2218,9 +2236,9 @@ If optional arg BUTTON is non-nil, describe its associated package."
2218 2236
2219(defun package-menu-get-status () 2237(defun package-menu-get-status ()
2220 (let* ((id (tabulated-list-get-id)) 2238 (let* ((id (tabulated-list-get-id))
2221 (entry (and id (assq id tabulated-list-entries)))) 2239 (entry (and id (assq id tabulated-list-entries))))
2222 (if entry 2240 (if entry
2223 (aref (cadr entry) 2) 2241 (aref (cadr entry) 2)
2224 ""))) 2242 "")))
2225 2243
2226(defun package-menu--find-upgrades () 2244(defun package-menu--find-upgrades ()
@@ -2229,7 +2247,7 @@ If optional arg BUTTON is non-nil, describe its associated package."
2229 (dolist (entry tabulated-list-entries) 2247 (dolist (entry tabulated-list-entries)
2230 ;; ENTRY is (PKG-DESC [NAME VERSION STATUS DOC]) 2248 ;; ENTRY is (PKG-DESC [NAME VERSION STATUS DOC])
2231 (let ((pkg-desc (car entry)) 2249 (let ((pkg-desc (car entry))
2232 (status (aref (cadr entry) 2))) 2250 (status (aref (cadr entry) 2)))
2233 (cond ((member status '("installed" "unsigned")) 2251 (cond ((member status '("installed" "unsigned"))
2234 (push pkg-desc installed)) 2252 (push pkg-desc installed))
2235 ((member status '("available" "new")) 2253 ((member status '("available" "new"))
@@ -2255,22 +2273,22 @@ call will upgrade the package."
2255 (error "The current buffer is not a Package Menu")) 2273 (error "The current buffer is not a Package Menu"))
2256 (let ((upgrades (package-menu--find-upgrades))) 2274 (let ((upgrades (package-menu--find-upgrades)))
2257 (if (null upgrades) 2275 (if (null upgrades)
2258 (message "No packages to upgrade.") 2276 (message "No packages to upgrade.")
2259 (widen) 2277 (widen)
2260 (save-excursion 2278 (save-excursion
2261 (goto-char (point-min)) 2279 (goto-char (point-min))
2262 (while (not (eobp)) 2280 (while (not (eobp))
2263 (let* ((pkg-desc (tabulated-list-get-id)) 2281 (let* ((pkg-desc (tabulated-list-get-id))
2264 (upgrade (cdr (assq (package-desc-name pkg-desc) upgrades)))) 2282 (upgrade (cdr (assq (package-desc-name pkg-desc) upgrades))))
2265 (cond ((null upgrade) 2283 (cond ((null upgrade)
2266 (forward-line 1)) 2284 (forward-line 1))
2267 ((equal pkg-desc upgrade) 2285 ((equal pkg-desc upgrade)
2268 (package-menu-mark-install)) 2286 (package-menu-mark-install))
2269 (t 2287 (t
2270 (package-menu-mark-delete)))))) 2288 (package-menu-mark-delete))))))
2271 (message "%d package%s marked for upgrading." 2289 (message "%d package%s marked for upgrading."
2272 (length upgrades) 2290 (length upgrades)
2273 (if (= (length upgrades) 1) "" "s"))))) 2291 (if (= (length upgrades) 1) "" "s")))))
2274 2292
2275(defun package-menu-execute (&optional noquery) 2293(defun package-menu-execute (&optional noquery)
2276 "Perform marked Package Menu actions. 2294 "Perform marked Package Menu actions.
@@ -2284,15 +2302,15 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm."
2284 (save-excursion 2302 (save-excursion
2285 (goto-char (point-min)) 2303 (goto-char (point-min))
2286 (while (not (eobp)) 2304 (while (not (eobp))
2287 (setq cmd (char-after)) 2305 (setq cmd (char-after))
2288 (unless (eq cmd ?\s) 2306 (unless (eq cmd ?\s)
2289 ;; This is the key PKG-DESC. 2307 ;; This is the key PKG-DESC.
2290 (setq pkg-desc (tabulated-list-get-id)) 2308 (setq pkg-desc (tabulated-list-get-id))
2291 (cond ((eq cmd ?D) 2309 (cond ((eq cmd ?D)
2292 (push pkg-desc delete-list)) 2310 (push pkg-desc delete-list))
2293 ((eq cmd ?I) 2311 ((eq cmd ?I)
2294 (push pkg-desc install-list)))) 2312 (push pkg-desc install-list))))
2295 (forward-line))) 2313 (forward-line)))
2296 (when install-list 2314 (when install-list
2297 (if (or 2315 (if (or
2298 noquery 2316 noquery
@@ -2312,64 +2330,64 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm."
2312 (if (or 2330 (if (or
2313 noquery 2331 noquery
2314 (yes-or-no-p 2332 (yes-or-no-p
2315 (if (= (length delete-list) 1) 2333 (if (= (length delete-list) 1)
2316 (format "Delete package `%s'? " 2334 (format "Delete package `%s'? "
2317 (package-desc-full-name (car delete-list))) 2335 (package-desc-full-name (car delete-list)))
2318 (format "Delete these %d packages (%s)? " 2336 (format "Delete these %d packages (%s)? "
2319 (length delete-list) 2337 (length delete-list)
2320 (mapconcat #'package-desc-full-name 2338 (mapconcat #'package-desc-full-name
2321 delete-list ", "))))) 2339 delete-list ", ")))))
2322 (dolist (elt delete-list) 2340 (dolist (elt delete-list)
2323 (condition-case-unless-debug err 2341 (condition-case-unless-debug err
2324 (package-delete elt) 2342 (package-delete elt)
2325 (error (message (cadr err))))) 2343 (error (message (cadr err)))))
2326 (error "Aborted"))) 2344 (error "Aborted")))
2327 (if (or delete-list install-list) 2345 (if (or delete-list install-list)
2328 (package-menu--generate t t) 2346 (package-menu--generate t t)
2329 (message "No operations specified.")))) 2347 (message "No operations specified."))))
2330 2348
2331(defun package-menu--version-predicate (A B) 2349(defun package-menu--version-predicate (A B)
2332 (let ((vA (or (aref (cadr A) 1) '(0))) 2350 (let ((vA (or (aref (cadr A) 1) '(0)))
2333 (vB (or (aref (cadr B) 1) '(0)))) 2351 (vB (or (aref (cadr B) 1) '(0))))
2334 (if (version-list-= vA vB) 2352 (if (version-list-= vA vB)
2335 (package-menu--name-predicate A B) 2353 (package-menu--name-predicate A B)
2336 (version-list-< vA vB)))) 2354 (version-list-< vA vB))))
2337 2355
2338(defun package-menu--status-predicate (A B) 2356(defun package-menu--status-predicate (A B)
2339 (let ((sA (aref (cadr A) 2)) 2357 (let ((sA (aref (cadr A) 2))
2340 (sB (aref (cadr B) 2))) 2358 (sB (aref (cadr B) 2)))
2341 (cond ((string= sA sB) 2359 (cond ((string= sA sB)
2342 (package-menu--name-predicate A B)) 2360 (package-menu--name-predicate A B))
2343 ((string= sA "new") t) 2361 ((string= sA "new") t)
2344 ((string= sB "new") nil) 2362 ((string= sB "new") nil)
2345 ((string= sA "available") t) 2363 ((string= sA "available") t)
2346 ((string= sB "available") nil) 2364 ((string= sB "available") nil)
2347 ((string= sA "installed") t) 2365 ((string= sA "installed") t)
2348 ((string= sB "installed") nil) 2366 ((string= sB "installed") nil)
2349 ((string= sA "unsigned") t) 2367 ((string= sA "unsigned") t)
2350 ((string= sB "unsigned") nil) 2368 ((string= sB "unsigned") nil)
2351 ((string= sA "held") t) 2369 ((string= sA "held") t)
2352 ((string= sB "held") nil) 2370 ((string= sB "held") nil)
2353 ((string= sA "built-in") t) 2371 ((string= sA "built-in") t)
2354 ((string= sB "built-in") nil) 2372 ((string= sB "built-in") nil)
2355 ((string= sA "obsolete") t) 2373 ((string= sA "obsolete") t)
2356 ((string= sB "obsolete") nil) 2374 ((string= sB "obsolete") nil)
2357 (t (string< sA sB))))) 2375 (t (string< sA sB)))))
2358 2376
2359(defun package-menu--description-predicate (A B) 2377(defun package-menu--description-predicate (A B)
2360 (let ((dA (aref (cadr A) 3)) 2378 (let ((dA (aref (cadr A) 3))
2361 (dB (aref (cadr B) 3))) 2379 (dB (aref (cadr B) 3)))
2362 (if (string= dA dB) 2380 (if (string= dA dB)
2363 (package-menu--name-predicate A B) 2381 (package-menu--name-predicate A B)
2364 (string< dA dB)))) 2382 (string< dA dB))))
2365 2383
2366(defun package-menu--name-predicate (A B) 2384(defun package-menu--name-predicate (A B)
2367 (string< (symbol-name (package-desc-name (car A))) 2385 (string< (symbol-name (package-desc-name (car A)))
2368 (symbol-name (package-desc-name (car B))))) 2386 (symbol-name (package-desc-name (car B)))))
2369 2387
2370(defun package-menu--archive-predicate (A B) 2388(defun package-menu--archive-predicate (A B)
2371 (string< (or (package-desc-archive (car A)) "") 2389 (string< (or (package-desc-archive (car A)) "")
2372 (or (package-desc-archive (car B)) ""))) 2390 (or (package-desc-archive (car B)) "")))
2373 2391
2374;;;###autoload 2392;;;###autoload
2375(defun list-packages (&optional no-fetch) 2393(defun list-packages (&optional no-fetch)
@@ -2391,27 +2409,27 @@ The list is displayed in a buffer named `*Packages*'."
2391 (package-refresh-contents) 2409 (package-refresh-contents)
2392 ;; Find which packages are new. 2410 ;; Find which packages are new.
2393 (dolist (elt package-archive-contents) 2411 (dolist (elt package-archive-contents)
2394 (unless (assq (car elt) old-archives) 2412 (unless (assq (car elt) old-archives)
2395 (push (car elt) new-packages)))) 2413 (push (car elt) new-packages))))
2396 2414
2397 ;; Generate the Package Menu. 2415 ;; Generate the Package Menu.
2398 (let ((buf (get-buffer-create "*Packages*"))) 2416 (let ((buf (get-buffer-create "*Packages*")))
2399 (with-current-buffer buf 2417 (with-current-buffer buf
2400 (package-menu-mode) 2418 (package-menu-mode)
2401 (set (make-local-variable 'package-menu--new-package-list) 2419 (set (make-local-variable 'package-menu--new-package-list)
2402 new-packages) 2420 new-packages)
2403 (package-menu--generate nil t)) 2421 (package-menu--generate nil t))
2404 ;; The package menu buffer has keybindings. If the user types 2422 ;; The package menu buffer has keybindings. If the user types
2405 ;; `M-x list-packages', that suggests it should become current. 2423 ;; `M-x list-packages', that suggests it should become current.
2406 (switch-to-buffer buf)) 2424 (switch-to-buffer buf))
2407 2425
2408 (let ((upgrades (package-menu--find-upgrades))) 2426 (let ((upgrades (package-menu--find-upgrades)))
2409 (if upgrades 2427 (if upgrades
2410 (message "%d package%s can be upgraded; type `%s' to mark %s for upgrading." 2428 (message "%d package%s can be upgraded; type `%s' to mark %s for upgrading."
2411 (length upgrades) 2429 (length upgrades)
2412 (if (= (length upgrades) 1) "" "s") 2430 (if (= (length upgrades) 1) "" "s")
2413 (substitute-command-keys "\\[package-menu-mark-upgrades]") 2431 (substitute-command-keys "\\[package-menu-mark-upgrades]")
2414 (if (= (length upgrades) 1) "it" "them")))))) 2432 (if (= (length upgrades) 1) "it" "them"))))))
2415 2433
2416;;;###autoload 2434;;;###autoload
2417(defalias 'package-list-packages 'list-packages) 2435(defalias 'package-list-packages 'list-packages)