aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorStephen Leake2018-12-13 14:45:05 -0800
committerStephen Leake2018-12-13 14:45:05 -0800
commitd4fb2690702fbd348977fc94a9f7a99c00cc3010 (patch)
treea55fa60e7401455bb75c91c21b2f7540dd5488f4 /lisp
parent87bef630bf0f45e8da74e43ba614aa2292b296ef (diff)
downloademacs-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.el85
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.
2241The 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)))