aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etc/NEWS8
-rw-r--r--lisp/ChangeLog14
-rw-r--r--lisp/emacs-lisp/package.el177
-rw-r--r--lisp/help.el1
-rw-r--r--lisp/menu-bar.el9
5 files changed, 124 insertions, 85 deletions
diff --git a/etc/NEWS b/etc/NEWS
index ca03f89bc39..16525c378e7 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -176,8 +176,12 @@ for `list-colors-display'.
176 176
177** An Emacs Lisp package manager is now included. 177** An Emacs Lisp package manager is now included.
178This is a convenient way to download and install additional packages, 178This is a convenient way to download and install additional packages,
179from elpa.gnu.org. `M-x package-list-packages' shows a list of 179from elpa.gnu.org.
180packages, which can be selected for installation. 180
181*** `M-x list-packages' shows a list of packages, which can be
182selected for installation.
183
184*** New command `describe-package', bound to `C-h P'.
181 185
182*** By default, all installed packages are loaded and activated 186*** By default, all installed packages are loaded and activated
183automatically when Emacs starts up. To disable this, set 187automatically when Emacs starts up. To disable this, set
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 83d93e9b5ef..28bc8123501 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,17 @@
12010-08-26 Chong Yidong <cyd@stupidchicken.com>
2
3 * help.el (help-map): Bind `C-h P' to describe-package.
4
5 * menu-bar.el (menu-bar-describe-menu): Add describe-package.
6
7 * emacs-lisp/package.el (package-refresh-contents): Catch errors
8 when downloading archives.
9 (describe-package-1): Add package commentary.
10 (package-install-button-action): New function.
11 (package-menu-mode-map): Bind ? to package-menu-describe-package.
12 (package-menu-view-commentary): Function removed.
13 (package-list-packages-internal): Hide the `package' package too.
14
12010-08-25 Kenichi Handa <handa@m17n.org> 152010-08-25 Kenichi Handa <handa@m17n.org>
2 16
3 * language/misc-lang.el ("Arabic"): New language environment. 17 * language/misc-lang.el ("Arabic"): New language environment.
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 634a05df15e..7042566724c 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -216,6 +216,7 @@ If VERSION is nil, the package is not loaded (it is \"disabled\")."
216(declare-function lm-header "lisp-mnt" (header)) 216(declare-function lm-header "lisp-mnt" (header))
217(declare-function lm-commentary "lisp-mnt" (&optional file)) 217(declare-function lm-commentary "lisp-mnt" (&optional file))
218(declare-function dired-delete-file "dired" (file &optional recursive trash)) 218(declare-function dired-delete-file "dired" (file &optional recursive trash))
219(defvar url-http-end-of-headers)
219 220
220(defcustom package-archives '(("gnu" . "http://elpa.gnu.org/packages/")) 221(defcustom package-archives '(("gnu" . "http://elpa.gnu.org/packages/"))
221 "An alist of archives from which to fetch. 222 "An alist of archives from which to fetch.
@@ -1016,7 +1017,10 @@ download."
1016 (unless (file-exists-p package-user-dir) 1017 (unless (file-exists-p package-user-dir)
1017 (make-directory package-user-dir t)) 1018 (make-directory package-user-dir t))
1018 (dolist (archive package-archives) 1019 (dolist (archive package-archives)
1019 (package--download-one-archive archive "archive-contents")) 1020 (condition-case nil
1021 (package--download-one-archive archive "archive-contents")
1022 (error (message "Failed to download archive `%s'."
1023 (car archive)))))
1020 (package-read-all-archive-contents)) 1024 (package-read-all-archive-contents))
1021 1025
1022;;;###autoload 1026;;;###autoload
@@ -1052,9 +1056,7 @@ The variable `package-load-list' controls which packages to load."
1052 guess) 1056 guess)
1053 "Describe package: ") 1057 "Describe package: ")
1054 packages nil t nil nil guess)) 1058 packages nil t nil nil guess))
1055 (list (if (equal val "") 1059 (list (if (equal val "") guess (intern val)))))
1056 guess
1057 (intern val)))))
1058 (if (or (null package) (null (symbolp package))) 1060 (if (or (null package) (null (symbolp package)))
1059 (message "You did not specify a package") 1061 (message "You did not specify a package")
1060 (help-setup-xref (list #'describe-package package) 1062 (help-setup-xref (list #'describe-package package)
@@ -1064,38 +1066,60 @@ The variable `package-load-list' controls which packages to load."
1064 (describe-package-1 package))))) 1066 (describe-package-1 package)))))
1065 1067
1066(defun describe-package-1 (package) 1068(defun describe-package-1 (package)
1067 (let ((desc (cdr (assq package package-alist))) 1069 (let ((package-name (symbol-name package))
1068 reqs version installable) 1070 (built-in (assq package package--builtins))
1071 desc pkg-dir reqs version installable)
1069 (prin1 package) 1072 (prin1 package)
1070 (princ " is ") 1073 (princ " is ")
1071 (cond 1074 (if (setq desc (cdr (assq package package-alist)))
1072 (desc 1075 ;; This package is loaded (i.e. in `package-alist').
1073 ;; This package is loaded (i.e. in `package-alist'). 1076 (progn
1074 (let (pkg-dir) 1077 (setq version (package-version-join (package-desc-vers desc)))
1075 (setq version (package-version-join (package-desc-vers desc))) 1078 (cond (built-in
1076 (if (assq package package--builtins) 1079 (princ "a built-in package.\n\n"))
1077 (princ "a built-in package.\n\n") 1080 ((setq pkg-dir (package--dir package-name version))
1078 (setq pkg-dir (package--dir (symbol-name package) version)) 1081 (insert "an installed package.\n\n"))
1079 (if pkg-dir 1082 (t ;; This normally does not happen.
1080 (progn 1083 (insert "a deleted package.\n\n")
1081 (insert "a package installed in `") 1084 (setq version nil))))
1082 (help-insert-xref-button (file-name-as-directory pkg-dir) 1085 ;; This package is not installed.
1083 'help-package-def pkg-dir) 1086 (setq desc (cdr (assq package package-archive-contents))
1084 (insert "'.\n\n"))
1085 ;; This normally does not happen.
1086 (insert "a deleted package.\n\n")
1087 (setq version nil)))))
1088 (t
1089 ;; An uninstalled package.
1090 (setq desc (cdr (assq package package-archive-contents))
1091 version (package-version-join (package-desc-vers desc)) 1087 version (package-version-join (package-desc-vers desc))
1092 installable t) 1088 installable t)
1093 (insert "an installable package.\n\n"))) 1089 (insert "an uninstalled package.\n\n"))
1094 (if version 1090
1095 (insert " Version: " version "\n")) 1091 (insert " " (propertize "Status" 'face 'bold) ": ")
1092 (cond (pkg-dir
1093 (insert (propertize "Installed" 'face 'font-lock-comment-face))
1094 (insert " in `")
1095 ;; Todo: Add button for uninstalling.
1096 (help-insert-xref-button (file-name-as-directory pkg-dir)
1097 'help-package-def pkg-dir)
1098 (insert "'."))
1099 (installable
1100 (insert "Available -- ")
1101 (let ((button-text (if (display-graphic-p)
1102 "Install"
1103 "[Install]"))
1104 (button-face (if (display-graphic-p)
1105 '(:box (:line-width 2 :color "dark grey")
1106 :background "light grey"
1107 :foreground "black")
1108 'link)))
1109 (insert-text-button button-text
1110 'face button-face
1111 'follow-link t
1112 'package-symbol package
1113 'action 'package-install-button-action)))
1114 (built-in
1115 (insert (propertize "Built-in" 'face 'font-lock-builtin-face) "."))
1116 (t (insert "Deleted.")))
1117 (insert "\n")
1118 (when version
1119 (insert " " (propertize "Version" 'face 'bold) ": " version "\n"))
1096 (setq reqs (package-desc-reqs desc)) 1120 (setq reqs (package-desc-reqs desc))
1097 (when reqs 1121 (when reqs
1098 (insert " Requires: ") 1122 (insert " " (propertize "Requires" 'face 'bold) ": ")
1099 (let ((first t) 1123 (let ((first t)
1100 name vers text) 1124 name vers text)
1101 (dolist (req reqs) 1125 (dolist (req reqs)
@@ -1110,28 +1134,45 @@ The variable `package-load-list' controls which packages to load."
1110 (t (insert ", "))) 1134 (t (insert ", ")))
1111 (help-insert-xref-button text 'help-package name)) 1135 (help-insert-xref-button text 'help-package name))
1112 (insert "\n"))) 1136 (insert "\n")))
1113 (insert " Description: " (package-desc-doc desc) "\n") 1137 (insert " " (propertize "Summary" 'face 'bold)
1114 ;; Todo: button for uninstalling a package. 1138 ": " (package-desc-doc desc) "\n\n")
1115 (when installable 1139
1116 (let ((button-text (if (display-graphic-p) 1140 ;; Insert the package commentary.
1117 "Install" 1141 ;; FIXME: We should try to be smarter about when to download.
1118 "[Install]")) 1142 (let ((readme (expand-file-name (concat package-name "-readme.txt")
1119 (button-face (if (display-graphic-p) 1143 package-user-dir)))
1120 '(:box (:line-width 2 :color "dark grey") 1144 ;; Try downloading the commentary. If that fails, try an
1121 :background "light grey" 1145 ;; existing readme file in `package-user-dir'.
1122 :foreground "black") 1146 (cond ((let ((buffer
1123 'link))) 1147 (condition-case nil
1124 (insert "\n") 1148 (url-retrieve-synchronously
1125 (insert-text-button button-text 1149 (concat (package-archive-url package)
1126 'face button-face 1150 package-name "-readme.txt"))
1127 'follow-link t 1151 (error nil)))
1128 'package-symbol package 1152 response)
1129 'action (lambda (button) 1153 (when buffer
1130 (package-install 1154 (with-current-buffer buffer
1131 (button-get button 'package-symbol)) 1155 (setq response (url-http-parse-response))
1132 (revert-buffer nil t) 1156 (if (or (< response 200) (>= response 300))
1133 (goto-char (point-min)))) 1157 (setq response nil)
1134 (insert "\n"))))) 1158 (setq buffer-file-name
1159 (expand-file-name readme package-user-dir))
1160 (delete-region (point-min) (1+ url-http-end-of-headers))
1161 (save-buffer)))
1162 (when response
1163 (insert-buffer-substring buffer)
1164 (kill-buffer buffer)
1165 t))))
1166 ((file-readable-p readme)
1167 (insert-file-contents readme)
1168 (goto-char (point-max)))))))
1169
1170(defun package-install-button-action (button)
1171 (let ((package (button-get button 'package-symbol)))
1172 (when (y-or-n-p (format "Install package `%s'? " package))
1173 (package-install package)
1174 (revert-buffer nil t)
1175 (goto-char (point-min)))))
1135 1176
1136 1177
1137;;;; Package menu mode. 1178;;;; Package menu mode.
@@ -1153,7 +1194,7 @@ The variable `package-load-list' controls which packages to load."
1153 (define-key map "~" 'package-menu-mark-obsolete-for-deletion) 1194 (define-key map "~" 'package-menu-mark-obsolete-for-deletion)
1154 (define-key map "x" 'package-menu-execute) 1195 (define-key map "x" 'package-menu-execute)
1155 (define-key map "h" 'package-menu-quick-help) 1196 (define-key map "h" 'package-menu-quick-help)
1156 (define-key map "?" 'package-menu-view-commentary) 1197 (define-key map "?" 'package-menu-describe-package)
1157 (define-key map [menu-bar package-menu] (cons "Package" menu-map)) 1198 (define-key map [menu-bar package-menu] (cons "Package" menu-map))
1158 (define-key menu-map [mq] 1199 (define-key menu-map [mq]
1159 '(menu-item "Quit" quit-window 1200 '(menu-item "Quit" quit-window
@@ -1297,32 +1338,8 @@ available for download."
1297 (interactive) 1338 (interactive)
1298 (message "n-ext, i-nstall, d-elete, u-nmark, x-ecute, r-efresh, h-elp")) 1339 (message "n-ext, i-nstall, d-elete, u-nmark, x-ecute, r-efresh, h-elp"))
1299 1340
1300(defun package-menu-view-commentary () 1341(define-obsolete-function-alias
1301 "Display information about this package. 1342 'package-menu-view-commentary 'package-menu-describe-package "24.1")
1302For single-file packages, shows the commentary section from the header.
1303For larger packages, shows the README file."
1304 (interactive)
1305 (let* ((pkg-name (package-menu-get-package))
1306 (buffer (url-retrieve-synchronously
1307 (concat (package-archive-url pkg-name)
1308 pkg-name
1309 "-readme.txt")))
1310 start-point ok)
1311 (with-current-buffer buffer
1312 ;; FIXME: it would be nice to work with any URL type.
1313 (setq start-point url-http-end-of-headers)
1314 (setq ok (eq (url-http-parse-response) 200)))
1315 (let ((new-buffer (get-buffer-create "*Package Info*")))
1316 (with-current-buffer new-buffer
1317 (let ((buffer-read-only nil))
1318 (erase-buffer)
1319 (insert "Package information for " pkg-name "\n\n")
1320 (if ok
1321 (insert-buffer-substring buffer start-point)
1322 (insert "This package lacks a README file or commentary.\n"))
1323 (goto-char (point-min))
1324 (view-mode)))
1325 (display-buffer new-buffer t))))
1326 1343
1327;; Return the name of the package on the current line. 1344;; Return the name of the package on the current line.
1328(defun package-menu-get-package () 1345(defun package-menu-get-package ()
@@ -1426,7 +1443,7 @@ Emacs."
1426 (setq name (car elt) 1443 (setq name (car elt)
1427 desc (cdr elt) 1444 desc (cdr elt)
1428 hold (assq name package-load-list)) 1445 hold (assq name package-load-list))
1429 (unless (eq name 'emacs) 1446 (unless (memq name '(emacs package))
1430 (setq info-list 1447 (setq info-list
1431 (package-list-maybe-add 1448 (package-list-maybe-add
1432 name (package-desc-vers desc) 1449 name (package-desc-vers desc)
diff --git a/lisp/help.el b/lisp/help.el
index 9434201797e..1cba4088a19 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -103,6 +103,7 @@
103 (define-key map "m" 'describe-mode) 103 (define-key map "m" 'describe-mode)
104 (define-key map "n" 'view-emacs-news) 104 (define-key map "n" 'view-emacs-news)
105 (define-key map "p" 'finder-by-keyword) 105 (define-key map "p" 'finder-by-keyword)
106 (define-key map "P" 'describe-package)
106 (define-key map "r" 'info-emacs-manual) 107 (define-key map "r" 'info-emacs-manual)
107 (define-key map "s" 'describe-syntax) 108 (define-key map "s" 'describe-syntax)
108 (define-key map "t" 'help-with-tutorial) 109 (define-key map "t" 'help-with-tutorial)
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index 98cb061cccb..2975fd1efe6 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -1485,6 +1485,9 @@ mail status in mode line"))
1485(define-key menu-bar-describe-menu [describe-current-display-table] 1485(define-key menu-bar-describe-menu [describe-current-display-table]
1486 `(menu-item ,(purecopy "Describe Display Table") describe-current-display-table 1486 `(menu-item ,(purecopy "Describe Display Table") describe-current-display-table
1487 :help ,(purecopy "Describe the current display table"))) 1487 :help ,(purecopy "Describe the current display table")))
1488(define-key menu-bar-describe-menu [describe-package]
1489 `(menu-item ,(purecopy "Describe Package...") describe-package
1490 :help ,(purecopy "Display documentation of a Lisp package")))
1488(define-key menu-bar-describe-menu [describe-face] 1491(define-key menu-bar-describe-menu [describe-face]
1489 `(menu-item ,(purecopy "Describe Face...") describe-face 1492 `(menu-item ,(purecopy "Describe Face...") describe-face
1490 :help ,(purecopy "Display the properties of a face"))) 1493 :help ,(purecopy "Display the properties of a face")))
@@ -1616,11 +1619,11 @@ key, a click, or a menu-item")))
1616(define-key menu-bar-help-menu [sep2] 1619(define-key menu-bar-help-menu [sep2]
1617 menu-bar-separator) 1620 menu-bar-separator)
1618(define-key menu-bar-help-menu [external-packages] 1621(define-key menu-bar-help-menu [external-packages]
1619 `(menu-item ,(purecopy "External Packages") menu-bar-help-extra-packages 1622 `(menu-item ,(purecopy "Finding Extra Packages") menu-bar-help-extra-packages
1620 :help ,(purecopy "Lisp packages distributed separately for use in Emacs"))) 1623 :help ,(purecopy "Lisp packages distributed separately for use in Emacs")))
1621(define-key menu-bar-help-menu [find-emacs-packages] 1624(define-key menu-bar-help-menu [find-emacs-packages]
1622 `(menu-item ,(purecopy "Find Emacs Packages") finder-by-keyword 1625 `(menu-item ,(purecopy "Search Built-in Packages") finder-by-keyword
1623 :help ,(purecopy "Find packages and features by keyword"))) 1626 :help ,(purecopy "Find built-in packages and features by keyword")))
1624(define-key menu-bar-help-menu [more-manuals] 1627(define-key menu-bar-help-menu [more-manuals]
1625 `(menu-item ,(purecopy "More Manuals") ,menu-bar-manuals-menu)) 1628 `(menu-item ,(purecopy "More Manuals") ,menu-bar-manuals-menu))
1626(define-key menu-bar-help-menu [emacs-manual] 1629(define-key menu-bar-help-menu [emacs-manual]