* lisp/emacs-lisp/lisp-mnt.el (lm-crack-address): Handle multi-addresses

(lm-authors, lm-maintainers): Adjust accordingly.
This commit is contained in:
Stefan Monnier 2021-08-12 13:55:38 -04:00
parent 1d60a25541
commit 5809728bc5
2 changed files with 53 additions and 14 deletions

View file

@ -357,18 +357,21 @@ Return argument is of the form (\"HOLDER\" \"YEAR1\" ... \"YEARN\")"
summary)))))
(defun lm-crack-address (x)
"Split up an email address X into full name and real email address.
The value is a cons of the form (FULLNAME . ADDRESS)."
(cond ((string-match "\\(.+\\) [(<]\\(\\S-+@\\S-+\\)[>)]" x)
(cons (string-trim-right (match-string 1 x))
(match-string 2 x)))
((string-match "\\(\\S-+@\\S-+\\) [(<]\\(.*\\)[>)]" x)
(cons (string-trim-right (match-string 2 x))
(match-string 1 x)))
((string-match "\\S-+@\\S-+" x)
(cons nil x))
(t
(cons x nil))))
"Split up email address(es) X into full name and real email address.
The value is a list of elements of the form (FULLNAME . ADDRESS)."
(cond ((string-match
(concat "[,\s\t]*\\(?:"
"\\(.+?\\) +[(<]\\(\\S-+@\\S-+\\)[>)]"
"\\|"
"\\(?2:\\S-+@\\S-+\\) +[(<]\\(?1:[^,]*\\)[>)]"
"\\|"
"\\(?2:\\S-+@\\S-+\\)"
"\\)")
x)
`((,(string-trim-right (match-string 1 x)) . ,(match-string 2 x))
. ,(lm-crack-address (substring x (match-end 0)))))
((string-match "\\`[,\s\t]*\\'" x) nil)
(t `((,x)))))
(defun lm-authors (&optional file)
"Return the author list of file FILE, or current buffer if FILE is nil.
@ -376,7 +379,7 @@ Each element of the list is a cons; the car is the full name,
the cdr is an email address."
(lm-with-file file
(let ((authorlist (lm-header-multiline "author")))
(mapcar #'lm-crack-address authorlist))))
(mapcan #'lm-crack-address authorlist))))
(defun lm-maintainers (&optional file)
"Return the maintainer list of file FILE, or current buffer if FILE is nil.
@ -384,7 +387,7 @@ If the maintainers are unspecified, then return the authors.
Each element of the list is a cons; the car is the full name,
the cdr is an email address."
(lm-with-file file
(mapcar #'lm-crack-address
(mapcan #'lm-crack-address
(or (lm-header-multiline "maintainer")
(lm-header-multiline "author")))))

View file

@ -0,0 +1,36 @@
;;; lisp-mnt-tests.el --- Tests for lisp-mnt -*- lexical-binding: t; -*-
;; Copyright (C) 2021 2020-2021 Free Software Foundation, Inc.
;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
;;
;;; Code:
(require 'ert)
(require 'lisp-mnt)
(ert-deftest lm--tests-crack-address ()
(should (equal (lm-crack-address
"Bob Weiner <rsw@gnu.org>, Mats Lidell <matsl@gnu.org>")
'(("Bob Weiner" . "rsw@gnu.org")
("Mats Lidell" . "matsl@gnu.org")))))
(provide 'lisp-mnt-tests)
;;; lisp-mnt-tests.el ends here