diff options
| -rw-r--r-- | lisp/ChangeLog | 6 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package.el | 666 |
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 @@ | |||
| 1 | 2015-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 | |||
| 1 | 2015-02-02 Michael Albinus <michael.albinus@gmx.de> | 7 | 2015-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. |
| 302 | Each directory name should be absolute. | 302 | Each directory name should be absolute. |
| @@ -320,8 +320,8 @@ it is unsigned. | |||
| 320 | This also applies to the \"archive-contents\" file that lists the | 320 | This also applies to the \"archive-contents\" file that lists the |
| 321 | contents of the archive." | 321 | contents 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 | |||
| 551 | correspond to previously loaded files (those returned by | 551 | correspond 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'. |
| 679 | Required package `%s-%s' is unavailable" | 679 | Required 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. |
| 1090 | Signal an error if the entire string was not used." | 1090 | Signal 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), | |||
| 1564 | similar to an entry in `package-alist'. Save the cached copy to | 1564 | similar 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. | ||
| 1637 | Finds all packages in `package-alist' which are not dependencies | ||
| 1638 | of any other packages. | ||
| 1639 | Used 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." | |||
| 2126 | PKG has the form (PKG-DESC . STATUS). | 2144 | PKG has the form (PKG-DESC . STATUS). |
| 2127 | Return (PKG-DESC [NAME VERSION STATUS DOC])." | 2145 | Return (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 | |||
| 2167 | If optional arg BUTTON is non-nil, describe its associated package." | 2185 | If 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) |