]> git.eshelyaron.com Git - emacs.git/commitdiff
Preserve user markers when inserting ERC date stamps
authorF. Jason Park <jp@neverwas.me>
Sat, 4 Nov 2023 18:08:22 +0000 (11:08 -0700)
committerF. Jason Park <jp@neverwas.me>
Sat, 4 Nov 2023 22:36:24 +0000 (15:36 -0700)
* lisp/erc/erc-stamp.el
(erc-stamp--insert-date-stamp-as-phony-message): Ensure existing
user markers aren't displaced by date-stamp insertion.
* lisp/erc/erc.el (erc--insert-line-function): New function-valued
variable for overriding `insert'.
(erc-insert-line): Call `erc--insert-line-function', when non-nil, to
insert line specially.
* test/lisp/erc/erc-scenarios-stamp.el
(erc-scenarios-stamp--on-insert-modify): New assertion helper
function.
(erc-scenarios-stamp--date-mode/left-and-right): New test.
(Bug#60936)

lisp/erc/erc-stamp.el
lisp/erc/erc.el
test/lisp/erc/erc-scenarios-stamp.el

index b522467478359adefb7b0f73e0b018674ea93fd4..b65c7adf676d4ebcb2d0221a13e717bcdb02cd35 100644 (file)
@@ -670,6 +670,7 @@ value of t means the option's value doesn't require trimming.")
   (let ((erc-stamp--skip t)
         (erc-insert-modify-hook `(,@erc-insert-modify-hook
                                   erc-stamp--propertize-left-date-stamp))
+        (erc--insert-line-function #'insert-before-markers)
         ;; Don't run hooks that aren't expecting a narrowed buffer.
         (erc-insert-pre-hook nil)
         (erc-insert-done-hook nil))
index a5457601223dacde4252479cfca4f30766eee38f..fd57cb9d6a0c97323b2ce03a9747588f4fcb5095 100644 (file)
@@ -3083,6 +3083,9 @@ If END is a marker, possibly update its position."
   (unless (eq end erc-insert-marker)
     (set-marker end nil)))
 
+(defvar erc--insert-line-function nil
+  "When non-nil, an alterntive to `insert' for inserting messages.")
+
 (defvar erc--insert-marker nil
   "Internal override for `erc-insert-marker'.")
 
@@ -3134,7 +3137,9 @@ modification hooks)."
               (save-restriction
                 (widen)
                 (goto-char insert-position)
-                (insert string)
+                (if erc--insert-line-function
+                    (funcall erc--insert-line-function string)
+                  (insert string))
                 (erc--assert-input-bounds)
                 ;; run insertion hook, with point at restored location
                 (save-restriction
index b98300d04beb77723879299664f55bc97aed9e12..49307dd228aed7cb472febd51130308e4f52da99 100644 (file)
                       (not (eq 'erc-timestamp (field-at-pos (point))))))
           (should (erc--get-inserted-msg-prop 'erc-cmd)))))))
 
+;; This user-owned hook member places a marker on the first message in
+;; a buffer.  Inserting a date stamp in front of it shouldn't move the
+;; marker.
+(defun erc-scenarios-stamp--on-insert-modify ()
+  (unless (marker-position erc-scenarios-stamp--user-marker)
+    (set-marker erc-scenarios-stamp--user-marker (point-min))
+    (save-excursion
+      (goto-char erc-scenarios-stamp--user-marker)
+      (should (looking-at "Opening"))))
+
+  ;; Sometime after the first message ("Opening connection.."), assert
+  ;; that the marker we just placed hasn't moved.
+  (when (erc--check-msg-prop 'erc-cmd 2)
+    (save-restriction
+      (widen)
+      (ert-info ("Date stamp preserves opening user marker")
+        (goto-char erc-scenarios-stamp--user-marker)
+        (should-not (eq 'erc-timestamp (field-at-pos (point))))
+        (should (looking-at "Opening"))
+        (should (eq 'unknown (get-text-property (point) 'erc-msg))))))
+
+  ;; On 003 ("*** This server was created on"), clear state to force a
+  ;; new date stamp on the next message.
+  (when (erc--check-msg-prop 'erc-cmd 3)
+    (setq erc-timestamp-last-inserted-left nil)
+    (set-marker erc-scenarios-stamp--user-marker erc-insert-marker)))
+
+(ert-deftest erc-scenarios-stamp--date-mode/left-and-right ()
+
+  (should (eq erc-insert-timestamp-function
+              #'erc-insert-timestamp-left-and-right))
+
+  (erc-scenarios-common-with-cleanup
+      ((erc-scenarios-common-dialog "base/reconnect")
+       (dumb-server (erc-d-run "localhost" t 'unexpected-disconnect))
+       (port (process-contact dumb-server :service))
+       (erc-scenarios-stamp--user-marker (make-marker))
+       (erc-server-flood-penalty 0.1)
+       (erc-modules (if (zerop (random 2))
+                        (cons 'fill-wrap erc-modules)
+                      erc-modules))
+       (expect (erc-d-t-make-expecter))
+       (erc-mode-hook
+        (cons (lambda ()
+                (add-hook 'erc-insert-modify-hook
+                          #'erc-scenarios-stamp--on-insert-modify -99 t))
+              erc-mode-hook)))
+
+    (ert-info ("Connect")
+      (with-current-buffer (erc :server "127.0.0.1"
+                                :port port
+                                :full-name "tester"
+                                :nick "tester")
+
+        (funcall expect 5 "Welcome to the foonet")
+        (funcall expect 5 "*** AWAYLEN=390")
+
+        (ert-info ("Date stamp preserves other user marker")
+          (goto-char erc-scenarios-stamp--user-marker)
+          (should-not (eq 'erc-timestamp (field-at-pos (point))))
+          (should (looking-at (rx "*** irc.foonet.org oragono")))
+          (should (eq 's004 (get-text-property (point) 'erc-msg))))
+
+        (funcall expect 5 "This server is in debug mode")))))
+
 ;;; erc-scenarios-stamp.el ends here