Add new function lm-package-needs-footer-line
* lisp/emacs-lisp/lisp-mnt.el (lm-package-needs-footer-line): Factor out new function... * lisp/emacs-lisp/package.el (package-buffer-info): ...from here. * lisp/emacs-lisp/lisp-mnt.el (lm-verify): Use above new function. * test/lisp/emacs-lisp/lisp-mnt-tests.el (lm-tests--lm-package-needs-footer-line/empty-dependencies) (lm-tests--lm-package-needs-footer-line/old-version) (lm-tests--lm-package-needs-footer-line/new-version): New tests.
This commit is contained in:
parent
38ce85c547
commit
c302c5fab0
3 changed files with 51 additions and 18 deletions
|
@ -1,7 +1,6 @@
|
|||
;;; lisp-mnt.el --- utility functions for Emacs Lisp maintainers -*- lexical-binding:t -*-
|
||||
|
||||
;; Copyright (C) 1992, 1994, 1997, 2000-2024 Free Software Foundation,
|
||||
;; Inc.
|
||||
;; Copyright (C) 1992-2024 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: Eric S. Raymond <esr@thyrsus.com>
|
||||
;; Maintainer: emacs-devel@gnu.org
|
||||
|
@ -106,8 +105,10 @@
|
|||
;; * Code line --- exists so Lisp can know where commentary and/or
|
||||
;; change-log sections end.
|
||||
;;
|
||||
;; * Footer line --- marks end-of-file so it can be distinguished from
|
||||
;; an expanded formfeed or the results of truncation.
|
||||
;; * Footer line --- marks end-of-file so it can be distinguished
|
||||
;; from an expanded formfeed or the results of truncation. This is
|
||||
;; required for a package to be installable by package.el in Emacs 29.1
|
||||
;; or earlier, but is optional in later versions.
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
@ -467,6 +468,29 @@ package version (a string)."
|
|||
(lm--prepare-package-dependencies
|
||||
(package-read-from-string (mapconcat #'identity require-lines " "))))))
|
||||
|
||||
(defun lm-package-needs-footer-line (&optional file)
|
||||
"Return non-nil if package in current buffer needs a footer line.
|
||||
|
||||
Footer lines (sometimes referred to as \"terminating comments\") look
|
||||
like this:
|
||||
|
||||
;;; some-cool-package.el ends here
|
||||
|
||||
Such lines are required for a package to be installable by package.el in
|
||||
Emacs 29.1 or earlier, but are optional in later versions. If the
|
||||
package depends on a version of Emacs where package.el requires such
|
||||
comments, or if no version requirement is specified, return non-nil.
|
||||
|
||||
If optional argument FILE is non-nil, use that file instead of the
|
||||
current buffer."
|
||||
(lm-with-file file
|
||||
;; Starting in Emacs 30.1, avoid warning if the minimum Emacs
|
||||
;; version is specified as 30.1 or later.
|
||||
(let ((min-emacs (cadar (seq-filter (lambda (x) (eq (car x) 'emacs))
|
||||
(lm-package-requires)))))
|
||||
(or (null min-emacs)
|
||||
(version< min-emacs "30.1")))))
|
||||
|
||||
(defun lm-keywords (&optional file)
|
||||
"Return the keywords given in file FILE, or current buffer if FILE is nil.
|
||||
The return is a `downcase'-ed string, or nil if no keywords
|
||||
|
@ -593,11 +617,12 @@ copyright notice is allowed."
|
|||
((not (lm-code-start))
|
||||
"Can't find a `Code' section marker")
|
||||
((progn
|
||||
(goto-char (point-max))
|
||||
(not
|
||||
(re-search-backward
|
||||
(rx bol ";;; " (regexp name) " ends here")
|
||||
nil t)))
|
||||
(when (lm-package-needs-footer-line)
|
||||
(goto-char (point-max))
|
||||
(not
|
||||
(re-search-backward
|
||||
(rx bol ";;; " (regexp name) " ends here")
|
||||
nil t))))
|
||||
"Can't find the footer line")
|
||||
((not (and (lm-copyright-mark) (lm-crack-copyright)))
|
||||
"Can't find a valid copyright notice")
|
||||
|
|
|
@ -1174,23 +1174,18 @@ boundaries."
|
|||
(let ((file-name (match-string-no-properties 1))
|
||||
(desc (match-string-no-properties 2))
|
||||
(start (line-beginning-position)))
|
||||
(require 'lisp-mnt)
|
||||
;; This warning was added in Emacs 27.1, and should be removed at
|
||||
;; the earliest in version 31.1. The idea is to phase out the
|
||||
;; requirement for a "footer line" without unduly impacting users
|
||||
;; on earlier Emacs versions. See Bug#26490 for more details.
|
||||
(unless (search-forward (concat ";;; " file-name ".el ends here") nil 'move)
|
||||
;; Starting in Emacs 30.1, avoid warning if the minimum Emacs
|
||||
;; version is specified as 30.1 or later.
|
||||
(let ((min-emacs (cadar (seq-filter (lambda (x) (eq (car x) 'emacs))
|
||||
(lm-package-requires)))))
|
||||
(when (or (null min-emacs)
|
||||
(version< min-emacs "30.1"))
|
||||
(lwarn '(package package-format) :warning
|
||||
"Package lacks a terminating comment"))))
|
||||
(when (lm-package-needs-footer-line)
|
||||
(lwarn '(package package-format) :warning
|
||||
"Package lacks a terminating comment")))
|
||||
;; Try to include a trailing newline.
|
||||
(forward-line)
|
||||
(narrow-to-region start (point))
|
||||
(require 'lisp-mnt)
|
||||
;; Use some headers we've invented to drive the process.
|
||||
(let* (;; Prefer Package-Version; if defined, the package author
|
||||
;; probably wants us to use it. Otherwise try Version.
|
||||
|
|
|
@ -49,6 +49,19 @@
|
|||
(project "0.9.8") (xref "1.6.2") (eldoc "1.14.0")
|
||||
(seq "2.23") (external-completion "0.1"))))))
|
||||
|
||||
(ert-deftest lm-tests--lm-package-needs-footer-line/empty-dependencies ()
|
||||
(with-temp-buffer
|
||||
(should (lm-package-needs-footer-line))))
|
||||
|
||||
(ert-deftest lm-tests--lm-package-needs-footer-line/old-version ()
|
||||
(with-temp-buffer
|
||||
(insert ";; Package-Requires: ((emacs \"29.1\"))\n")
|
||||
(should (lm-package-needs-footer-line))))
|
||||
|
||||
(ert-deftest lm-tests--lm-package-needs-footer-line/new-version ()
|
||||
(with-temp-buffer
|
||||
(insert ";; Package-Requires: ((emacs \"30.1\"))\n")
|
||||
(should (not (lm-package-needs-footer-line)))))
|
||||
|
||||
(ert-deftest lm--tests-lm-website ()
|
||||
(with-temp-buffer
|
||||
|
|
Loading…
Add table
Reference in a new issue