GNU bug report logs - #73792
30; Confusion in loaddefs-generate--*-prefixes

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: Jonas Bernoulli <jonas@HIDDEN>; dated Sun, 13 Oct 2024 15:13:01 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 73792 <at> debbugs.gnu.org:


Received: (at 73792) by debbugs.gnu.org; 26 Oct 2024 17:42:26 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Oct 26 13:42:26 2024
Received: from localhost ([127.0.0.1]:42484 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1t4kny-00019R-0e
	for submit <at> debbugs.gnu.org; Sat, 26 Oct 2024 13:42:26 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:9681)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <monnier@HIDDEN>) id 1t4knv-000199-Mk
 for 73792 <at> debbugs.gnu.org; Sat, 26 Oct 2024 13:42:24 -0400
Received: from pmg2.iro.umontreal.ca (localhost.localdomain [127.0.0.1])
 by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id 6A6C1809CE;
 Sat, 26 Oct 2024 13:41:43 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1729964502;
 bh=G8XiSo8Q/XIXC6ryzQl9u9lZB30Wl5njZghEmm4sH/0=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=BHYTdo0EunZjio1OtF1jXcniztgHl+ijZq9a7uKoiKk3dZs3nXfhrFw4c4fCGg7Fg
 keXYQyuPQf3U0/hHpdgaAgC8pU2vknc+PksRYpGHYKyLAeFUxPEGavJjD90908+/p3
 9FwE5k+D4/jrf3cA0N/5aIqbAReOdoqVRANa9xTOGf8TQ9VrCv1FwkoolXqhCI7nIY
 +oO9hrLLAT0+mN7MqkJ5hwu/lPdlFMAPVHqRZxAXyEMH+MpSWJKqOrcqPJ7ojR7u3V
 0xC4KNzLL+vJnc8adOdvJp8x3e0tkIvfW9LNp7Bcp6f1vvmZVmmBO0lGKr3/AeaeSW
 i2XWFBI5X7F1g==
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg2.iro.umontreal.ca (Proxmox) with ESMTP id 77B7C80299;
 Sat, 26 Oct 2024 13:41:42 -0400 (EDT)
Received: from pastel (69-196-161-60.dsl.teksavvy.com [69.196.161.60])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 5185312037A;
 Sat, 26 Oct 2024 13:41:42 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: Jonas Bernoulli <jonas@HIDDEN>
Subject: Re: bug#73792: 30; Confusion in loaddefs-generate--*-prefixes
In-Reply-To: <87ldyaamil.fsf@HIDDEN> (Jonas Bernoulli's message of "Sat,
 26 Oct 2024 17:53:38 +0200")
Message-ID: <jwvmsiqsr7u.fsf-monnier+emacs@HIDDEN>
References: <87ttdgavfs.fsf@HIDDEN>
 <jwvy12fylmy.fsf-monnier+emacs@HIDDEN> <87ldyaamil.fsf@HIDDEN>
Date: Sat, 26 Oct 2024 13:41:41 -0400
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL 0.049 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 73792
Cc: 73792 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> (I was looking at this code to see if it could be used for this other
> use-case: collect all prefixes used by "all known" packages.  Such
> a prefix-to-package mapping could be published and checked when new
> packages are added to some *ELPA, to decrease the odds of conflicts
> on the symbol level.

This code tries to do pretty much that, so it's probably not a bad
starting point, indeed, at least as a way of discovering the adversary
you're about to take on.  =F0=9F=99=82


        Stefan





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#73792; Package emacs. Full text available.

Message received at 73792 <at> debbugs.gnu.org:


Received: (at 73792) by debbugs.gnu.org; 26 Oct 2024 15:54:20 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Oct 26 11:54:19 2024
Received: from localhost ([127.0.0.1]:42329 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1t4j7L-0004PP-G7
	for submit <at> debbugs.gnu.org; Sat, 26 Oct 2024 11:54:19 -0400
Received: from mail.hostpark.net ([212.243.197.30]:36796)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <jonas@HIDDEN>) id 1t4j7I-0004PF-UG
 for 73792 <at> debbugs.gnu.org; Sat, 26 Oct 2024 11:54:18 -0400
Received: from localhost (localhost [127.0.0.1])
 by mail.hostpark.net (Postfix) with ESMTP id 2D10716275;
 Sat, 26 Oct 2024 17:53:40 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=bernoul.li; h=
 content-type:content-type:mime-version:message-id:date:date
 :references:in-reply-to:subject:subject:from:from; s=sel2011a;
 t=1729958019; bh=WeOEp8ootxmq/frANCEnBzJa+dMqACBMPO5agfAvLmU=; b=
 HkgERjZ1lSGzfULWclMJQRUbnIF8dJ04btb/24Z+Ow3eHP2bnKTagC7gShXc0Z30
 5QEXh9G/u/GLNcjBpl96OMYJAiArxhY8eGKoWGEGX2t+AQGevnF5c5Cjm4s4cb+S
 oN/2y8s76pRI280O0UDH6UgOtXlRoNDAeqqb7ULjlls=
X-Virus-Scanned: by Hostpark/NetZone Mailprotection at hostpark.net
Received: from mail.hostpark.net ([127.0.0.1])
 by localhost (mail1.hostpark.net [127.0.0.1]) (amavisd-new, port 10224)
 with ESMTP id 9Qpyklbb6wKR; Sat, 26 Oct 2024 17:53:39 +0200 (CEST)
Received: from customer (localhost [127.0.0.1])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange ECDHE (prime256v1) server-signature RSA-PSS (2048 bits)
 server-digest SHA256) (No client certificate requested)
 by mail.hostpark.net (Postfix) with ESMTPSA id 41805161E1;
 Sat, 26 Oct 2024 17:53:38 +0200 (CEST)
From: Jonas Bernoulli <jonas@HIDDEN>
To: Stefan Monnier <monnier@HIDDEN>
Subject: Re: bug#73792: 30; Confusion in loaddefs-generate--*-prefixes
In-Reply-To: <jwvy12fylmy.fsf-monnier+emacs@HIDDEN>
References: <87ttdgavfs.fsf@HIDDEN> <jwvy12fylmy.fsf-monnier+emacs@HIDDEN>
Date: Sat, 26 Oct 2024 17:53:38 +0200
Message-ID: <87ldyaamil.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 73792
Cc: 73792 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

Stefan Monnier <monnier@HIDDEN> writes:

>> loaddefs-generate--compute-prefixes ignores definitions with an
>> autoload cookie:
>>
>> ,----
>> |             (when (save-excursion
>> |                     (goto-char (match-beginning 0))
>> |                     (or (bobp)
>> |                         (progn
>> |                           (forward-line -1)
>> |                           (not (looking-at ";;;###autoload")))))
>> |               (push name prefs))))))
>> `----
>>
>> Why?!
>
> The "symbol prefix" machinery is designed so as to try and give easier
> access to those things that Emacs wouldn't know about with it
> (i.e. symbols that exist "out there" in some installed packaged but
> aren't yet represented in `obarray`).
>
> Autoloaded functions are presumably already represented in `obarray`
> even if the file hasn't yet been loaded.  Admittedly, this is not 100%
> sure, but that's the reason why the code thinks it can ignore them.
>
> As for "why bother", well it turns out that it's not completely uncommon
> for a package's autoloaded functions to fall outside of the prefix
> shared by all other definitions, so skipping them can help improve the
> prefix.  Examples would be `run-foo` commands where all other functions
> use the `foo-` prefix, or even just the common `foo` entry point where
> all other definitions use the `foo-` prefix.

Makes sense.

(I was looking at this code to see if it could be used for this other
use-case: collect all prefixes used by "all known" packages.  Such
a prefix-to-package mapping could be published and checked when new
packages are added to some *ELPA, to decrease the odds of conflicts
on the symbol level.

I had little hope that this code would be suitable for that use-case,
but it could have been, so I had a look.  And then I figured I might
as well report the comment issue and ask about this.

I won't be working on this any time soon, since I have too much on my
plate already.  So if anyone with time on their hands reads this and
thinks it is a good idea, please go ahead.)

     Jonas




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#73792; Package emacs. Full text available.

Message received at 73792 <at> debbugs.gnu.org:


Received: (at 73792) by debbugs.gnu.org; 23 Oct 2024 14:07:12 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Oct 23 10:07:12 2024
Received: from localhost ([127.0.0.1]:60326 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1t3c11-00066b-7L
	for submit <at> debbugs.gnu.org; Wed, 23 Oct 2024 10:07:12 -0400
Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:6968)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <monnier@HIDDEN>) id 1t3c0y-00066M-HO
 for 73792 <at> debbugs.gnu.org; Wed, 23 Oct 2024 10:07:10 -0400
Received: from pmg1.iro.umontreal.ca (localhost.localdomain [127.0.0.1])
 by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id AA3021000C3;
 Wed, 23 Oct 2024 10:06:32 -0400 (EDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca;
 s=mail; t=1729692391;
 bh=bTGTCE5owsB27lGbP4X3EoUSA54LjoLVrtzyBD/L+qc=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date:From;
 b=QPDPBIzsUWL7sRmiOGGBzHdO/xUsfEek4CclNMeBNlRdk3Cy+QJi3vi//dgJW0tub
 xNIxKux0YhSrkehq+bbW5JZU2WFK7MqDK46iy6aBd4/OEDc9nel2kC/xBaKUyL/Fft
 tIfk19dxIHj51TdGHki20Yp5yCZXwC+pu4/EGj8mzWTAezZINtatm2hAdARJbLTesO
 FDTnUe7zKmnkz6IfHXf9k+UgWQ6GkU5h9TGw5lZSd3IzT9UuqyPQXgjgX5N0Yhk0aU
 U63m1mekv8o59UxCgwBQx0rM1pKf+MfReQCwLKjw44KDe9sSZkIopuBOG8fVg/Fb7b
 W7pwwJIX8Thbg==
Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1])
 by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id 4DE0C100042;
 Wed, 23 Oct 2024 10:06:31 -0400 (EDT)
Received: from pastel (69-196-161-60.dsl.teksavvy.com [69.196.161.60])
 by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 22373120E7D;
 Wed, 23 Oct 2024 10:06:31 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: Jonas Bernoulli <jonas@HIDDEN>
Subject: Re: bug#73792: 30; Confusion in loaddefs-generate--*-prefixes
In-Reply-To: <87ttdgavfs.fsf@HIDDEN> (Jonas Bernoulli's message of "Sun,
 13 Oct 2024 17:12:23 +0200")
Message-ID: <jwvy12fylmy.fsf-monnier+emacs@HIDDEN>
References: <87ttdgavfs.fsf@HIDDEN>
Date: Wed, 23 Oct 2024 10:06:29 -0400
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-SPAM-INFO: Spam detection results:  0
 ALL_TRUSTED                -1 Passed through trusted hosts only via SMTP
 AWL 0.071 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DKIM_SIGNED               0.1 Message has a DKIM or DK signature,
 not necessarily valid
 DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature
 DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's
 domain
 DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from
 domain
X-SPAM-LEVEL: 
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 73792
Cc: 73792 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

--=-=-=
Content-Type: text/plain

> This comment confused me
>
> ,----
> | (defun loaddefs-generate--make-prefixes (defs file)
> |   ;; Remove the defs that obey the rule that file foo.el (or
> |   ;; foo-mode.el) uses "foo-" as prefix.  Then compute a small set of
> |   ;; prefixes that cover all the remaining definitions.
> |   (let* ((tree (let ((tree radix-tree-empty))
> |                  (dolist (def defs)
> |                    (setq tree (radix-tree-insert tree def t)))
> |                  tree))
> |          (prefixes nil))
> `----
>
> as I could not see anything being removed here.
>
> Digging through history I learned this comment was lifted from older
> code shown below and removed in 1d4e90341782030cc7d8c29c639450b079587908,
> where it was followed by commented code that would actually have done
> that.

Yup, the comment applied to some earlier version of the code, sorry.

> And now for something completely different... (As in "here you might
> want to *add* a comment" ;P )
>
> loaddefs-generate--compute-prefixes ignores definitions with an
> autoload cookie:
>
> ,----
> |             (when (save-excursion
> |                     (goto-char (match-beginning 0))
> |                     (or (bobp)
> |                         (progn
> |                           (forward-line -1)
> |                           (not (looking-at ";;;###autoload")))))
> |               (push name prefs))))))
> `----
>
> Why?!

The "symbol prefix" machinery is designed so as to try and give easier
access to those things that Emacs wouldn't know about with it
(i.e. symbols that exist "out there" in some installed packaged but
aren't yet represented in `obarray`).

Autoloaded functions are presumably already represented in `obarray`
even if the file hasn't yet been loaded.  Admittedly, this is not 100%
sure, but that's the reason why the code thinks it can ignore them.

As for "why bother", well it turns out that it's not completely uncommon
for a package's autoloaded functions to fall outside of the prefix
shared by all other definitions, so skipping them can help improve the
prefix.  Examples would be `run-foo` commands where all other functions
use the `foo-` prefix, or even just the common `foo` entry point where
all other definitions use the `foo-` prefix.

> I might overlook something, but it seems that the old implementation
> in pre-1d4e90341782030cc7d8c29c639450b079587908 autoloads.el didn't
> do that.

I'm pretty sure it did (based on my recollection of the timing: most of
the experiments and design of the functionality happened before the
move to `loaddefs-gen.el`), tho I haven't bothered to look at the code.

BTW, I've played with a slightly different code, tho I haven't yet
finalized it.  See patch below.


        Stefan

--=-=-=
Content-Type: text/x-diff
Content-Disposition: inline; filename=loaddefs.patch

diff --git a/lisp/emacs-lisp/loaddefs-gen.el b/lisp/emacs-lisp/loaddefs-gen.el
index 50e90cdf94c..5ed8f60f241 100644
--- a/lisp/emacs-lisp/loaddefs-gen.el
+++ b/lisp/emacs-lisp/loaddefs-gen.el
@@ -90,7 +90,7 @@ generated-autoload-file
 The autoload file is assumed to contain a trailer starting with a
 FormFeed character.")
 ;;;###autoload
-(put 'generated-autoload-file 'safe-local-variable 'stringp)
+(put 'generated-autoload-file 'safe-local-variable #'stringp)
 
 (defvar generated-autoload-load-name nil
   "Load name for `autoload' statements generated from autoload cookies.
@@ -99,7 +99,7 @@ generated-autoload-load-name
 is not in `load-path'.
 This also affects the generated cus-load.el file.")
 ;;;###autoload
-(put 'generated-autoload-load-name 'safe-local-variable 'stringp)
+(put 'generated-autoload-load-name 'safe-local-variable #'stringp)
 
 (defun loaddefs-generate--file-load-name (file outfile)
   "Compute the name that will be used to load FILE.
@@ -325,54 +325,103 @@ loaddefs-generate--make-autoload
      ;; nil here indicates that this is not a special autoload form.
      (t nil))))
 
+(defvar loaddefs-generate-prefixes-limit 8
+  "Max number of prefixes registered per file.")
+
+(defvar loaddefs-generate-prefixes-generic
+  '("find-" "make-" "copy-" "define-" "global-" "batch-")
+  "Prefixes which are not specific enough.")
+
+(defvar loaddefs-generate-prefixes-ignore ()
+  "List of prefixes that are not worth registering.
+Meant to be used as a file-local variable.")
+
 (defun loaddefs-generate--make-prefixes (defs file)
-  ;; Remove the defs that obey the rule that file foo.el (or
-  ;; foo-mode.el) uses "foo-" as prefix.  Then compute a small set of
-  ;; prefixes that cover all the remaining definitions.
-  (let* ((tree (let ((tree radix-tree-empty))
-                 (dolist (def defs)
-                   (setq tree (radix-tree-insert tree def t)))
-                 tree))
-         (prefixes nil))
-    ;; Get the root prefixes, that we should include in any case.
-    (radix-tree-iter-subtrees
-     tree (lambda (prefix subtree)
-            (push (cons prefix subtree) prefixes)))
-    ;; In some cases, the root prefixes are too short, e.g. if you define
-    ;; "cc-helper" and "c-mode", you'll get "c" in the root prefixes.
-    (dolist (pair (prog1 prefixes (setq prefixes nil)))
-      (let ((s (car pair)))
-        (if (or (and (> (length s) 2)   ; Long enough!
-                     ;; But don't use "def" from deffoo-pkg-thing.
-                     (not (string= "def" s)))
-                (string-match ".[[:punct:]]\\'" s) ;A real (tho short) prefix?
-                (radix-tree-lookup (cdr pair) "")) ;Nothing to expand!
-            (push pair prefixes)                   ;Keep it as is.
-          (radix-tree-iter-subtrees
-           (cdr pair) (lambda (prefix subtree)
-                        (push (cons (concat s prefix) subtree) prefixes))))))
-    (when prefixes
-      (let ((strings
-             (mapcar
-              (lambda (x)
-                (let ((prefix (car x)))
-                  (if (or (> (length prefix) 2) ;Long enough!
-                          (and (eq (length prefix) 2)
-                               (string-match "[[:punct:]]" prefix)))
-                      prefix
-                    ;; Some packages really don't follow the rules.
-                    ;; Drop the most egregious cases such as the
-                    ;; one-letter prefixes.
-                    (let ((dropped ()))
-                      (radix-tree-iter-mappings
-                       (cdr x) (lambda (s _)
-                                 (push (concat prefix s) dropped)))
-                      (message "%s:0: Warning: Not registering prefix \"%s\".  Affects: %S"
-                               file prefix dropped)
-                      nil))))
-              prefixes)))
-        `(register-definition-prefixes ,file ',(sort (delq nil strings)
-						     'string<))))))
+  ;; FIXME: We should take advantage of (and encourage) the convention
+  ;; of using the same namespace prefix as the file name.
+  ;; (message "loaddefs-generate-prefixes-ignore in %S = %S"
+  ;;          file loaddefs-generate-prefixes-ignore)
+  (letrec
+      ;; First, convert the list of DEFS into a radix tree.
+      ((tree (let ((tree radix-tree-empty))
+               (dolist (def defs)
+                 (setq tree (radix-tree-insert tree def t)))
+               tree))
+       (valid-prefix-p ;; Avoid prefixes that are excessively generic.
+        (lambda (s)
+          (and (or (> (length s) 2)     ;Long enough!
+                   ;; A real (tho short) prefix?
+                   (string-match ".[[:punct:]]\\'" s))
+               ;; But avoid generic prefixes.
+               (let ((x (try-completion s loaddefs-generate-prefixes-generic)))
+                 (not (or (equal x s) (equal x t)))))))
+       (ignore-p
+        (lambda (s)
+          (or (not (listp loaddefs-generate-prefixes-ignore))
+              (let ((ignore nil))
+                (dolist (ignored-prefix loaddefs-generate-prefixes-ignore)
+                  (when (string-prefix-p ignored-prefix s)
+                    (setq ignore t)))
+                ignore))))
+       (ids ;; Convert a radix (sub)tree back into a list of identifiers.
+        (lambda (prefix tree)
+          (let ((ids '()))
+            (radix-tree-iter-mappings
+             tree (lambda (s _) (push (concat prefix s) ids)))
+            ids)))
+       (dropped '())   ;; List of prefixes that are rejected.
+       (valid-prefixes ;; Return possible valid prefixes of a (sub)tree.
+        (lambda (prefix tree)
+          (let ((prefixes '()))
+            (radix-tree-iter-subtrees
+             tree
+             (lambda (s subtree)
+               (setq s (concat prefix s))
+               (cond
+                ((funcall ignore-p s)) ;; Drop silently.
+                ((funcall valid-prefix-p s) (push (cons s subtree) prefixes))
+                ((radix-tree-lookup tree "") ;Nothing to expand!
+                 (push (cons s (funcall ids prefix subtree)) dropped))
+                (t
+                 (setq prefixes (nconc (funcall valid-prefixes s subtree)
+                                       prefixes))))))
+            prefixes)))
+       ;; Initial list of possible valid prefixes.
+       (prefixes (funcall valid-prefixes "" tree)))
+    (when (> (length prefixes) loaddefs-generate-prefixes-limit)
+      ;; The list is too long.  Throw out the prefixes that cover fewer
+      ;; identifiers: they're less useful (and they tend to be longer).
+      (let* ((sorted
+              (sort
+               (mapcar (lambda (x)
+                         (let ((prefix (car x)) (tree (cdr x)))
+                           (cons prefix (funcall ids prefix tree))))
+                       prefixes)
+               (lambda (x y) (> (length (cdr x)) (length (cdr y)))))))
+        (setq dropped (nconc (nthcdr loaddefs-generate-prefixes-limit sorted) dropped))
+        (setq prefixes (nreverse (take loaddefs-generate-prefixes-limit sorted)))
+        ;; Don't keep prefixes that contain no-more elements than dropped ones,
+        ;; so we're not affected by arbitrary ordering between subtrees.
+        (while (= (length (cdar prefixes)) (length (cdar dropped)))
+          (push (pop prefixes) dropped))))
+    (when dropped
+      (let ((ids (mapcan #'cdr dropped)))
+        (message "%s:0: Warning: Not registering %d prefixes (%d (%d%%) identifiers).
+Affected prefixes: %S"
+                 file (length dropped) (length ids)
+                 (/ (* (length ids) 100)
+                    (+ (length ids) (length (mapcan #'cdr prefixes))))
+                 (mapcar #'car dropped)))) ;;ids
+    (let ((expd (when dropped
+                  `(ignore "dropped-prefixes" ',(mapcar #'car dropped))))
+          (expr
+           (when prefixes
+             (let ((strings (mapcar #'car prefixes)))
+               `(register-definition-prefixes
+                 ,file ',(sort strings #'string<))))))
+      (if (and expd expr)
+          `(progn ,expr ,expd)
+        (or expd expr)))))
 
 (defun loaddefs-generate--parse-file (file main-outfile &optional package-data)
   "Examining FILE for ;;;###autoload statements.
@@ -386,45 +435,45 @@ loaddefs-generate--parse-file
 don't include."
   (let ((defs nil)
         (load-name (loaddefs-generate--file-load-name file main-outfile))
-        (compute-prefixes t)
         read-symbol-shorthands
-        local-outfile inhibit-autoloads)
+        local-outfile)
     (with-temp-buffer
       (insert-file-contents file)
       (goto-char (point-max))
       ;; We "open-code" this version of `hack-local-variables',
       ;; because it's really slow in bootstrap-emacs.
+      ;; FIXME: That fails to obey `dir-locals.el'!
       (when (search-backward ";; Local Variables:" (- (point-max) 1000) t)
-        (save-excursion
-          (when (re-search-forward "generated-autoload-file: *" nil t)
-            ;; Buffer-local file that should be interpreted relative to
-            ;; the .el file.
-            (setq local-outfile (expand-file-name (read (current-buffer))
-                                                  (file-name-directory file)))))
-        (save-excursion
-          (when (re-search-forward "generated-autoload-load-name: *" nil t)
-            (setq load-name (read (current-buffer)))))
-        (save-excursion
-          (when (re-search-forward "no-update-autoloads: *" nil t)
-            (setq inhibit-autoloads (read (current-buffer)))))
-        (save-excursion
-          (when (re-search-forward "autoload-compute-prefixes: *" nil t)
-            (setq compute-prefixes (read (current-buffer)))))
-        (save-excursion
-          ;; Since we're "open-coding", we have to repeat more
-          ;; complicated logic in `hack-local-variables'.
-          (when-let ((beg
-                      (re-search-forward "read-symbol-shorthands: *" nil t)))
-            ;; `read-symbol-shorthands' alist ends with two parens.
-            (let* ((end (re-search-forward ")[;\n\s]*)"))
-                   (commentless (replace-regexp-in-string
-                                 "\n\\s-*;+" ""
-                                 (buffer-substring beg end)))
-                   (unsorted-shorthands (car (read-from-string commentless))))
-              (setq read-symbol-shorthands
-                    (sort unsorted-shorthands
-                          (lambda (sh1 sh2)
-                            (> (length (car sh1)) (length (car sh2))))))))))
+        (while (re-search-forward
+                (concat (regexp-opt
+                         '("generated-autoload-file"
+                           "generated-autoload-load-name"
+                           "no-update-autoloads"
+                           "autoload-compute-prefixes"
+                           "read-symbol-shorthands"
+                           "loaddefs-generate-prefixes-ignore")
+                         t)
+                 ": *")
+                nil t)
+          (condition-case err
+              (set (make-local-variable (intern (match-string 1)))
+                   (read (current-buffer)))
+            (error
+             (message "Error while reading local var %S: %S"
+                      (match-string 1) err))))
+        (when (local-variable-p 'generated-autoload-file)
+          ;; Buffer-local file that should be interpreted relative to
+          ;; the .el file.
+          (setq local-outfile (expand-file-name generated-autoload-file
+                                                (file-name-directory file))))
+        (when (local-variable-p 'generated-autoload-load-name)
+          (setq load-name generated-autoload-load-name))
+        (when (local-variable-p 'read-symbol-shorthands)
+          ;; Duplicate the logic in `hack-local-variables--find-variables'.
+          (setq read-symbol-shorthands
+                (sort read-symbol-shorthands
+                      (lambda (sh1 sh2)
+                        (> (length (car sh1)) (length (car sh2))))))))
 
       ;; We always return the package version (even for pre-dumped
       ;; files).
@@ -446,7 +495,7 @@ loaddefs-generate--parse-file
                   defs))))
 
       ;; Obey the `no-update-autoloads' file local variable.
-      (when (and (not inhibit-autoloads)
+      (when (and (not no-update-autoloads)
                  (not (eq package-data 'only)))
         (goto-char (point-min))
         ;; The cookie might be like ;;;###tramp-autoload...
@@ -496,8 +545,7 @@ loaddefs-generate--parse-file
                             (buffer-substring (point) (line-end-position)))
                       defs)))))
 
-        (when (and autoload-compute-prefixes
-                   compute-prefixes)
+        (when autoload-compute-prefixes
           (with-demoted-errors "%S"
             (when-let
                 ((form (loaddefs-generate--compute-prefixes load-name)))

--=-=-=--





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#73792; Package emacs. Full text available.

Message received at 73792 <at> debbugs.gnu.org:


Received: (at 73792) by debbugs.gnu.org; 13 Oct 2024 15:50:08 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Oct 13 11:50:08 2024
Received: from localhost ([127.0.0.1]:52149 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1t00r9-0001zr-Qe
	for submit <at> debbugs.gnu.org; Sun, 13 Oct 2024 11:50:08 -0400
Received: from eggs.gnu.org ([209.51.188.92]:50874)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <eliz@HIDDEN>) id 1t00r8-0001zF-17
 for 73792 <at> debbugs.gnu.org; Sun, 13 Oct 2024 11:50:06 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1t00ql-0002DV-GY; Sun, 13 Oct 2024 11:49:43 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date:
 mime-version; bh=wVurIVeHuOGuKxJ2mT4sIb4ZphNdiTeXUKr2/6jByqs=; b=O31xy8asVbh6
 tKFB7kA5VhFyrLXpwSXSpkZAQK54POEc18fMYEiFwKcnoBhYf9q1g5/ixNauPyDvJLOL96up9QD7i
 x4/P4lvFzlhCoscKgN5YXqKDoYE4kPVXH54LneNOzb/3CXMtEdFE0wzfS+VzbnZERPhyqBp5hlEiI
 FS4ygeJCBYJjsFeAQlfr67/hlfm+ns7xNUrn79WKp6Lc3HxFIQvFUhHpIA6keUJTxhKcrxl660Kz3
 AOfO1jJhgNTwFyrFPpTwGXpsofCIDgkPb0vJ+RB2H41vveEWMCvOwueNVjtugmBfBDB0/mrZnvp9n
 0YjIwbXUKEmol3usoyfNHQ==;
Date: Sun, 13 Oct 2024 18:49:40 +0300
Message-Id: <86frp0t33f.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: Jonas Bernoulli <jonas@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Stefan Monnier <monnier@HIDDEN>
In-Reply-To: <87ttdgavfs.fsf@HIDDEN> (bug-gnu-emacs@HIDDEN)
Subject: Re: bug#73792: 30; Confusion in loaddefs-generate--*-prefixes
References: <87ttdgavfs.fsf@HIDDEN>
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 73792
Cc: 73792 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Date: Sun, 13 Oct 2024 17:12:23 +0200
> From:  Jonas Bernoulli via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <bug-gnu-emacs@HIDDEN>
> 
> Hello,
> 
> This comment confused me
> 
> ,----
> | (defun loaddefs-generate--make-prefixes (defs file)
> |   ;; Remove the defs that obey the rule that file foo.el (or
> |   ;; foo-mode.el) uses "foo-" as prefix.  Then compute a small set of
> |   ;; prefixes that cover all the remaining definitions.
> |   (let* ((tree (let ((tree radix-tree-empty))
> |                  (dolist (def defs)
> |                    (setq tree (radix-tree-insert tree def t)))
> |                  tree))
> |          (prefixes nil))
> `----
> 
> as I could not see anything being removed here.
> 
> Digging through history I learned this comment was lifted from older
> code shown below and removed in 1d4e90341782030cc7d8c29c639450b079587908,
> where it was followed by commented code that would actually have done
> that.
> 
> ,----
> | (defun autoload--make-defs-autoload (defs file)
> | 
> |   ;; Remove the defs that obey the rule that file foo.el (or
> |   ;; foo-mode.el) uses "foo-" as prefix.
> |   ;; FIXME: help--symbol-completion-table still doesn't know how to use
> |   ;; the rule that file foo.el (or foo-mode.el) uses "foo-" as prefix.
> |   ;;(let ((prefix
> |   ;;       (concat (substring file 0 (string-match "-mode\\'" file)) "-")))
> |   ;;  (dolist (def (prog1 defs (setq defs nil)))
> |   ;;    (unless (string-prefix-p prefix def)
> |   ;;      (push def defs))))
> | 
> |   ;; Then compute a small set of prefixes that cover all the
> |   ;; remaining definitions.
> `----
> 
> Thus, the first sentence (and the following "Then") should be removed
> from the new comment.
> 
> ----
> And now for something completely different... (As in "here you might
> want to *add* a comment" ;P )
> 
> loaddefs-generate--compute-prefixes ignores definitions with an
> autoload cookie:
> 
> ,----
> |             (when (save-excursion
> |                     (goto-char (match-beginning 0))
> |                     (or (bobp)
> |                         (progn
> |                           (forward-line -1)
> |                           (not (looking-at ";;;###autoload")))))
> |               (push name prefs))))))
> `----
> 
> Why?!
> 
> I might overlook something, but it seems that the old implementation
> in pre-1d4e90341782030cc7d8c29c639450b079587908 autoloads.el didn't
> do that.

I've added people who might know the answers.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#73792; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 13 Oct 2024 15:12:55 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Oct 13 11:12:54 2024
Received: from localhost ([127.0.0.1]:52074 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1t00H8-0008S4-61
	for submit <at> debbugs.gnu.org; Sun, 13 Oct 2024 11:12:54 -0400
Received: from lists.gnu.org ([209.51.188.17]:54858)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <jonas@HIDDEN>) id 1t00H5-0008Rv-Ui
 for submit <at> debbugs.gnu.org; Sun, 13 Oct 2024 11:12:52 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <jonas@HIDDEN>) id 1t00Gp-0001Xp-QQ
 for bug-gnu-emacs@HIDDEN; Sun, 13 Oct 2024 11:12:35 -0400
Received: from mail.hostpark.net ([212.243.197.30])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <jonas@HIDDEN>) id 1t00Gn-0006a7-70
 for bug-gnu-emacs@HIDDEN; Sun, 13 Oct 2024 11:12:35 -0400
Received: from localhost (localhost [127.0.0.1])
 by mail.hostpark.net (Postfix) with ESMTP id 32863164CE
 for <bug-gnu-emacs@HIDDEN>; Sun, 13 Oct 2024 17:12:26 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=bernoul.li; h=
 content-type:content-type:mime-version:message-id:date:date
 :subject:subject:from:from; s=sel2011a; t=1728832345; bh=0Edwdnk
 mRNw5/byBz3ZPLIbfk23soybF/EkBQ2Y9l5E=; b=q+3mzX0bbTiZR1lXj15nBI9
 G59bIWPHcxB34gEAbhVw7BoSVj5CDEoZ1GDkyyKWddfgvCMswixGj9bJJSUgpIIN
 yjvMXhcc1aIGKURE8uOjY0rYAJnPnGoBnNTINtflvTf+qGH/D+XN3bp1wVmup4wB
 NDjPFxHOqU9W1FhyHloY=
X-Virus-Scanned: by Hostpark/NetZone Mailprotection at hostpark.net
Received: from mail.hostpark.net ([127.0.0.1])
 by localhost (mail0.hostpark.net [127.0.0.1]) (amavisd-new, port 10224)
 with ESMTP id YiYI1cxDClDo for <bug-gnu-emacs@HIDDEN>;
 Sun, 13 Oct 2024 17:12:25 +0200 (CEST)
Received: from customer (localhost [127.0.0.1])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange ECDHE (prime256v1) server-signature RSA-PSS (2048 bits)
 server-digest SHA256) (No client certificate requested)
 by mail.hostpark.net (Postfix) with ESMTPSA id E4C6C1649F
 for <bug-gnu-emacs@HIDDEN>; Sun, 13 Oct 2024 17:12:25 +0200 (CEST)
From: Jonas Bernoulli <jonas@HIDDEN>
To: bug-gnu-emacs@HIDDEN
Subject: 30; Confusion in loaddefs-generate--*-prefixes
Date: Sun, 13 Oct 2024 17:12:23 +0200
Message-ID: <87ttdgavfs.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
Received-SPF: pass client-ip=212.243.197.30; envelope-from=jonas@HIDDEN;
 helo=mail.hostpark.net
X-Spam_score_int: -27
X-Spam_score: -2.8
X-Spam_bar: --
X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,
 RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01,
 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001,
 SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: -1.4 (-)
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.4 (--)

Hello,

This comment confused me

,----
| (defun loaddefs-generate--make-prefixes (defs file)
|   ;; Remove the defs that obey the rule that file foo.el (or
|   ;; foo-mode.el) uses "foo-" as prefix.  Then compute a small set of
|   ;; prefixes that cover all the remaining definitions.
|   (let* ((tree (let ((tree radix-tree-empty))
|                  (dolist (def defs)
|                    (setq tree (radix-tree-insert tree def t)))
|                  tree))
|          (prefixes nil))
`----

as I could not see anything being removed here.

Digging through history I learned this comment was lifted from older
code shown below and removed in 1d4e90341782030cc7d8c29c639450b079587908,
where it was followed by commented code that would actually have done
that.

,----
| (defun autoload--make-defs-autoload (defs file)
| 
|   ;; Remove the defs that obey the rule that file foo.el (or
|   ;; foo-mode.el) uses "foo-" as prefix.
|   ;; FIXME: help--symbol-completion-table still doesn't know how to use
|   ;; the rule that file foo.el (or foo-mode.el) uses "foo-" as prefix.
|   ;;(let ((prefix
|   ;;       (concat (substring file 0 (string-match "-mode\\'" file)) "-")))
|   ;;  (dolist (def (prog1 defs (setq defs nil)))
|   ;;    (unless (string-prefix-p prefix def)
|   ;;      (push def defs))))
| 
|   ;; Then compute a small set of prefixes that cover all the
|   ;; remaining definitions.
`----

Thus, the first sentence (and the following "Then") should be removed
from the new comment.

----
And now for something completely different... (As in "here you might
want to *add* a comment" ;P )

loaddefs-generate--compute-prefixes ignores definitions with an
autoload cookie:

,----
|             (when (save-excursion
|                     (goto-char (match-beginning 0))
|                     (or (bobp)
|                         (progn
|                           (forward-line -1)
|                           (not (looking-at ";;;###autoload")))))
|               (push name prefs))))))
`----

Why?!

I might overlook something, but it seems that the old implementation
in pre-1d4e90341782030cc7d8c29c639450b079587908 autoloads.el didn't
do that.

     Cheers,
     Jonas




Acknowledgement sent to Jonas Bernoulli <jonas@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#73792; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Sun, 12 Jan 2025 05:45:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.