all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: LdBeth <andpuke@foxmail.com>
To: Lars Ingebrigtsen <larsi@gnus.org>
Cc: Eric Abrahamsen <eric@ericabrahamsen.net>,
	LdBeth <andpuke@foxmail.com>, Emacs Devel <emacs-devel@gnu.org>
Subject: Re: [PATCH] Gnus; Restore multi encoding support for NNTP
Date: Sat, 01 Jan 2022 11:32:19 +0800	[thread overview]
Message-ID: <tencent_2FBAB51CDD7A4430727412AC40FEFEDDD609@qq.com> (raw)
In-Reply-To: <tencent_CA1EFFD4DC58BB7F1C417AAC30747544AD09@qq.com>

[-- Attachment #1: Type: text/plain, Size: 1192 bytes --]

>>>>> In <tencent_CA1EFFD4DC58BB7F1C417AAC30747544AD09@qq.com> 
>>>>>	LdBeth <andpuke@foxmail.com> wrote:

ldb> Right now this patch has no problem accessing, subscribing servers
ldb> with GBK coding system and save the group names with their text
ldb> property (test agains the git master branch). The only one missing
ldb> puzzle is, the text property would be lost at some point after read in
ldb> the newsrc.eld file. I'll do a trace later to find out if this can be
ldb> worked out.

I have now removed the "extraneous" decoding rountines when convert
the gnus-newsrc-alist to hashtable. I did some test on the server I
use and it works fine to me.

The minimal .gnus.el I use:

```
(setq gnus-select-method '(nnnil ""))
(add-to-list 'gnus-secondary-select-methods '(nntp "news.newsfan.net"))

(setq gnus-group-name-charset-group-alist
      '((".*" . gbk)))
```

Notice that after entering the group there would still be wrongly
decoded article names, but that can be solved by setting up
`gnus-summary-show-article-charset-alist`
`mm-coding-system-priorities` etc. These are not related to this
patch, and are quite complex so I'd rather to not cover them here.

Btw, happy new year.


[-- Attachment #2: gnus.patch --]
[-- Type: text/plain, Size: 15808 bytes --]

diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index b042930..9db3d11 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -1230,6 +1230,12 @@ gnus-group-decoded-name
   (let ((charset (gnus-group-name-charset nil string)))
     (gnus-group-name-decode string charset)))
 
+(defun gnus-group-encoded-name (string)
+  ;; search for `charset' property added by `decode-coding-string'
+  (let ((pos (text-property-not-all 0 (length string) 'charset nil string)))
+    (if pos (encode-coding-string string (get-text-property pos 'charset string))
+      string)))
+
 (defun gnus-group-list-groups (&optional level unread lowest update-level)
   "List newsgroups with level LEVEL or lower that have unread articles.
 Default is all subscribed groups.
diff --git a/lisp/gnus/gnus-int.el b/lisp/gnus/gnus-int.el
index 255c11f..4fcc44d 100644
--- a/lisp/gnus/gnus-int.el
+++ b/lisp/gnus/gnus-int.el
@@ -472,7 +472,7 @@ gnus-request-compact-group
 	 (result
 	  (funcall (gnus-get-function gnus-command-method
 				      'request-compact-group)
-		   (gnus-group-real-name group)
+		   (gnus-group-real-name (gnus-group-encoded-name group))
 		   (nth 1 gnus-command-method) t)))
     result))
 
@@ -493,7 +493,8 @@ gnus-request-group
       (setq gnus-command-method
 	    (inline (gnus-server-to-method gnus-command-method))))
     (funcall (inline (gnus-get-function gnus-command-method 'request-group))
-	     (gnus-group-real-name group) (nth 1 gnus-command-method)
+	     (gnus-group-real-name (gnus-group-encoded-name group))
+             (nth 1 gnus-command-method)
 	     dont-check
 	     info)))
 
@@ -503,7 +504,8 @@ gnus-request-group-description
 	(func 'request-group-description))
     (when (gnus-check-backend-function func group)
       (funcall (gnus-get-function gnus-command-method func)
-	       (gnus-group-real-name group) (nth 1 gnus-command-method)))))
+	       (gnus-group-real-name (gnus-group-encoded-name group))
+               (nth 1 gnus-command-method)))))
 
 (defun gnus-request-group-scan (group info)
   "Request that GROUP get a complete rescan."
@@ -511,13 +513,15 @@ gnus-request-group-scan
 	(func 'request-group-scan))
     (when (gnus-check-backend-function func group)
       (funcall (gnus-get-function gnus-command-method func)
-	       (gnus-group-real-name group) (nth 1 gnus-command-method) info))))
+	       (gnus-group-real-name (gnus-group-encoded-name group))
+               (nth 1 gnus-command-method) info))))
 
 (defun gnus-close-group (group)
   "Request the GROUP be closed."
   (let ((gnus-command-method (inline (gnus-find-method-for-group group))))
     (funcall (gnus-get-function gnus-command-method 'close-group)
-	     (gnus-group-real-name group) (nth 1 gnus-command-method))))
+	     (gnus-group-real-name (gnus-group-encoded-name group))
+             (nth 1 gnus-command-method))))
 
 (defun gnus-retrieve-headers (articles group &optional fetch-old)
   "Request headers for ARTICLES in GROUP.
@@ -531,14 +535,14 @@ gnus-retrieve-headers
       (gnus-agent-retrieve-headers articles group fetch-old))
      (t
       (funcall (gnus-get-function gnus-command-method 'retrieve-headers)
-	       articles (gnus-group-real-name group)
+	       articles (gnus-group-real-name (gnus-group-encoded-name group))
 	       (nth 1 gnus-command-method) fetch-old)))))
 
 (defun gnus-retrieve-articles (articles group)
   "Request ARTICLES in GROUP."
   (let ((gnus-command-method (gnus-find-method-for-group group)))
     (funcall (gnus-get-function gnus-command-method 'retrieve-articles)
-	     articles (gnus-group-real-name group)
+	     articles (gnus-group-real-name (gnus-group-encoded-name group))
 	     (nth 1 gnus-command-method))))
 
 (defun gnus-retrieve-groups (groups command-method)
@@ -557,7 +561,7 @@ gnus-request-type
 	      'request-type (car gnus-command-method)))
 	'unknown
       (funcall (gnus-get-function gnus-command-method 'request-type)
-	       (gnus-group-real-name group) article))))
+	       (gnus-group-real-name (gnus-group-encoded-name group)) article))))
 
 (defun gnus-request-update-group-status (group status)
   "Change the status of a group.
@@ -568,7 +572,7 @@ gnus-request-update-group-status
 	nil
       (funcall
        (gnus-get-function gnus-command-method 'request-update-group-status)
-       (gnus-group-real-name group) status
+       (gnus-group-real-name (gnus-group-encoded-name group)) status
        (nth 1 gnus-command-method)))))
 
 (defun gnus-request-set-mark (group action)
@@ -578,7 +582,7 @@ gnus-request-set-mark
 	      'request-set-mark (car gnus-command-method)))
 	action
       (funcall (gnus-get-function gnus-command-method 'request-set-mark)
-	       (gnus-group-real-name group) action
+	       (gnus-group-real-name (gnus-group-encoded-name group)) action
 	       (nth 1 gnus-command-method))
       (gnus-run-hook-with-args gnus-after-set-mark-hook group action))))
 
@@ -590,7 +594,8 @@ gnus-request-update-mark
 	mark
       (gnus-run-hook-with-args gnus-before-update-mark-hook group article mark)
       (funcall (gnus-get-function gnus-command-method 'request-update-mark)
-	       (gnus-group-real-name group) article mark))))
+	       (gnus-group-real-name (gnus-group-encoded-name group))
+               article mark))))
 
 (defun gnus-request-article (article group &optional buffer)
   "Request the ARTICLE in GROUP.
@@ -598,7 +603,7 @@ gnus-request-article
 If BUFFER, insert the article in that group."
   (let ((gnus-command-method (gnus-find-method-for-group group)))
     (funcall (gnus-get-function gnus-command-method 'request-article)
-	     article (gnus-group-real-name group)
+	     article (gnus-group-real-name (gnus-group-encoded-name group))
 	     (nth 1 gnus-command-method) buffer)))
 
 (defun gnus-request-thread (header group)
@@ -606,7 +611,7 @@ gnus-request-thread
   (let ((gnus-command-method (gnus-find-method-for-group group)))
     (funcall (gnus-get-function gnus-command-method 'request-thread)
 	     header
-	     (gnus-group-real-name group))))
+	     (gnus-group-real-name (gnus-group-encoded-name group)))))
 
 (defun gnus-select-group-with-message-id (group message-id)
   "Activate and select GROUP with the given MESSAGE-ID selected.
@@ -654,7 +659,7 @@ gnus-simplify-group-name
   "Return the simplest representation of the name of GROUP.
 This is the string that Gnus uses to identify the group."
   (gnus-group-prefixed-name
-   (gnus-group-real-name group)
+   (gnus-group-real-name (gnus-group-encoded-name group))
    (gnus-group-method group)))
 
 (defun gnus-warp-to-article ()
@@ -722,7 +727,8 @@ gnus-request-body
 	    clean-up t))
      ;; Use `head' function.
      ((fboundp head)
-      (setq res (funcall head article (gnus-group-real-name group)
+      (setq res (funcall head article
+                         (gnus-group-real-name (gnus-group-encoded-name group))
 			 (nth 1 gnus-command-method))))
      ;; Use `article' function.
      (t
@@ -751,7 +757,7 @@ gnus-request-expunge-group
              (gnus-server-to-method command-method)
            command-method)))
     (funcall (gnus-get-function gnus-command-method 'request-expunge-group)
-             (gnus-group-real-name group)
+             (gnus-group-real-name (gnus-group-encoded-name group))
              (nth 1 gnus-command-method))))
 
 (defvar mail-source-plugged)
@@ -768,7 +774,7 @@ gnus-request-scan
 	      (not (gnus-agent-method-p gnus-command-method)))
       (setq gnus-internal-registry-spool-current-method gnus-command-method)
       (funcall (gnus-get-function gnus-command-method 'request-scan)
-	       (and group (gnus-group-real-name group))
+	       (and group (gnus-group-real-name (gnus-group-encoded-name group)))
 	       (nth 1 gnus-command-method)))))
 
 (defun gnus-request-update-info (info command-method)
@@ -792,7 +798,7 @@ gnus-request-marks
            'request-marks (car gnus-command-method))
       (let ((group (gnus-info-group info)))
         (and (funcall (gnus-get-function gnus-command-method 'request-marks)
-                      (gnus-group-real-name group)
+                      (gnus-group-real-name (gnus-group-encoded-name group))
                       info (nth 1 gnus-command-method))
              ;; If the minimum article number is greater than 1, then all
              ;; smaller article numbers are known not to exist; we'll
@@ -816,7 +822,8 @@ gnus-request-expire-articles
 	 (not-deleted
 	  (funcall
 	   (gnus-get-function gnus-command-method 'request-expire-articles)
-	   articles (gnus-group-real-name group) (nth 1 gnus-command-method)
+	   articles (gnus-group-real-name (gnus-group-encoded-name group))
+           (nth 1 gnus-command-method)
 	   force)))
     (when (and gnus-agent
 	       (gnus-agent-method-p gnus-command-method))
@@ -830,7 +837,8 @@ gnus-request-move-article
   (let* ((gnus-command-method (gnus-find-method-for-group group))
 	 (result (funcall (gnus-get-function gnus-command-method
 					     'request-move-article)
-			  article (gnus-group-real-name group)
+			  article
+                          (gnus-group-real-name (gnus-group-encoded-name group))
 			  (nth 1 gnus-command-method) accept-function
 			  last move-is-internal)))
     (when (and result gnus-agent
@@ -864,7 +872,9 @@ gnus-request-accept-article
 	  (result
 	   (funcall
 	    (gnus-get-function gnus-command-method 'request-accept-article)
-	    (if (stringp group) (gnus-group-real-name group) group)
+	    (if (stringp group)
+                (gnus-group-real-name (gnus-group-encoded-name group))
+              group)
 	    (cadr gnus-command-method)
 	    last)))
       (when (and gnus-agent
@@ -883,7 +893,9 @@ gnus-request-replace-article
       (message-encode-message-body)))
   (let* ((func (car (gnus-group-name-to-method group)))
          (result (funcall (intern (format "%s-request-replace-article" func))
-			  article (gnus-group-real-name group) buffer)))
+			  article
+                          (gnus-group-real-name (gnus-group-encoded-name group))
+                          buffer)))
     (when (and gnus-agent (gnus-agent-method-p gnus-command-method))
       (gnus-agent-regenerate-group group (list article)))
     result))
@@ -892,7 +904,7 @@ gnus-request-restore-buffer
   "Request a new buffer restored to the state of ARTICLE."
   (let ((gnus-command-method (gnus-find-method-for-group group)))
     (funcall (gnus-get-function gnus-command-method 'request-restore-buffer)
-	     article (gnus-group-real-name group)
+	     article (gnus-group-real-name (gnus-group-encoded-name group))
 	     (nth 1 gnus-command-method))))
 
 (defun gnus-request-create-group (group &optional command-method args)
@@ -902,13 +914,15 @@ gnus-request-create-group
                 command-method)
               (gnus-find-method-for-group group))))
     (funcall (gnus-get-function gnus-command-method 'request-create-group)
-             (gnus-group-real-name group) (nth 1 gnus-command-method) args)))
+             (gnus-group-real-name (gnus-group-encoded-name group))
+             (nth 1 gnus-command-method) args)))
 
 (defun gnus-request-delete-group (group &optional force)
   (let* ((gnus-command-method (gnus-find-method-for-group group))
 	 (result
 	  (funcall (gnus-get-function gnus-command-method 'request-delete-group)
-		   (gnus-group-real-name group) force (nth 1 gnus-command-method))))
+		   (gnus-group-real-name (gnus-group-encoded-name group))
+                   force (nth 1 gnus-command-method))))
     (when result
       (gnus-cache-delete-group group)
       (gnus-agent-delete-group group))
@@ -918,8 +932,9 @@ gnus-request-rename-group
   (let* ((gnus-command-method (gnus-find-method-for-group group))
 	 (result
 	  (funcall (gnus-get-function gnus-command-method 'request-rename-group)
-		   (gnus-group-real-name group)
-		   (gnus-group-real-name new-name) (nth 1 gnus-command-method))))
+		   (gnus-group-real-name (gnus-group-encoded-name group))
+		   (gnus-group-real-name (gnus-group-encoded-name new-name))
+                   (nth 1 gnus-command-method))))
     (when result
       (gnus-cache-rename-group group new-name)
       (gnus-agent-rename-group group new-name))
diff --git a/lisp/gnus/gnus-srvr.el b/lisp/gnus/gnus-srvr.el
index fa880b7..94c6e2e 100644
--- a/lisp/gnus/gnus-srvr.el
+++ b/lisp/gnus/gnus-srvr.el
@@ -775,13 +775,12 @@ gnus-browse-foreign-server
 	      (while (not (eobp))
 		(ignore-errors
 		  (push (cons
-			 (decode-coding-string
-			  (buffer-substring
+                         (gnus-group-decoded-name
+                          (buffer-substring
 			   (point)
 			   (progn
 			     (skip-chars-forward "^ \t")
-			     (point)))
-			  'utf-8-emacs)
+			     (point))))
 			 (let ((last (read cur)))
 			   (cons (read cur) last)))
 			groups))
@@ -789,7 +788,7 @@ gnus-browse-foreign-server
 	    (while (not (eobp))
 	      (ignore-errors
 		(push (cons
-		       (decode-coding-string
+		       (gnus-group-decoded-name
 			(if (eq (char-after) ?\")
 			    (read cur)
 			  (let ((p (point)) (name ""))
@@ -801,8 +800,7 @@ gnus-browse-foreign-server
 			      (skip-chars-forward "^ \t\\\\")
 			      (setq name (concat name (buffer-substring
 						       p (point)))))
-			    name))
-			'utf-8-emacs)
+			    name)))
 		       (let ((last (read cur)))
 			 (cons (read cur) last)))
 		      groups))
diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el
index 606bd3a..2999d6b 100644
--- a/lisp/gnus/gnus-start.el
+++ b/lisp/gnus/gnus-start.el
@@ -1831,11 +1831,7 @@ gnus-make-hashtable-from-newsrc-alist
 	(if (setq rest (member method methods))
 	    (setf (gnus-info-method info) (car rest))
 	  (push method methods)))
-      ;; Check for encoded group names and decode them.
-      (when (string-match-p "[^[:ascii:]]" (setq gname (gnus-info-group info)))
-	(let ((decoded (gnus-group-decoded-name gname)))
-	 (setf gname decoded
-	       (gnus-info-group info) decoded)))
+      (setf gname (gnus-info-group info))
       ;; Check for duplicates.
       (if (gethash gname gnus-newsrc-hashtb)
 	  ;; Remove this entry from the alist.
@@ -2406,17 +2402,6 @@ gnus-read-newsrc-el-file
 	(when gnus-newsrc-assoc
 	  (setq gnus-newsrc-alist gnus-newsrc-assoc))))
     (gnus-make-hashtable-from-newsrc-alist)
-    (when gnus-topic-alist
-      (setq gnus-topic-alist
-	    (mapcar
-	     (lambda (elt)
-	       (cons (car elt)
-		     (mapcar (lambda (g)
-			       (if (string-match-p "[^[:ascii:]]" g)
-				   (gnus-group-decoded-name g)
-				 g))
-			     (cdr elt))))
-	     gnus-topic-alist)))
     (when (file-newer-than-file-p file ding-file)
       ;; Old format quick file
       (gnus-message 5 "Reading %s..." file)
@@ -2893,26 +2878,6 @@ gnus-gnus-to-quick-newsrc-format
 		  ;; Remove the `gnus-killed-list' from the list of variables
 		  ;; to be saved, if required.
 		  (delq 'gnus-killed-list (copy-sequence gnus-variable-list)))))
-	   ;; Encode group names in `gnus-newsrc-alist' and
-	   ;; `gnus-topic-alist' in order to keep newsrc.eld files
-	   ;; compatible with older versions of Gnus.  At some point,
-	   ;; if/when a new version of Gnus is released, stop doing
-	   ;; this and move the corresponding decode in
-	   ;; `gnus-read-newsrc-el-file' into a conversion routine.
-	   (gnus-newsrc-alist
-	    (mapcar (lambda (info)
-		      (cons (encode-coding-string (car info) 'utf-8-emacs)
-			    (cdr info)))
-		    gnus-newsrc-alist))
-	   (gnus-topic-alist
-	    (when (memq 'gnus-topic-alist variables)
-	     (mapcar (lambda (elt)
-		       (cons (car elt) ; Topic name
-			     (mapcar (lambda (g)
-				       (encode-coding-string
-					g 'utf-8-emacs))
-				     (cdr elt))))
-		     gnus-topic-alist)))
 	   variable)
       ;; Insert the variables into the file.
       (while variables

  reply	other threads:[~2022-01-01  3:32 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-27  9:42 Gnus; Restore multi encoding support for NNTP LdBeth
2021-12-27 12:11 ` Lars Ingebrigtsen
2021-12-27 12:41   ` LdBeth
2021-12-27 12:57     ` Lars Ingebrigtsen
2021-12-27 13:58       ` LdBeth
2021-12-28  3:17         ` Eric Abrahamsen
2021-12-28 14:31           ` Lars Ingebrigtsen
2021-12-28 15:40             ` LdBeth
2021-12-28 14:29         ` Lars Ingebrigtsen
2021-12-28 15:43           ` LdBeth
2021-12-30 10:23         ` [PATCH] " LdBeth
2021-12-30 14:49           ` Lars Ingebrigtsen
2021-12-30 14:54             ` Eli Zaretskii
2021-12-30 15:18             ` LdBeth
2021-12-31 15:59               ` Lars Ingebrigtsen
2022-01-01  2:11                 ` LdBeth
2022-01-01  3:32                   ` LdBeth [this message]
2022-01-03 11:18                     ` Lars Ingebrigtsen
2022-01-03 11:25                       ` Lars Ingebrigtsen
2022-01-03 14:00                       ` LdBeth
2022-01-01  6:58                   ` Eli Zaretskii
2022-01-01  8:34                     ` LdBeth
2022-01-01  8:56                       ` Eli Zaretskii
2022-01-01  9:26                         ` LdBeth
2022-01-01  9:35                           ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tencent_2FBAB51CDD7A4430727412AC40FEFEDDD609@qq.com \
    --to=andpuke@foxmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=eric@ericabrahamsen.net \
    --cc=larsi@gnus.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.