From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "J.P." Newsgroups: gmane.emacs.bugs Subject: bug#50009: 28.0.50; add CRLF to outgoing ERC protocol logger lines Date: Tue, 14 Sep 2021 02:22:18 -0700 Message-ID: <87czpb4ilx.fsf@neverwas.me> References: <87v94chxbh.fsf@neverwas.me> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="2042"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) To: 50009@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue Sep 14 11:24:10 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mQ4fi-0000LK-E3 for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 14 Sep 2021 11:24:10 +0200 Original-Received: from localhost ([::1]:38280 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mQ4fg-00025H-K5 for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 14 Sep 2021 05:24:08 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:38578) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mQ4ec-00015s-Gx for bug-gnu-emacs@gnu.org; Tue, 14 Sep 2021 05:23:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:35998) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mQ4ec-0008Lc-9g for bug-gnu-emacs@gnu.org; Tue, 14 Sep 2021 05:23:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mQ4ec-00070u-5e for bug-gnu-emacs@gnu.org; Tue, 14 Sep 2021 05:23:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: "J.P." Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 14 Sep 2021 09:23:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 50009 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 50009-submit@debbugs.gnu.org id=B50009.163161135126908 (code B ref 50009); Tue, 14 Sep 2021 09:23:02 +0000 Original-Received: (at 50009) by debbugs.gnu.org; 14 Sep 2021 09:22:31 +0000 Original-Received: from localhost ([127.0.0.1]:47544 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mQ4e6-0006zw-JX for submit@debbugs.gnu.org; Tue, 14 Sep 2021 05:22:31 -0400 Original-Received: from mail-108-mta212.mxroute.com ([136.175.108.212]:45259) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mQ4e4-0006zi-7m for 50009@debbugs.gnu.org; Tue, 14 Sep 2021 05:22:29 -0400 Original-Received: from filter004.mxroute.com ([149.28.56.236] filter004.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta212.mxroute.com (ZoneMTA) with ESMTPSA id 17be39d486300074ba.001 for <50009@debbugs.gnu.org> (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256); Tue, 14 Sep 2021 09:22:20 +0000 X-Zone-Loop: 7a80f403e7af696f679c0105e9cb2812d90bba87afcf X-Originating-IP: [149.28.56.236] In-Reply-To: <87v94chxbh.fsf@neverwas.me> (J. P.'s message of "Wed, 11 Aug 2021 07:26:26 -0700") X-AuthUser: masked@neverwas.me X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:214289 Archived-At: --=-=-= Content-Type: text/plain v5. Having two styles of line terminator (both CRLF and LF) present in the same buffer was dumb. So now it's just CRLF everywhere. I've also explained a bit about the format in the doc string for the version number variable. Thanks. . --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0000-v4-v5.diff >From 2dcb68486a49d59376778aea97a23ada1af5c1f4 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Tue, 14 Sep 2021 01:43:43 -0700 Subject: NOT A PATCH F. Jason Park (1): Add CRLF to outgoing ERC protocol logger lines lisp/erc/erc.el | 79 +++++++++++++++++++++++++------------- test/lisp/erc/erc-tests.el | 36 +++++++++++++++++ 2 files changed, 88 insertions(+), 27 deletions(-) Interdiff: diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 524a22e5a1..fe4ec52880 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -2317,7 +2317,16 @@ erc-debug-irc-protocol-time-format (defconst erc-debug-irc-protocol-version "1" "Protocol log format version number. -This is to help tooling track changes to the format.") +This exists to help tooling track changes to the format. + +In version 1, everything before and including the first double CRLF is +front matter, which must also be CRLF terminated. Lines beginning with +three asterisks must be ignored as comments. Other lines should be +interpreted as email-style headers. Folding is not supported. A second +double CRLF, if present, signals the end of a log. Session resumption +is not supported. Logger lines must adhere to the following format: +TIMESTAMP PEER-NAME FLOW-INDICATOR IRC-MESSAGE CRLF. Outgoing messages +are indicated with a >> and incoming with a <<.") (defvar erc-debug-irc-protocol nil "If non-nil, log all IRC protocol traffic to the buffer \"*erc-protocol*\". @@ -2344,11 +2353,7 @@ erc-log-irc-protocol appears in face `erc-input-face' in the buffer. Lines must already contain CRLF endings. Peer is identified by the most precise label available at run time, starting with the network name, followed by the -self-reported host name, and falling back to the dialed :. -When capturing logs for multiple peers and sorting them into buckets, -such inconsistent labeling may pose a problem during an initial server -burst. For now, the recommended approach is to wrap this function with -advice that temporarily redefines the symbol-function `erc-network'." +announced host name, and falling back to the dialed :." (when erc-debug-irc-protocol (let ((esid (or (and (fboundp 'erc-network) (erc-network) @@ -2382,23 +2387,22 @@ erc-log-irc-protocol (defun erc-toggle-debug-irc-protocol (&optional arg) "Toggle the value of `erc-debug-irc-protocol'. -If ARG is non-nil, show the *erc-protocol* buffer. Everything before -and including the first double CRLF is front matter. Everything before -the first double linefeed is a header." +If ARG is non-nil, show the *erc-protocol* buffer." (interactive "P") (let* ((buf (get-buffer-create "*erc-protocol*"))) (with-current-buffer buf (view-mode-enter) (when (null (current-local-map)) (let ((inhibit-read-only t) - (headers (concat "Version: " erc-debug-irc-protocol-version "\n" - "Emacs-Version: " emacs-version "\n" - "\n")) - (msg (concat "This buffer displays all IRC protocol traffic " - "exchanged with servers.\n" - "Kill it to disable logging.\n" - "Press `t' to toggle.\n"))) - (insert headers (erc-make-notice msg))) + (msg (list + (concat "Version: " erc-debug-irc-protocol-version) + (concat "Emacs-Version: " emacs-version) + (erc-make-notice + (concat "This buffer displays all IRC protocol " + "traffic exchanged with servers.")) + (erc-make-notice "Kill it to disable logging.") + (erc-make-notice "Press `t' to toggle.")))) + (insert (string-join msg "\r\n"))) (use-local-map (make-sparse-keymap)) (local-set-key (kbd "t") 'erc-toggle-debug-irc-protocol)) (add-hook 'kill-buffer-hook -- 2.31.1 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Add-CRLF-to-outgoing-ERC-protocol-logger-lines.patch >From 2dcb68486a49d59376778aea97a23ada1af5c1f4 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Mon, 14 Jun 2021 22:24:01 -0700 Subject: [PATCH 1/1] Add CRLF to outgoing ERC protocol logger lines * erc.el (erc-debug-irc-protocol): Fix line-ending mismatch between incoming and outgoing logger lines without changing interface. Do this by adding carriage returns to the latter to improve machine readability. Change printed peer labels to most accurately reflect logical endpoints. (erc-debug-irc-protocol-time-format): Add new variable to support timestamps in protocol logger output. (erc-debug-irc-protocol-version): Add new variable to help tooling track logging format independent of ERC and Emacs versions. (erc-toggle-debug-irc-protocol): Add headers to protocol-log buffer to aid future bug-reproduction tools. Clean up overlong lines. This is bug#50009. --- lisp/erc/erc.el | 79 +++++++++++++++++++++++++------------- test/lisp/erc/erc-tests.el | 36 +++++++++++++++++ 2 files changed, 88 insertions(+), 27 deletions(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index f01a99a30a..fe4ec52880 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -2312,6 +2312,22 @@ erc-error ;;; Debugging the protocol +(defvar erc-debug-irc-protocol-time-format "%FT%T.%6N%z " + "Timestamp format string for protocol logger.") + +(defconst erc-debug-irc-protocol-version "1" + "Protocol log format version number. +This exists to help tooling track changes to the format. + +In version 1, everything before and including the first double CRLF is +front matter, which must also be CRLF terminated. Lines beginning with +three asterisks must be ignored as comments. Other lines should be +interpreted as email-style headers. Folding is not supported. A second +double CRLF, if present, signals the end of a log. Session resumption +is not supported. Logger lines must adhere to the following format: +TIMESTAMP PEER-NAME FLOW-INDICATOR IRC-MESSAGE CRLF. Outgoing messages +are indicated with a >> and incoming with a <<.") + (defvar erc-debug-irc-protocol nil "If non-nil, log all IRC protocol traffic to the buffer \"*erc-protocol*\". @@ -2333,32 +2349,32 @@ erc-log-irc-protocol The buffer is created if it doesn't exist. -If OUTBOUND is non-nil, STRING is being sent to the IRC server -and appears in face `erc-input-face' in the buffer." +If OUTBOUND is non-nil, STRING is being sent to the IRC server and +appears in face `erc-input-face' in the buffer. Lines must already +contain CRLF endings. Peer is identified by the most precise label +available at run time, starting with the network name, followed by the +announced host name, and falling back to the dialed :." (when erc-debug-irc-protocol - (let ((network-name (or (ignore-errors (erc-network-name)) - "???"))) + (let ((esid (or (and (fboundp 'erc-network) + (erc-network) + (erc-network-name)) + erc-server-announced-name + (format "%s:%s" erc-session-server erc-session-port))) + (ts (when erc-debug-irc-protocol-time-format + (format-time-string erc-debug-irc-protocol-time-format)))) (with-current-buffer (get-buffer-create "*erc-protocol*") (save-excursion (goto-char (point-max)) (let ((inhibit-read-only t)) - (insert (if (not outbound) - ;; Cope with the fact that string might - ;; contain multiple lines of text. - (let ((lines (delete "" (split-string string - "\n\\|\r\n"))) - (result "")) - (dolist (line lines) - (setq result (concat result network-name - " << " line "\n"))) - result) - (propertize - (concat network-name " >> " string - (if (/= ?\n - (aref string - (1- (length string)))) - "\n")) - 'font-lock-face 'erc-input-face))))) + (insert (if outbound + (concat ts esid " >> " string) + ;; Cope with multi-line messages + (let ((lines (split-string string "[\r\n]+" t)) + result) + (dolist (line lines) + (setq result (concat result ts esid + " << " line "\r\n"))) + result))))) (let ((orig-win (selected-window)) (debug-buffer-window (get-buffer-window (current-buffer) t))) (when debug-buffer-window @@ -2377,9 +2393,16 @@ erc-toggle-debug-irc-protocol (with-current-buffer buf (view-mode-enter) (when (null (current-local-map)) - (let ((inhibit-read-only t)) - (insert (erc-make-notice "This buffer displays all IRC protocol traffic exchanged with each server.\n")) - (insert (erc-make-notice "Kill this buffer to terminate protocol logging.\n\n"))) + (let ((inhibit-read-only t) + (msg (list + (concat "Version: " erc-debug-irc-protocol-version) + (concat "Emacs-Version: " emacs-version) + (erc-make-notice + (concat "This buffer displays all IRC protocol " + "traffic exchanged with servers.")) + (erc-make-notice "Kill it to disable logging.") + (erc-make-notice "Press `t' to toggle.")))) + (insert (string-join msg "\r\n"))) (use-local-map (make-sparse-keymap)) (local-set-key (kbd "t") 'erc-toggle-debug-irc-protocol)) (add-hook 'kill-buffer-hook @@ -2387,10 +2410,12 @@ erc-toggle-debug-irc-protocol nil 'local) (goto-char (point-max)) (let ((inhibit-read-only t)) - (insert (erc-make-notice - (format "IRC protocol logging %s at %s -- Press `t' to toggle logging.\n" + (insert (if erc-debug-irc-protocol "\r\n" "") + (erc-make-notice + (format "IRC protocol logging %s at %s" (if erc-debug-irc-protocol "disabled" "enabled") - (current-time-string)))))) + (current-time-string))) + (if erc-debug-irc-protocol "\r\n" "\r\n\r\n")))) (setq erc-debug-irc-protocol (not erc-debug-irc-protocol)) (if (and arg (not (get-buffer-window "*erc-protocol*" t))) diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index d13397274a..7a0867a0a1 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -24,6 +24,7 @@ (require 'ert) (require 'erc) (require 'erc-ring) +(require 'erc-networks) (ert-deftest erc--read-time-period () (cl-letf (((symbol-function 'read-string) (lambda (&rest _) ""))) @@ -109,3 +110,38 @@ erc-ring-previous-command (should (looking-at "abc"))))) (when noninteractive (kill-buffer "*#fake*"))) + +(ert-deftest erc-log-irc-protocol () + (should-not erc-debug-irc-protocol) + (with-temp-buffer + (setq erc-server-process (start-process "fake" (current-buffer) "true") + erc-server-current-nick "tester" + erc-session-server "myproxy.localhost" + erc-session-port 6667) + (let ((inhibit-message noninteractive)) + (erc-toggle-debug-irc-protocol) + (erc-log-irc-protocol "PASS changeme\r\n" 'outgoing) + (setq erc-server-announced-name "irc.gnu.org") + (erc-log-irc-protocol ":irc.gnu.org 001 tester :Welcome") + (erc-log-irc-protocol ":irc.gnu.org 002 tester :Your host is irc.gnu.org") + (setq erc-network 'FooNet) + (erc-log-irc-protocol ":irc.gnu.org 422 tester :MOTD missing") + (setq erc-network 'BarNet) + (erc-log-irc-protocol ":irc.gnu.org 221 tester +i") + (set-process-query-on-exit-flag erc-server-process nil))) + (with-current-buffer "*erc-protocol*" + (goto-char (point-min)) + (search-forward "Version") + (search-forward "\r\n\r\n") + (search-forward "myproxy.localhost:6667 >> PASS" (line-end-position)) + (forward-line) + (search-forward "irc.gnu.org << :irc.gnu.org 001" (line-end-position)) + (forward-line) + (search-forward "irc.gnu.org << :irc.gnu.org 002" (line-end-position)) + (forward-line) + (search-forward "FooNet << :irc.gnu.org 422" (line-end-position)) + (forward-line) + (search-forward "BarNet << :irc.gnu.org 221" (line-end-position))) + (when noninteractive + (kill-buffer "*erc-protocol*") + (should-not erc-debug-irc-protocol))) -- 2.31.1 --=-=-=--