From 9ead0ba1dd2676105269ff1472a206a250539b18 Mon Sep 17 00:00:00 2001 From: "Basil L. Contovounesios" Date: Mon, 12 Jun 2023 00:23:56 +0100 Subject: [PATCH] Fix some shy group regexps These issues were caught by modified versions of the GNU ELPA packages xr and relint: - https://github.com/mattiase/xr/pull/6 - https://github.com/mattiase/relint/pull/14 * lisp/gnus-art.el (gnus-parse-news-url): Remove redundant numbered group and calls to match-string. * lisp/progmodes/c-ts-mode.el (c-ts-mode--c-or-c++-regexp): * lisp/progmodes/cc-mode.el (c-or-c++-mode--regexp): Fix shy group mistyped as optional colon (bug#64019#29). * lisp/vc/vc-git.el (vc-git-annotate-time): Ditto. Also fix timezone parsing by using iso8601-parse. * test/lisp/vc/vc-git-tests.el (vc-git-test-annotate-time): New test. --- lisp/gnus/gnus-art.el | 7 +++---- lisp/progmodes/c-ts-mode.el | 2 +- lisp/progmodes/cc-mode.el | 2 +- lisp/vc/vc-git.el | 19 ++++++++++++------- test/lisp/vc/vc-git-tests.el | 17 +++++++++++++++++ 5 files changed, 34 insertions(+), 13 deletions(-) diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el index 6a7a3f41746..6f201f9c3df 100644 --- a/lisp/gnus/gnus-art.el +++ b/lisp/gnus/gnus-art.el @@ -8331,11 +8331,10 @@ gnus-parse-news-url (when (looking-at "\\([A-Za-z]+\\):") (setq scheme (match-string 1)) (goto-char (match-end 0))) - (when (looking-at "//\\([^:/]+\\)\\(:?\\)\\([0-9]+\\)?/") + (when (looking-at "//\\([^:/]+\\):?\\([0-9]+\\)?/") (setq server (match-string 1)) - (setq port (if (stringp (match-string 3)) - (string-to-number (match-string 3)) - (match-string 3))) + (setq port (and (match-beginning 2) + (string-to-number (match-string 2)))) (goto-char (match-end 0))) (cond diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el index 4b83c6733a2..9e911192be3 100644 --- a/lisp/progmodes/c-ts-mode.el +++ b/lisp/progmodes/c-ts-mode.el @@ -1355,7 +1355,7 @@ c-ts-mode--c-or-c++-regexp "\\|" id "::" "\\|" id ws-maybe "=\\)" "\\|" "\\(?:inline" ws "\\)?namespace" - "\\(:?" ws "\\(?:" id "::\\)*" id "\\)?" ws-maybe "{" + "\\(?:" ws "\\(?:" id "::\\)*" id "\\)?" ws-maybe "{" "\\|" "class" ws id "\\(?:" ws "final" "\\)?" ws-maybe "[:{;\n]" "\\|" "struct" ws id "\\(?:" ws "final" ws-maybe "[:{\n]" diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el index 11a1d3fe6c2..5cf9b7e17f8 100644 --- a/lisp/progmodes/cc-mode.el +++ b/lisp/progmodes/cc-mode.el @@ -2859,7 +2859,7 @@ c-or-c++-mode--regexp "\\|" id "::" "\\|" id ws-maybe "=\\)" "\\|" "\\(?:inline" ws "\\)?namespace" - "\\(:?" ws "\\(?:" id "::\\)*" id "\\)?" ws-maybe "{" + "\\(?:" ws "\\(?:" id "::\\)*" id "\\)?" ws-maybe "{" "\\|" "class" ws id "\\(?:" ws "final" "\\)?" ws-maybe "[:{;\n]" "\\|" "struct" ws id "\\(?:" ws "final" ws-maybe "[:{\n]" diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index a3469b71386..dfca944dc74 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -1723,14 +1723,19 @@ vc-git-annotate-command (declare-function vc-annotate-convert-time "vc-annotate" (&optional time)) +(autoload 'decoded-time-set-defaults "time-date") +(autoload 'iso8601-parse "iso8601") + (defun vc-git-annotate-time () - (and (re-search-forward "^[0-9a-f^]+[^()]+(.*?\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\) \\(:?\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\) \\([-+0-9]+\\)\\)? *[0-9]+) " nil t) - (vc-annotate-convert-time - (apply #'encode-time (mapcar (lambda (match) - (if (match-beginning match) - (string-to-number (match-string match)) - 0)) - '(6 5 4 3 2 1 7)))))) + (and (re-search-forward "^[0-9a-f^]+[^()]+(.*?\\([0-9]+-[0-9]+-[0-9]+\\)\\(?: \\([0-9]+:[0-9]+:[0-9]+\\) \\([-+0-9]+\\)\\)? +[0-9]+) " nil t) + (let* ((dt (match-string 1)) + (dt (if (not (match-beginning 2)) dt + ;; Format as ISO 8601. + (concat dt "T" (match-string 2) (match-string 3)))) + (decoded (ignore-errors (iso8601-parse dt)))) + (and decoded + (vc-annotate-convert-time + (encode-time (decoded-time-set-defaults decoded))))))) (defun vc-git-annotate-extract-revision-at-line () (save-excursion diff --git a/test/lisp/vc/vc-git-tests.el b/test/lisp/vc/vc-git-tests.el index f12c5d3434b..b331b77cf01 100644 --- a/test/lisp/vc/vc-git-tests.el +++ b/test/lisp/vc/vc-git-tests.el @@ -64,4 +64,21 @@ vc-git-test--run-program-version-test (actual-output (vc-git--program-version))) (should (equal actual-output expected-output)))) +(ert-deftest vc-git-test-annotate-time () + "Test `vc-git-annotate-time'." + (require 'vc-annotate) + (with-temp-buffer + (insert "\ +00000000 (Foo Bar 2023-06-14 1) a +00000001 (Foo Bar 2023-06-14 00:00:00 -0130 2) b +00000002 (Foo Bar 2023-06-14 00:00:00 +0145 3) c +00000003 (Foo Bar 2023-06-14 00:00:00 4) d +00000004 (Foo Bar 0-0-0 5) \n") + (goto-char (point-min)) + (should (floatp (vc-git-annotate-time))) + (should (> (vc-git-annotate-time) + (vc-git-annotate-time))) + (should-not (vc-git-annotate-time)) + (should-not (vc-git-annotate-time)))) + ;;; vc-git-tests.el ends here -- 2.34.1