diff options
| author | Stefan Kangas | 2023-12-22 23:41:36 +0100 |
|---|---|---|
| committer | Stefan Kangas | 2023-12-23 01:31:26 +0100 |
| commit | bb5399e3cd75450db6db9b3c5829f7bd87ca1308 (patch) | |
| tree | 35f1539dc7087a74429a96de5999f49a64a2cdd1 | |
| parent | 9cb85e950dac77b59d48d320c7d40689d019aad4 (diff) | |
| download | emacs-bb5399e3cd75450db6db9b3c5829f7bd87ca1308.tar.gz emacs-bb5399e3cd75450db6db9b3c5829f7bd87ca1308.zip | |
Introduce new function lm-package-requires
* lisp/emacs-lisp/package.el (package--prepare-dependencies): Move
from here...
* lisp/emacs-lisp/lisp-mnt.el (lm--prepare-package-dependencies):
...to here.
(lm-package-requires): New function.
(package-buffer-info): Use above new function.
* test/lisp/emacs-lisp/lisp-mnt-tests.el
(lm--tests-lm-package-requires): New test.
| -rw-r--r-- | lisp/emacs-lisp/lisp-mnt.el | 32 | ||||
| -rw-r--r-- | lisp/emacs-lisp/package.el | 25 | ||||
| -rw-r--r-- | test/lisp/emacs-lisp/lisp-mnt-tests.el | 20 |
3 files changed, 54 insertions, 23 deletions
diff --git a/lisp/emacs-lisp/lisp-mnt.el b/lisp/emacs-lisp/lisp-mnt.el index cb7cff43555..2c7c6816e9c 100644 --- a/lisp/emacs-lisp/lisp-mnt.el +++ b/lisp/emacs-lisp/lisp-mnt.el | |||
| @@ -434,6 +434,38 @@ This can be found in an RCS or SCCS header." | |||
| 434 | header-max t) | 434 | header-max t) |
| 435 | (match-string-no-properties 1))))))) | 435 | (match-string-no-properties 1))))))) |
| 436 | 436 | ||
| 437 | (defun lm--prepare-package-dependencies (deps) | ||
| 438 | "Turn DEPS into an acceptable list of dependencies. | ||
| 439 | |||
| 440 | Any parts missing a version string get a default version string | ||
| 441 | of \"0\" (meaning any version) and an appropriate level of lists | ||
| 442 | is wrapped around any parts requiring it." | ||
| 443 | (cond | ||
| 444 | ((not (listp deps)) | ||
| 445 | (error "Invalid requirement specifier: %S" deps)) | ||
| 446 | (t (mapcar (lambda (dep) | ||
| 447 | (cond | ||
| 448 | ((symbolp dep) `(,dep "0")) | ||
| 449 | ((stringp dep) | ||
| 450 | (error "Invalid requirement specifier: %S" dep)) | ||
| 451 | ((and (listp dep) (null (cdr dep))) | ||
| 452 | (list (car dep) "0")) | ||
| 453 | (t dep))) | ||
| 454 | deps)))) | ||
| 455 | |||
| 456 | (declare-function package-read-from-string "package" (str)) | ||
| 457 | |||
| 458 | (defun lm-package-requires (&optional file) | ||
| 459 | "Return dependencies listed in file FILE, or current buffer if FILE is nil. | ||
| 460 | The return value is a list of elements of the form (PACKAGE VERSION) | ||
| 461 | where PACKAGE is the package name (a symbol) and VERSION is the | ||
| 462 | package version (a string)." | ||
| 463 | (require 'package) | ||
| 464 | (lm-with-file file | ||
| 465 | (and-let* ((require-lines (lm-header-multiline "package-requires"))) | ||
| 466 | (lm--prepare-package-dependencies | ||
| 467 | (package-read-from-string (mapconcat #'identity require-lines " ")))))) | ||
| 468 | |||
| 437 | (defun lm-keywords (&optional file) | 469 | (defun lm-keywords (&optional file) |
| 438 | "Return the keywords given in file FILE, or current buffer if FILE is nil. | 470 | "Return the keywords given in file FILE, or current buffer if FILE is nil. |
| 439 | The return is a `downcase'-ed string, or nil if no keywords | 471 | The return is a `downcase'-ed string, or nil if no keywords |
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index bed6e74c921..0e21f57fc3f 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el | |||
| @@ -1149,27 +1149,8 @@ Signal an error if the entire string was not used." | |||
| 1149 | (error "Can't read whole string")) | 1149 | (error "Can't read whole string")) |
| 1150 | (end-of-file expr)))) | 1150 | (end-of-file expr)))) |
| 1151 | 1151 | ||
| 1152 | (defun package--prepare-dependencies (deps) | ||
| 1153 | "Turn DEPS into an acceptable list of dependencies. | ||
| 1154 | |||
| 1155 | Any parts missing a version string get a default version string | ||
| 1156 | of \"0\" (meaning any version) and an appropriate level of lists | ||
| 1157 | is wrapped around any parts requiring it." | ||
| 1158 | (cond | ||
| 1159 | ((not (listp deps)) | ||
| 1160 | (error "Invalid requirement specifier: %S" deps)) | ||
| 1161 | (t (mapcar (lambda (dep) | ||
| 1162 | (cond | ||
| 1163 | ((symbolp dep) `(,dep "0")) | ||
| 1164 | ((stringp dep) | ||
| 1165 | (error "Invalid requirement specifier: %S" dep)) | ||
| 1166 | ((and (listp dep) (null (cdr dep))) | ||
| 1167 | (list (car dep) "0")) | ||
| 1168 | (t dep))) | ||
| 1169 | deps)))) | ||
| 1170 | |||
| 1171 | (declare-function lm-header "lisp-mnt" (header)) | 1152 | (declare-function lm-header "lisp-mnt" (header)) |
| 1172 | (declare-function lm-header-multiline "lisp-mnt" (header)) | 1153 | (declare-function lm-package-requires "lisp-mnt" (header)) |
| 1173 | (declare-function lm-website "lisp-mnt" (&optional file)) | 1154 | (declare-function lm-website "lisp-mnt" (&optional file)) |
| 1174 | (declare-function lm-keywords-list "lisp-mnt" (&optional file)) | 1155 | (declare-function lm-keywords-list "lisp-mnt" (&optional file)) |
| 1175 | (declare-function lm-maintainers "lisp-mnt" (&optional file)) | 1156 | (declare-function lm-maintainers "lisp-mnt" (&optional file)) |
| @@ -1212,9 +1193,7 @@ boundaries." | |||
| 1212 | (error "Package lacks a \"Version\" or \"Package-Version\" header"))) | 1193 | (error "Package lacks a \"Version\" or \"Package-Version\" header"))) |
| 1213 | (package-desc-from-define | 1194 | (package-desc-from-define |
| 1214 | file-name pkg-version desc | 1195 | file-name pkg-version desc |
| 1215 | (and-let* ((require-lines (lm-header-multiline "package-requires"))) | 1196 | (lm-package-requires) |
| 1216 | (package--prepare-dependencies | ||
| 1217 | (package-read-from-string (mapconcat #'identity require-lines " ")))) | ||
| 1218 | :kind 'single | 1197 | :kind 'single |
| 1219 | :url website | 1198 | :url website |
| 1220 | :keywords keywords | 1199 | :keywords keywords |
diff --git a/test/lisp/emacs-lisp/lisp-mnt-tests.el b/test/lisp/emacs-lisp/lisp-mnt-tests.el index c056761f0f9..1418abf221f 100644 --- a/test/lisp/emacs-lisp/lisp-mnt-tests.el +++ b/test/lisp/emacs-lisp/lisp-mnt-tests.el | |||
| @@ -30,6 +30,26 @@ | |||
| 30 | '(("Bob Weiner" . "rsw@gnu.org") | 30 | '(("Bob Weiner" . "rsw@gnu.org") |
| 31 | ("Mats Lidell" . "matsl@gnu.org"))))) | 31 | ("Mats Lidell" . "matsl@gnu.org"))))) |
| 32 | 32 | ||
| 33 | (ert-deftest lm--tests-lm-package-requires () | ||
| 34 | (with-temp-buffer | ||
| 35 | (insert ";; Package-Requires: ((emacs 29.1))") | ||
| 36 | (should (equal (lm-package-requires) '((emacs 29.1))))) | ||
| 37 | (with-temp-buffer | ||
| 38 | (insert ";; Package-Requires: ((emacs \"26.3\") (jsonrpc \"1.0.16\") (flymake \"1.2.1\") (project \"0.9.8\") (xref \"1.6.2\") (eldoc \"1.14.0\") (seq \"2.23\") (external-completion \"0.1\"))") | ||
| 39 | (should (equal (lm-package-requires) | ||
| 40 | '((emacs "26.3") (jsonrpc "1.0.16") (flymake "1.2.1") | ||
| 41 | (project "0.9.8") (xref "1.6.2") (eldoc "1.14.0") | ||
| 42 | (seq "2.23") (external-completion "0.1"))))) | ||
| 43 | (with-temp-buffer | ||
| 44 | (insert ";; Package-Requires: ((emacs \"26.3\") (jsonrpc \"1.0.16\") (flymake \"1.2.1\")\n" | ||
| 45 | ";; (project \"0.9.8\") (xref \"1.6.2\") (eldoc \"1.14.0\")\n" | ||
| 46 | ";; (seq \"2.23\") (external-completion \"0.1\"))") | ||
| 47 | (should (equal (lm-package-requires) | ||
| 48 | '((emacs "26.3") (jsonrpc "1.0.16") (flymake "1.2.1") | ||
| 49 | (project "0.9.8") (xref "1.6.2") (eldoc "1.14.0") | ||
| 50 | (seq "2.23") (external-completion "0.1")))))) | ||
| 51 | |||
| 52 | |||
| 33 | (ert-deftest lm--tests-lm-website () | 53 | (ert-deftest lm--tests-lm-website () |
| 34 | (with-temp-buffer | 54 | (with-temp-buffer |
| 35 | (insert ";; URL: https://example.org/foo") | 55 | (insert ";; URL: https://example.org/foo") |