]> git.eshelyaron.com Git - emacs.git/commitdiff
VC: New hook to strip CVS template lines when committing
authorChristoph Badura <bad@bsd.de>
Sun, 26 Jan 2025 21:48:11 +0000 (22:48 +0100)
committerEshel Yaron <me@eshelyaron.com>
Sun, 9 Mar 2025 10:30:46 +0000 (11:30 +0100)
Add a hook function to strip all lines beginning with "CVS:" from the
commit message as CVS does.  Do this only if 'log-edit-vc-backend' is
'CVS'.  (Bug#72341)

* lisp/vc/log-edit.el
(log-edit-done-strip-cvs-lines): New command.
(log-edit-done-hook): Add it as an option.

* test/lisp/vc/log-edit-tests.el
(log-edit-done-strip-cvs-lines-helper): New function.
(log-edit-done-strip-cvs-lines-cvs)
(log-edit-done-strip-cvs-lines-non-cvs)
(log-edit-done-strip-cvs-lines-only-cvs-colon-blank)
(log-edit-done-strip-cvs-lines-only-cvs-colon): New test cases.

* etc/NEWS: Mention log-edit-done-strip-cvs-lines.

(cherry picked from commit 00e284fc52b44fc3cb435a5d17ce58af1b753a34)

lisp/vc/log-edit.el
test/lisp/vc/log-edit-tests.el

index bb85de8bd1007cfdaad74f86892d3d7ef44f9dca..3eb614f6030001663039f05eedcc2bc45814233b 100644 (file)
@@ -210,7 +210,8 @@ such as a bug-tracking system.  The list of files about to be committed
 can be obtained from `log-edit-files'."
   :group 'log-edit
   :type '(hook :options (log-edit-set-common-indentation
-                        log-edit-add-to-changelog)))
+                         log-edit-add-to-changelog
+                         log-edit-done-strip-cvs-lines)))
 
 (defcustom log-edit-strip-single-file-name nil
   "If non-nil, remove file name from single-file log entries."
@@ -927,6 +928,20 @@ This simply uses the local CVS/Template file."
       (goto-char (point-max))
       (insert-file-contents "CVS/Template"))))
 
+(defun log-edit-done-strip-cvs-lines (&optional interactive)
+  "Strip lines starting with \"CVS:\" from commit log message.
+When not called interactively do this only when the VC backend is CVS.
+This mimicks what CVS does when invoked as \\='cvs commit [files...]'."
+  (interactive "p")
+  (when (or interactive (eq log-edit-vc-backend 'CVS))
+    (let ((case-fold-search nil))
+      (goto-char (point-min))
+      ;; NB: While CVS defines CVSEDITPREFIX as "CVS: " it actually
+      ;; checks only the first four characters of af a line, i.e. "CVS:"
+      ;; to deal with editors that strip trailing whitespace.
+      ;; c.f. src/cvs.h and src/logmsg.c:do_editor()
+      (flush-lines "^CVS:"))))
+
 (defun log-edit-insert-cvs-rcstemplate ()
   "Insert the RCS commit log template from the CVS repository.
 This contacts the repository to get the rcstemplate file and
index 005c336a3b69cb57a13d319458277b46c272c586..6a312c6dac74bdb2207a144763e6880d9fe5c16e 100644 (file)
@@ -360,4 +360,57 @@ Report color and/or grayscale properly.
       (let ((fill-column 64)) (log-edit-fill-entry))
       (should (equal (buffer-string) wanted)))))
 
+(defun log-edit-done-strip-cvs-lines-helper (initial-text wanted vc-backend)
+  "Helper function for the log-edit-done-strip-cvs-lines tests.
+Tests that running log-edit-done-strip-cvs-lines as a log-edit-done-hook
+produces the WANTED string when run on INITIAL-TEXT with
+'log-edit-vc-backend' set to VC-BACKEND.\""
+  (with-temp-buffer
+      (let ((log-edit-done-hook 'log-edit-done-strip-cvs-lines)
+            (log-edit-vc-backend vc-backend))
+        (setq-local log-edit-callback #'(lambda () (interactive) nil))
+        (insert initial-text)
+        (log-edit-done)
+        (should (equal (buffer-string) wanted)))))
+
+(ert-deftest log-edit-done-strip-cvs-lines-cvs ()
+  "Strip lines beginning with \"CVS:\" when using CVS as VC backend."
+  (let (string wanted)
+    (setq string "summary line
+first line
+CVS: Please evaluate your changes and consider the following.
+CVS: Abort checkin if you answer no.
+"
+          wanted "summary line
+first line
+")
+    (log-edit-done-strip-cvs-lines-helper string wanted 'CVS)))
+
+(ert-deftest log-edit-done-strip-cvs-lines-non-cvs ()
+  "Do not strip lines beginning with \"CVS:\" when not using CVS as VC backend."
+  (let (string)
+    (setq string "summary line
+first line
+CVS: Please evaluate your changes and consider the following.
+CVS: Abort checkin if you answer no.
+")
+  (log-edit-done-strip-cvs-lines-helper string string nil)))
+
+(ert-deftest log-edit-done-strip-cvs-lines-only-cvs-colon-blank ()
+  "Strip lines that contain solely \"CVS: \" when using CVS as VC backend."
+  (let (string wanted)
+    (setq string "CVS: \n"
+          wanted "")
+    (log-edit-done-strip-cvs-lines-helper string wanted 'CVS)))
+
+(ert-deftest log-edit-done-strip-cvs-lines-only-cvs-colon ()
+  "Strip lines that contain solely \"CVS:\" when using CVS as VC backend."
+  ;; This test verifies that lines consisting only of "CVS:" (no blank
+  ;; after the colon) are stripped from the commit message.
+  ;; CVS does this to accomodate editors that delete trailing whitespace.
+  (let (string wanted)
+    (setq string "CVS:\n"
+          wanted "")
+    (log-edit-done-strip-cvs-lines-helper string wanted 'CVS)))
+
 ;;; log-edit-tests.el ends here