diff options
| author | Chong Yidong | 2010-11-02 23:25:36 -0400 |
|---|---|---|
| committer | Chong Yidong | 2010-11-02 23:25:36 -0400 |
| commit | 4b99edf23f0abae8cde95ff2cfa3658f7e038f70 (patch) | |
| tree | 7b0f066ac6aadd455a260b2123437242b75411f7 | |
| parent | 73ab9865e6c50586fcfced729824b3aabd03bbae (diff) | |
| download | emacs-4b99edf23f0abae8cde95ff2cfa3658f7e038f70.tar.gz emacs-4b99edf23f0abae8cde95ff2cfa3658f7e038f70.zip | |
Separate built-in packages from elpa packages, for efficiency.
* emacs-lisp/package.el: Don't put built-in packages in
package-alist, to avoid loading inefficiencies.
(package-built-in-p): Make VERSION optional, and treat it as a
minimum acceptable version.
(package-activate): Search separately for built-in packages. Emit
a warning if a dependency fails.
(define-package): Handle most common case, where there is no
obsolete package, first.
(package-compute-transaction): Print required version in error.
(package--initialized): New variable.
(list-packages): Use it.
(package-initialize): Optional arg NO-ACTIVATE. Don't put
built-in packages in packages-alist; keep it separate. Set
package--initialized.
(describe-package): Avoid activating packages as a side-effect.
Search separately for built-in packages.
(describe-package-1): Handle the case where an elpa package is
simultaneously built-in and available/installed.
(package-installed-p, package--generate-package-list): Search
separately for built-in packages.
(package-load-descriptor): Doc fix.
| -rw-r--r-- | lisp/ChangeLog | 24 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package.el | 283 |
2 files changed, 176 insertions, 131 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4cb8061e71e..7eef58d6401 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,27 @@ | |||
| 1 | 2010-11-03 Chong Yidong <cyd@stupidchicken.com> | ||
| 2 | |||
| 3 | * emacs-lisp/package.el: Don't put built-in packages in | ||
| 4 | package-alist, to avoid loading inefficiencies. | ||
| 5 | (package-built-in-p): Make VERSION optional, and treat it as a | ||
| 6 | minimum acceptable version. | ||
| 7 | (package-activate): Search separately for built-in packages. Emit | ||
| 8 | a warning if a dependency fails. | ||
| 9 | (define-package): Handle most common case, where there is no | ||
| 10 | obsolete package, first. | ||
| 11 | (package-compute-transaction): Print required version in error. | ||
| 12 | (package--initialized): New variable. | ||
| 13 | (list-packages): Use it. | ||
| 14 | (package-initialize): Optional arg NO-ACTIVATE. Don't put | ||
| 15 | built-in packages in packages-alist; keep it separate. Set | ||
| 16 | package--initialized. | ||
| 17 | (describe-package): Avoid activating packages as a side-effect. | ||
| 18 | Search separately for built-in packages. | ||
| 19 | (describe-package-1): Handle the case where an elpa package is | ||
| 20 | simultaneously built-in and available/installed. | ||
| 21 | (package-installed-p, package--generate-package-list): Search | ||
| 22 | separately for built-in packages. | ||
| 23 | (package-load-descriptor): Doc fix. | ||
| 24 | |||
| 1 | 2010-11-03 Stefan Monnier <monnier@iro.umontreal.ca> | 25 | 2010-11-03 Stefan Monnier <monnier@iro.umontreal.ca> |
| 2 | 26 | ||
| 3 | * progmodes/perl-mode.el (perl-syntax-propertize-function): | 27 | * progmodes/perl-mode.el (perl-syntax-propertize-function): |
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index e260691da36..a08ea5d2a17 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el | |||
| @@ -329,7 +329,9 @@ E.g., if given \"quux-23.0\", will return \"quux\"" | |||
| 329 | (match-string 1 dirname))) | 329 | (match-string 1 dirname))) |
| 330 | 330 | ||
| 331 | (defun package-load-descriptor (dir package) | 331 | (defun package-load-descriptor (dir package) |
| 332 | "Load the description file in directory DIR for package PACKAGE." | 332 | "Load the description file in directory DIR for package PACKAGE. |
| 333 | Here, PACKAGE is a string of the form NAME-VER, where NAME is the | ||
| 334 | package name and VER is its version." | ||
| 333 | (let* ((pkg-dir (expand-file-name package dir)) | 335 | (let* ((pkg-dir (expand-file-name package dir)) |
| 334 | (pkg-file (expand-file-name | 336 | (pkg-file (expand-file-name |
| 335 | (concat (package-strip-version package) "-pkg") | 337 | (concat (package-strip-version package) "-pkg") |
| @@ -419,42 +421,46 @@ updates `package-alist' and `package-obsolete-alist'." | |||
| 419 | ;; Don't return nil. | 421 | ;; Don't return nil. |
| 420 | t)) | 422 | t)) |
| 421 | 423 | ||
| 422 | (defun package--built-in (package version) | 424 | (defun package-built-in-p (package &optional version) |
| 423 | "Return true if the package is built-in to Emacs." | 425 | "Return true if PACKAGE, of VERSION or newer, is built-in to Emacs." |
| 426 | (require 'finder-inf nil t) ; For `package--builtins'. | ||
| 424 | (let ((elt (assq package package--builtins))) | 427 | (let ((elt (assq package package--builtins))) |
| 425 | (and elt (version-list-= (package-desc-vers (cdr elt)) version)))) | 428 | (and elt (version-list-<= version (package-desc-vers (cdr elt)))))) |
| 426 | 429 | ||
| 427 | ;; FIXME: return a reason instead? | 430 | ;; This function goes ahead and activates a newer version of a package |
| 431 | ;; if an older one was already activated. This is not ideal; we'd at | ||
| 432 | ;; least need to check to see if the package has actually been loaded, | ||
| 433 | ;; and not merely activated. | ||
| 428 | (defun package-activate (package version) | 434 | (defun package-activate (package version) |
| 429 | "Activate a package, and recursively activate its dependencies. | 435 | "Activate package PACKAGE, of version VERSION or newer. |
| 436 | If PACKAGE has any dependencies, recursively activate them. | ||
| 430 | Return nil if the package could not be activated." | 437 | Return nil if the package could not be activated." |
| 431 | ;; Assume the user knows what he is doing -- go ahead and activate a | 438 | (let ((pkg-vec (cdr (assq package package-alist))) |
| 432 | ;; newer version of a package if an older one has already been | 439 | available-version found) |
| 433 | ;; activated. This is not ideal; we'd at least need to check to see | 440 | ;; Check if PACKAGE is available in `package-alist'. |
| 434 | ;; if the package has actually been loaded, and not merely | 441 | (when pkg-vec |
| 435 | ;; activated. However, don't try to activate 'emacs', as that makes | 442 | (setq available-version (package-desc-vers pkg-vec) |
| 436 | ;; no sense. | 443 | found (version-list-<= version available-version))) |
| 437 | (unless (eq package 'emacs) | 444 | (cond |
| 438 | (let* ((pkg-desc (assq package package-alist)) | 445 | ;; If no such package is found, maybe it's built-in. |
| 439 | (this-version (package-desc-vers (cdr pkg-desc))) | 446 | ((null found) |
| 440 | (req-list (package-desc-reqs (cdr pkg-desc))) | 447 | (package-built-in-p package version)) |
| 441 | ;; If the package was never activated, do it now. | 448 | ;; If the package is already activated, just return t. |
| 442 | (keep-going (or (not (memq package package-activated-list)) | 449 | ((memq package package-activated-list) |
| 443 | (version-list-< version this-version)))) | 450 | t) |
| 444 | (while (and req-list keep-going) | 451 | ;; Otherwise, proceed with activation. |
| 445 | (let* ((req (car req-list)) | 452 | (t |
| 446 | (req-name (car req)) | 453 | (let ((fail (catch 'dep-failure |
| 447 | (req-version (cadr req))) | 454 | ;; Activate its dependencies recursively. |
| 448 | (or (package-activate req-name req-version) | 455 | (dolist (req (package-desc-reqs pkg-vec)) |
| 449 | (setq keep-going nil))) | 456 | (unless (package-activate (car req) (cadr req)) |
| 450 | (setq req-list (cdr req-list))) | 457 | (throw 'dep-failure req)))))) |
| 451 | (if keep-going | 458 | (if fail |
| 452 | (package-activate-1 package (cdr pkg-desc)) | 459 | (warn "Unable to activate package `%s'. |
| 453 | ;; We get here if a dependency failed to activate -- but we | 460 | Required package `%s', version %s, is unavailable" |
| 454 | ;; can also get here if the requested package was already | 461 | package (car fail) (package-version-join (cadr fail))) |
| 455 | ;; activated. Return non-nil in the latter case. | 462 | ;; If all goes well, activate the package itself. |
| 456 | (and (memq package package-activated-list) | 463 | (package-activate-1 package pkg-vec))))))) |
| 457 | (version-list-<= version this-version)))))) | ||
| 458 | 464 | ||
| 459 | (defun package-mark-obsolete (package pkg-vec) | 465 | (defun package-mark-obsolete (package pkg-vec) |
| 460 | "Put package on the obsolete list, if not already there." | 466 | "Put package on the obsolete list, if not already there." |
| @@ -470,48 +476,45 @@ Return nil if the package could not be activated." | |||
| 470 | pkg-vec))) | 476 | pkg-vec))) |
| 471 | package-obsolete-alist)))) | 477 | package-obsolete-alist)))) |
| 472 | 478 | ||
| 473 | (defun define-package (name-str version-string | 479 | (defun define-package (name-string version-string |
| 474 | &optional docstring requirements | 480 | &optional docstring requirements |
| 475 | &rest extra-properties) | 481 | &rest extra-properties) |
| 476 | "Define a new package. | 482 | "Define a new package. |
| 477 | NAME is the name of the package, a string. | 483 | NAME-STRING is the name of the package, as a string. |
| 478 | VERSION-STRING is the version of the package, a dotted sequence | 484 | VERSION-STRING is the version of the package, as a list of |
| 479 | of integers. | 485 | integers of the form produced by `version-to-list'. |
| 480 | DOCSTRING is the optional description. | 486 | DOCSTRING is a short description of the package, a string. |
| 481 | REQUIREMENTS is a list of requirements on other packages. | 487 | REQUIREMENTS is a list of dependencies on other packages. |
| 482 | Each requirement is of the form (OTHER-PACKAGE \"VERSION\"). | 488 | Each requirement is of the form (OTHER-PACKAGE \"VERSION\"). |
| 483 | 489 | ||
| 484 | EXTRA-PROPERTIES is currently unused." | 490 | EXTRA-PROPERTIES is currently unused." |
| 485 | (let* ((name (intern name-str)) | 491 | (let* ((name (intern name-string)) |
| 486 | (pkg-desc (assq name package-alist)) | 492 | (version (version-to-list version-string)) |
| 487 | (new-version (version-to-list version-string)) | ||
| 488 | (new-pkg-desc | 493 | (new-pkg-desc |
| 489 | (cons name | 494 | (cons name |
| 490 | (vector new-version | 495 | (vector version |
| 491 | (mapcar | 496 | (mapcar |
| 492 | (lambda (elt) | 497 | (lambda (elt) |
| 493 | (list (car elt) | 498 | (list (car elt) |
| 494 | (version-to-list (car (cdr elt))))) | 499 | (version-to-list (car (cdr elt))))) |
| 495 | requirements) | 500 | requirements) |
| 496 | docstring)))) | 501 | docstring))) |
| 497 | ;; Only redefine a package if the redefinition is newer. | 502 | (old-pkg (assq name package-alist))) |
| 498 | (if (or (not pkg-desc) | 503 | (cond |
| 499 | (version-list-< (package-desc-vers (cdr pkg-desc)) | 504 | ;; If there's no old package, just add this to `package-alist'. |
| 500 | new-version)) | 505 | ((null old-pkg) |
| 501 | (progn | 506 | (push new-pkg-desc package-alist)) |
| 502 | (when pkg-desc | 507 | ((version-list-< (package-desc-vers (cdr old-pkg)) version) |
| 503 | ;; Remove old package and declare it obsolete. | 508 | ;; Remove the old package and declare it obsolete. |
| 504 | (setq package-alist (delq pkg-desc package-alist)) | 509 | (package-mark-obsolete name (cdr old-pkg)) |
| 505 | (package-mark-obsolete (car pkg-desc) (cdr pkg-desc))) | 510 | (setq package-alist (cons new-pkg-desc |
| 506 | ;; Add package to the alist. | 511 | (delq old-pkg package-alist)))) |
| 507 | (push new-pkg-desc package-alist)) | 512 | ;; You can have two packages with the same version, e.g. one in |
| 508 | ;; You can have two packages with the same version, for instance | 513 | ;; the system package directory and one in your private |
| 509 | ;; one in the system package directory and one in your private | 514 | ;; directory. We just let the first one win. |
| 510 | ;; directory. We just let the first one win. | 515 | ((not (version-list-= (package-desc-vers (cdr old-pkg)) version)) |
| 511 | (unless (version-list-= new-version | 516 | ;; The package is born obsolete. |
| 512 | (package-desc-vers (cdr pkg-desc))) | 517 | (package-mark-obsolete name (cdr new-pkg-desc)))))) |
| 513 | ;; The package is born obsolete. | ||
| 514 | (package-mark-obsolete (car new-pkg-desc) (cdr new-pkg-desc)))))) | ||
| 515 | 518 | ||
| 516 | ;; From Emacs 22. | 519 | ;; From Emacs 22. |
| 517 | (defun package-autoload-ensure-default-file (file) | 520 | (defun package-autoload-ensure-default-file (file) |
| @@ -657,10 +660,14 @@ It will move point to somewhere in the headers." | |||
| 657 | (kill-buffer tar-buffer)))) | 660 | (kill-buffer tar-buffer)))) |
| 658 | 661 | ||
| 659 | (defun package-installed-p (package &optional min-version) | 662 | (defun package-installed-p (package &optional min-version) |
| 663 | "Return true if PACKAGE, of VERSION or newer, is installed. | ||
| 664 | Built-in packages also qualify." | ||
| 660 | (let ((pkg-desc (assq package package-alist))) | 665 | (let ((pkg-desc (assq package package-alist))) |
| 661 | (and pkg-desc | 666 | (if pkg-desc |
| 662 | (version-list-<= min-version | 667 | (version-list-<= min-version |
| 663 | (package-desc-vers (cdr pkg-desc)))))) | 668 | (package-desc-vers (cdr pkg-desc))) |
| 669 | ;; Also check built-in packages. | ||
| 670 | (package-built-in-p package min-version)))) | ||
| 664 | 671 | ||
| 665 | (defun package-compute-transaction (package-list requirements) | 672 | (defun package-compute-transaction (package-list requirements) |
| 666 | "Return a list of packages to be installed, including PACKAGE-LIST. | 673 | "Return a list of packages to be installed, including PACKAGE-LIST. |
| @@ -696,8 +703,9 @@ but version %s required" | |||
| 696 | (symbol-name next-pkg) hold | 703 | (symbol-name next-pkg) hold |
| 697 | (package-version-join next-version))))) | 704 | (package-version-join next-version))))) |
| 698 | (unless pkg-desc | 705 | (unless pkg-desc |
| 699 | (error "Package '%s' is not available for installation" | 706 | (error "Package '%s', version %s, unavailable for installation" |
| 700 | (symbol-name next-pkg))) | 707 | (symbol-name next-pkg) |
| 708 | (package-version-join next-version))) | ||
| 701 | (unless (version-list-<= next-version | 709 | (unless (version-list-<= next-version |
| 702 | (package-desc-vers (cdr pkg-desc))) | 710 | (package-desc-vers (cdr pkg-desc))) |
| 703 | (error | 711 | (error |
| @@ -1014,24 +1022,21 @@ makes them available for download." | |||
| 1014 | (car archive))))) | 1022 | (car archive))))) |
| 1015 | (package-read-all-archive-contents)) | 1023 | (package-read-all-archive-contents)) |
| 1016 | 1024 | ||
| 1025 | (defvar package--initialized nil) | ||
| 1026 | |||
| 1017 | ;;;###autoload | 1027 | ;;;###autoload |
| 1018 | (defun package-initialize () | 1028 | (defun package-initialize (&optional no-activate) |
| 1019 | "Load Emacs Lisp packages, and activate them. | 1029 | "Load Emacs Lisp packages, and activate them. |
| 1020 | The variable `package-load-list' controls which packages to load." | 1030 | The variable `package-load-list' controls which packages to load. |
| 1031 | If optional arg NO-ACTIVATE is non-nil, don't activate packages." | ||
| 1021 | (interactive) | 1032 | (interactive) |
| 1022 | (require 'finder-inf nil t) | 1033 | (setq package-obsolete-alist nil) |
| 1023 | (setq package-alist package--builtins | ||
| 1024 | package-activated-list (mapcar #'car package-alist) | ||
| 1025 | package-obsolete-alist nil) | ||
| 1026 | (package-load-all-descriptors) | 1034 | (package-load-all-descriptors) |
| 1027 | (package-read-all-archive-contents) | 1035 | (package-read-all-archive-contents) |
| 1028 | ;; "Deactivate" obsoleted built-in packages | 1036 | (unless no-activate |
| 1029 | (dolist (elt package-obsolete-alist) | 1037 | (dolist (elt package-alist) |
| 1030 | (setq package-activated-list | 1038 | (package-activate (car elt) (package-desc-vers (cdr elt))))) |
| 1031 | (delq (car elt) package-activated-list))) | 1039 | (setq package--initialized t)) |
| 1032 | ;; Try to activate all our packages. | ||
| 1033 | (dolist (elt package-alist) | ||
| 1034 | (package-activate (car elt) (package-desc-vers (cdr elt))))) | ||
| 1035 | 1040 | ||
| 1036 | 1041 | ||
| 1037 | ;;;; Package description buffer. | 1042 | ;;;; Package description buffer. |
| @@ -1042,11 +1047,13 @@ The variable `package-load-list' controls which packages to load." | |||
| 1042 | (interactive | 1047 | (interactive |
| 1043 | (let* ((guess (function-called-at-point)) | 1048 | (let* ((guess (function-called-at-point)) |
| 1044 | packages val) | 1049 | packages val) |
| 1045 | ;; Initialize the package system if it's not. | 1050 | (require 'finder-inf nil t) |
| 1046 | (unless package-alist | 1051 | ;; Load the package list if necessary (but don't activate them). |
| 1047 | (package-initialize)) | 1052 | (unless package--initialized |
| 1053 | (package-initialize t)) | ||
| 1048 | (setq packages (append (mapcar 'car package-alist) | 1054 | (setq packages (append (mapcar 'car package-alist) |
| 1049 | (mapcar 'car package-archive-contents))) | 1055 | (mapcar 'car package-archive-contents) |
| 1056 | (mapcar 'car package--builtins))) | ||
| 1050 | (unless (memq guess packages) | 1057 | (unless (memq guess packages) |
| 1051 | (setq guess nil)) | 1058 | (setq guess nil)) |
| 1052 | (setq packages (mapcar 'symbol-name packages)) | 1059 | (setq packages (mapcar 'symbol-name packages)) |
| @@ -1057,8 +1064,8 @@ The variable `package-load-list' controls which packages to load." | |||
| 1057 | "Describe package: ") | 1064 | "Describe package: ") |
| 1058 | packages nil t nil nil guess)) | 1065 | packages nil t nil nil guess)) |
| 1059 | (list (if (equal val "") guess (intern val))))) | 1066 | (list (if (equal val "") guess (intern val))))) |
| 1060 | (if (or (null package) (null (symbolp package))) | 1067 | (if (or (null package) (not (symbolp package))) |
| 1061 | (message "You did not specify a package") | 1068 | (message "No package specified") |
| 1062 | (help-setup-xref (list #'describe-package package) | 1069 | (help-setup-xref (list #'describe-package package) |
| 1063 | (called-interactively-p 'interactive)) | 1070 | (called-interactively-p 'interactive)) |
| 1064 | (with-help-window (help-buffer) | 1071 | (with-help-window (help-buffer) |
| @@ -1072,22 +1079,27 @@ The variable `package-load-list' controls which packages to load." | |||
| 1072 | desc pkg-dir reqs version installable) | 1079 | desc pkg-dir reqs version installable) |
| 1073 | (prin1 package) | 1080 | (prin1 package) |
| 1074 | (princ " is ") | 1081 | (princ " is ") |
| 1075 | (if (setq desc (cdr (assq package package-alist))) | 1082 | (cond |
| 1076 | ;; This package is loaded (i.e. in `package-alist'). | 1083 | ;; Loaded packages are in `package-alist'. |
| 1077 | (progn | 1084 | ((setq desc (cdr (assq package package-alist))) |
| 1078 | (setq version (package-version-join (package-desc-vers desc))) | 1085 | (setq version (package-version-join (package-desc-vers desc))) |
| 1079 | (cond ((setq pkg-dir (package--dir package-name version)) | 1086 | (if (setq pkg-dir (package--dir package-name version)) |
| 1080 | (insert "an installed package.\n\n")) | 1087 | (insert "an installed package.\n\n") |
| 1081 | (built-in | 1088 | ;; This normally does not happen. |
| 1082 | (princ "a built-in package.\n\n")) | 1089 | (insert "a deleted package.\n\n"))) |
| 1083 | (t ;; This normally does not happen. | 1090 | ;; Available packages are in `package-archive-contents'. |
| 1084 | (insert "a deleted package.\n\n") | 1091 | ((setq desc (cdr (assq package package-archive-contents))) |
| 1085 | (setq version nil)))) | 1092 | (setq version (package-version-join (package-desc-vers desc)) |
| 1086 | ;; This package is not installed. | ||
| 1087 | (setq desc (cdr (assq package package-archive-contents)) | ||
| 1088 | version (package-version-join (package-desc-vers desc)) | ||
| 1089 | installable t) | 1093 | installable t) |
| 1090 | (insert "an uninstalled package.\n\n")) | 1094 | (if built-in |
| 1095 | (insert "a built-in package.\n\n") | ||
| 1096 | (insert "an uninstalled package.\n\n"))) | ||
| 1097 | (built-in | ||
| 1098 | (setq desc (cdr built-in) | ||
| 1099 | version (package-version-join (package-desc-vers desc))) | ||
| 1100 | (insert "a built-in package.\n\n")) | ||
| 1101 | (t | ||
| 1102 | (insert "an orphan package.\n\n"))) | ||
| 1091 | 1103 | ||
| 1092 | (insert " " (propertize "Status" 'font-lock-face 'bold) ": ") | 1104 | (insert " " (propertize "Status" 'font-lock-face 'bold) ": ") |
| 1093 | (cond (pkg-dir | 1105 | (cond (pkg-dir |
| @@ -1097,32 +1109,35 @@ The variable `package-load-list' controls which packages to load." | |||
| 1097 | ;; Todo: Add button for uninstalling. | 1109 | ;; Todo: Add button for uninstalling. |
| 1098 | (help-insert-xref-button (file-name-as-directory pkg-dir) | 1110 | (help-insert-xref-button (file-name-as-directory pkg-dir) |
| 1099 | 'help-package-def pkg-dir) | 1111 | 'help-package-def pkg-dir) |
| 1100 | (insert "'.")) | 1112 | (if built-in |
| 1113 | (insert "',\n shadowing a " | ||
| 1114 | (propertize "built-in package" | ||
| 1115 | 'font-lock-face 'font-lock-builtin-face) | ||
| 1116 | ".") | ||
| 1117 | (insert "'."))) | ||
| 1101 | (installable | 1118 | (installable |
| 1102 | (insert "Available -- ") | 1119 | (if built-in |
| 1103 | (let ((button-text (if (display-graphic-p) | 1120 | (insert (propertize "Built-in." 'font-lock-face 'font-lock-builtin-face) |
| 1104 | "Install" | 1121 | " Alternate version available -- ") |
| 1105 | "[Install]")) | 1122 | (insert "Available -- ")) |
| 1123 | (let ((button-text (if (display-graphic-p) "Install" "[Install]")) | ||
| 1106 | (button-face (if (display-graphic-p) | 1124 | (button-face (if (display-graphic-p) |
| 1107 | '(:box (:line-width 2 :color "dark grey") | 1125 | '(:box (:line-width 2 :color "dark grey") |
| 1108 | :background "light grey" | 1126 | :background "light grey" |
| 1109 | :foreground "black") | 1127 | :foreground "black") |
| 1110 | 'link))) | 1128 | 'link))) |
| 1111 | (insert-text-button button-text | 1129 | (insert-text-button button-text 'face button-face 'follow-link t |
| 1112 | 'face button-face | ||
| 1113 | 'follow-link t | ||
| 1114 | 'package-symbol package | 1130 | 'package-symbol package |
| 1115 | 'action 'package-install-button-action))) | 1131 | 'action 'package-install-button-action))) |
| 1116 | (built-in | 1132 | (built-in |
| 1117 | (insert (propertize "Built-in" | 1133 | (insert (propertize "Built-in." 'font-lock-face 'font-lock-builtin-face))) |
| 1118 | 'font-lock-face 'font-lock-builtin-face) ".")) | ||
| 1119 | (t (insert "Deleted."))) | 1134 | (t (insert "Deleted."))) |
| 1120 | (insert "\n") | 1135 | (insert "\n") |
| 1121 | (and version | 1136 | (and version (> (length version) 0) |
| 1122 | (> (length version) 0) | ||
| 1123 | (insert " " | 1137 | (insert " " |
| 1124 | (propertize "Version" 'font-lock-face 'bold) ": " version "\n")) | 1138 | (propertize "Version" 'font-lock-face 'bold) ": " version "\n")) |
| 1125 | (setq reqs (package-desc-reqs desc)) | 1139 | |
| 1140 | (setq reqs (if desc (package-desc-reqs desc))) | ||
| 1126 | (when reqs | 1141 | (when reqs |
| 1127 | (insert " " (propertize "Requires" 'font-lock-face 'bold) ": ") | 1142 | (insert " " (propertize "Requires" 'font-lock-face 'bold) ": ") |
| 1128 | (let ((first t) | 1143 | (let ((first t) |
| @@ -1140,9 +1155,9 @@ The variable `package-load-list' controls which packages to load." | |||
| 1140 | (help-insert-xref-button text 'help-package name)) | 1155 | (help-insert-xref-button text 'help-package name)) |
| 1141 | (insert "\n"))) | 1156 | (insert "\n"))) |
| 1142 | (insert " " (propertize "Summary" 'font-lock-face 'bold) | 1157 | (insert " " (propertize "Summary" 'font-lock-face 'bold) |
| 1143 | ": " (package-desc-doc desc) "\n\n") | 1158 | ": " (if desc (package-desc-doc desc)) "\n\n") |
| 1144 | 1159 | ||
| 1145 | (if (assq package package--builtins) | 1160 | (if built-in |
| 1146 | ;; For built-in packages, insert the commentary. | 1161 | ;; For built-in packages, insert the commentary. |
| 1147 | (let ((fn (locate-file (concat package-name ".el") load-path | 1162 | (let ((fn (locate-file (concat package-name ".el") load-path |
| 1148 | load-file-rep-suffixes)) | 1163 | load-file-rep-suffixes)) |
| @@ -1477,31 +1492,36 @@ A value of nil means to display all packages.") | |||
| 1477 | 1492 | ||
| 1478 | (defun package--generate-package-list () | 1493 | (defun package--generate-package-list () |
| 1479 | "Populate the current Package Menu buffer." | 1494 | "Populate the current Package Menu buffer." |
| 1480 | (package-initialize) | ||
| 1481 | (let ((inhibit-read-only t) | 1495 | (let ((inhibit-read-only t) |
| 1482 | info-list name desc hold builtin) | 1496 | info-list name desc hold builtin) |
| 1483 | (erase-buffer) | 1497 | (erase-buffer) |
| 1484 | ;; List installed packages | 1498 | ;; List installed packages |
| 1485 | (dolist (elt package-alist) | 1499 | (dolist (elt package-alist) |
| 1486 | (setq name (car elt)) | 1500 | (setq name (car elt)) |
| 1487 | (when (and (not (eq name 'emacs)) ; Hide the `emacs' package. | 1501 | (when (or (null package-menu-package-list) |
| 1488 | (or (null package-menu-package-list) | 1502 | (memq name package-menu-package-list)) |
| 1489 | (memq name package-menu-package-list))) | ||
| 1490 | (setq desc (cdr elt) | 1503 | (setq desc (cdr elt) |
| 1491 | hold (cadr (assq name package-load-list)) | 1504 | hold (cadr (assq name package-load-list))) |
| 1492 | builtin (cdr (assq name package--builtins))) | ||
| 1493 | (setq info-list | 1505 | (setq info-list |
| 1494 | (package-list-maybe-add | 1506 | (package-list-maybe-add |
| 1495 | name (package-desc-vers desc) | 1507 | name (package-desc-vers desc) |
| 1496 | ;; FIXME: it turns out to be tricky to see if this | 1508 | ;; FIXME: it turns out to be tricky to see if this |
| 1497 | ;; package is presently activated. | 1509 | ;; package is presently activated. |
| 1498 | (cond ((stringp hold) "held") | 1510 | (if (stringp hold) "held" "installed") |
| 1499 | ((and builtin | 1511 | (package-desc-doc desc) |
| 1500 | (version-list-= | 1512 | info-list)))) |
| 1501 | (package-desc-vers builtin) | 1513 | |
| 1502 | (package-desc-vers desc))) | 1514 | ;; List built-in packages |
| 1503 | "built-in") | 1515 | (dolist (elt package--builtins) |
| 1504 | (t "installed")) | 1516 | (setq name (car elt)) |
| 1517 | (when (and (not (eq name 'emacs)) ; Hide the `emacs' package. | ||
| 1518 | (or (null package-menu-package-list) | ||
| 1519 | (memq name package-menu-package-list))) | ||
| 1520 | (setq desc (cdr elt)) | ||
| 1521 | (setq info-list | ||
| 1522 | (package-list-maybe-add | ||
| 1523 | name (package-desc-vers desc) | ||
| 1524 | "built-in" | ||
| 1505 | (package-desc-doc desc) | 1525 | (package-desc-doc desc) |
| 1506 | info-list)))) | 1526 | info-list)))) |
| 1507 | 1527 | ||
| @@ -1607,6 +1627,7 @@ A value of nil means to display all packages.") | |||
| 1607 | "Generate and pop to the *Packages* buffer. | 1627 | "Generate and pop to the *Packages* buffer. |
| 1608 | Optional PACKAGES is a list of names of packages (symbols) to | 1628 | Optional PACKAGES is a list of names of packages (symbols) to |
| 1609 | list; the default is to display everything in `package-alist'." | 1629 | list; the default is to display everything in `package-alist'." |
| 1630 | (require 'finder-inf nil t) | ||
| 1610 | (with-current-buffer (get-buffer-create "*Packages*") | 1631 | (with-current-buffer (get-buffer-create "*Packages*") |
| 1611 | (package-menu-mode) | 1632 | (package-menu-mode) |
| 1612 | (set (make-local-variable 'package-menu-package-list) packages) | 1633 | (set (make-local-variable 'package-menu-package-list) packages) |
| @@ -1624,8 +1645,8 @@ Fetches the updated list of packages before displaying. | |||
| 1624 | The list is displayed in a buffer named `*Packages*'." | 1645 | The list is displayed in a buffer named `*Packages*'." |
| 1625 | (interactive) | 1646 | (interactive) |
| 1626 | ;; Initialize the package system if necessary. | 1647 | ;; Initialize the package system if necessary. |
| 1627 | (unless package-alist | 1648 | (unless package--initialized |
| 1628 | (package-initialize)) | 1649 | (package-initialize t)) |
| 1629 | (package-refresh-contents) | 1650 | (package-refresh-contents) |
| 1630 | (package--list-packages)) | 1651 | (package--list-packages)) |
| 1631 | 1652 | ||