diff options
| author | Stephen Leake | 2018-12-13 14:45:05 -0800 |
|---|---|---|
| committer | Stephen Leake | 2018-12-13 14:45:05 -0800 |
| commit | d4fb2690702fbd348977fc94a9f7a99c00cc3010 (patch) | |
| tree | a55fa60e7401455bb75c91c21b2f7540dd5488f4 /lisp | |
| parent | 87bef630bf0f45e8da74e43ba614aa2292b296ef (diff) | |
| download | emacs-d4fb2690702fbd348977fc94a9f7a99c00cc3010.tar.gz emacs-d4fb2690702fbd348977fc94a9f7a99c00cc3010.zip | |
Get long package description for installed packages from installed files
* doc/lispref/package.texi (Archive Web Server): New; document web
server interface.
* lisp/emacs-lisp/package.el (package--get-description): New; get long
description from installed files.
(describe-package-1): Use it, improve comments. No longer writing
NAME-readme.txt.
* test/lisp/emacs-lisp/package-tests.el:
(package-test-describe-package): There is now a description for an
installed package.
(package-test-describe-installed-multi-file-package): New test.
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/emacs-lisp/package.el | 85 |
1 files changed, 63 insertions, 22 deletions
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index dcede1a5b27..1752c7e9fe0 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el | |||
| @@ -2123,6 +2123,9 @@ If NOSAVE is non-nil, the package is not removed from | |||
| 2123 | (add-hook 'post-command-hook #'package-menu--post-refresh) | 2123 | (add-hook 'post-command-hook #'package-menu--post-refresh) |
| 2124 | (delete-directory dir t) | 2124 | (delete-directory dir t) |
| 2125 | ;; Remove NAME-VERSION.signed and NAME-readme.txt files. | 2125 | ;; Remove NAME-VERSION.signed and NAME-readme.txt files. |
| 2126 | ;; | ||
| 2127 | ;; NAME-readme.txt files are no longer created, but they | ||
| 2128 | ;; may be left around from an earlier install. | ||
| 2126 | (dolist (suffix '(".signed" "readme.txt")) | 2129 | (dolist (suffix '(".signed" "readme.txt")) |
| 2127 | (let* ((version (package-version-join (package-desc-version pkg-desc))) | 2130 | (let* ((version (package-version-join (package-desc-version pkg-desc))) |
| 2128 | (file (concat (if (string= suffix ".signed") | 2131 | (file (concat (if (string= suffix ".signed") |
| @@ -2233,6 +2236,45 @@ Otherwise no newline is inserted." | |||
| 2233 | 2236 | ||
| 2234 | (declare-function lm-commentary "lisp-mnt" (&optional file)) | 2237 | (declare-function lm-commentary "lisp-mnt" (&optional file)) |
| 2235 | 2238 | ||
| 2239 | (defun package--get-description (desc) | ||
| 2240 | "Return a string containing the long description of the package DESC. | ||
| 2241 | The description is read from the installed package files." | ||
| 2242 | ;; Installed packages have nil for kind, so we look for README | ||
| 2243 | ;; first, then fall back to the Commentary header. | ||
| 2244 | |||
| 2245 | ;; We don’t include README.md here, because that is often the home | ||
| 2246 | ;; page on a site like github, and not suitable as the package long | ||
| 2247 | ;; description. | ||
| 2248 | (let ((files '("README-elpa" "README-elpa.md" "README" "README.rst" "README.org")) | ||
| 2249 | file | ||
| 2250 | (srcdir (package-desc-dir desc)) | ||
| 2251 | result) | ||
| 2252 | (while (and files | ||
| 2253 | (not result)) | ||
| 2254 | (setq file (pop files)) | ||
| 2255 | (when (file-readable-p (expand-file-name file srcdir)) | ||
| 2256 | ;; Found a README. | ||
| 2257 | (with-temp-buffer | ||
| 2258 | (insert-file-contents (expand-file-name file srcdir)) | ||
| 2259 | (setq result (buffer-string))))) | ||
| 2260 | |||
| 2261 | (or | ||
| 2262 | result | ||
| 2263 | |||
| 2264 | ;; Look for Commentary header. | ||
| 2265 | (let ((mainsrcfile (expand-file-name (format "%s.el" (package-desc-name desc)) | ||
| 2266 | srcdir))) | ||
| 2267 | (when (file-readable-p mainsrcfile) | ||
| 2268 | (with-temp-buffer | ||
| 2269 | (insert (or (lm-commentary mainsrcfile) "")) | ||
| 2270 | (goto-char (point-min)) | ||
| 2271 | (when (re-search-forward "^;;; Commentary:\n" nil t) | ||
| 2272 | (replace-match "")) | ||
| 2273 | (while (re-search-forward "^\\(;+ ?\\)" nil t) | ||
| 2274 | (replace-match "")) | ||
| 2275 | (buffer-string)))) | ||
| 2276 | ))) | ||
| 2277 | |||
| 2236 | (defun describe-package-1 (pkg) | 2278 | (defun describe-package-1 (pkg) |
| 2237 | (require 'lisp-mnt) | 2279 | (require 'lisp-mnt) |
| 2238 | (let* ((desc (or | 2280 | (let* ((desc (or |
| @@ -2406,7 +2448,8 @@ Otherwise no newline is inserted." | |||
| 2406 | (insert "\n") | 2448 | (insert "\n") |
| 2407 | 2449 | ||
| 2408 | (if built-in | 2450 | (if built-in |
| 2409 | ;; For built-in packages, insert the commentary. | 2451 | ;; For built-in packages, get the description from the |
| 2452 | ;; Commentary header. | ||
| 2410 | (let ((fn (locate-file (format "%s.el" name) load-path | 2453 | (let ((fn (locate-file (format "%s.el" name) load-path |
| 2411 | load-file-rep-suffixes)) | 2454 | load-file-rep-suffixes)) |
| 2412 | (opoint (point))) | 2455 | (opoint (point))) |
| @@ -2417,27 +2460,25 @@ Otherwise no newline is inserted." | |||
| 2417 | (replace-match "")) | 2460 | (replace-match "")) |
| 2418 | (while (re-search-forward "^\\(;+ ?\\)" nil t) | 2461 | (while (re-search-forward "^\\(;+ ?\\)" nil t) |
| 2419 | (replace-match "")))) | 2462 | (replace-match "")))) |
| 2420 | (let* ((basename (format "%s-readme.txt" name)) | 2463 | |
| 2421 | (readme (expand-file-name basename package-user-dir)) | 2464 | (if (package-installed-p desc) |
| 2422 | readme-string) | 2465 | ;; For installed packages, get the description from the installed files. |
| 2423 | ;; For elpa packages, try downloading the commentary. If that | 2466 | (insert (package--get-description desc)) |
| 2424 | ;; fails, try an existing readme file in `package-user-dir'. | 2467 | |
| 2425 | (cond ((and (package-desc-archive desc) | 2468 | ;; For non-built-in, non-installed packages, get description from the archive. |
| 2426 | (package--with-response-buffer (package-archive-base desc) | 2469 | (let* ((basename (format "%s-readme.txt" name)) |
| 2427 | :file basename :noerror t | 2470 | readme-string) |
| 2428 | (save-excursion | 2471 | |
| 2429 | (goto-char (point-max)) | 2472 | (package--with-response-buffer (package-archive-base desc) |
| 2430 | (unless (bolp) | 2473 | :file basename :noerror t |
| 2431 | (insert ?\n))) | 2474 | (save-excursion |
| 2432 | (write-region nil nil | 2475 | (goto-char (point-max)) |
| 2433 | (expand-file-name readme package-user-dir) | 2476 | (unless (bolp) |
| 2434 | nil 'silent) | 2477 | (insert ?\n))) |
| 2435 | (setq readme-string (buffer-string)) | 2478 | (setq readme-string (buffer-string)) |
| 2436 | t)) | 2479 | t) |
| 2437 | (insert readme-string)) | 2480 | (insert readme-string)) |
| 2438 | ((file-readable-p readme) | 2481 | )))) |
| 2439 | (insert-file-contents readme) | ||
| 2440 | (goto-char (point-max)))))))) | ||
| 2441 | 2482 | ||
| 2442 | (defun package-install-button-action (button) | 2483 | (defun package-install-button-action (button) |
| 2443 | (let ((pkg-desc (button-get button 'package-desc))) | 2484 | (let ((pkg-desc (button-get button 'package-desc))) |