aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChong Yidong2010-11-02 23:25:36 -0400
committerChong Yidong2010-11-02 23:25:36 -0400
commit4b99edf23f0abae8cde95ff2cfa3658f7e038f70 (patch)
tree7b0f066ac6aadd455a260b2123437242b75411f7
parent73ab9865e6c50586fcfced729824b3aabd03bbae (diff)
downloademacs-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/ChangeLog24
-rw-r--r--lisp/emacs-lisp/package.el283
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 @@
12010-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
12010-11-03 Stefan Monnier <monnier@iro.umontreal.ca> 252010-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.
333Here, PACKAGE is a string of the form NAME-VER, where NAME is the
334package 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.
436If PACKAGE has any dependencies, recursively activate them.
430Return nil if the package could not be activated." 437Return 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 460Required 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.
477NAME is the name of the package, a string. 483NAME-STRING is the name of the package, as a string.
478VERSION-STRING is the version of the package, a dotted sequence 484VERSION-STRING is the version of the package, as a list of
479of integers. 485integers of the form produced by `version-to-list'.
480DOCSTRING is the optional description. 486DOCSTRING is a short description of the package, a string.
481REQUIREMENTS is a list of requirements on other packages. 487REQUIREMENTS is a list of dependencies on other packages.
482Each requirement is of the form (OTHER-PACKAGE \"VERSION\"). 488Each requirement is of the form (OTHER-PACKAGE \"VERSION\").
483 489
484EXTRA-PROPERTIES is currently unused." 490EXTRA-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.
664Built-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.
1020The variable `package-load-list' controls which packages to load." 1030The variable `package-load-list' controls which packages to load.
1031If 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.
1608Optional PACKAGES is a list of names of packages (symbols) to 1628Optional PACKAGES is a list of names of packages (symbols) to
1609list; the default is to display everything in `package-alist'." 1629list; 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.
1624The list is displayed in a buffer named `*Packages*'." 1645The 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