all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
@ 2022-06-09 18:56 chad
  2022-06-09 19:20 ` Drew Adams
  2022-06-09 20:07 ` Lars Ingebrigtsen
  0 siblings, 2 replies; 13+ messages in thread
From: chad @ 2022-06-09 18:56 UTC (permalink / raw)
  To: 55877


[-- Attachment #1.1: Type: text/plain, Size: 4358 bytes --]

From emacs -Q, call list-directory ('C-x C-d'), and specify a glob
pattern, such as "/usr/local/src/emacs/lisp/*.el". Emacs will accept
this as the argument when called from lisp (following the behavior
described in the docstring), but will not accept it interactively. This
is due to passing t as the fourth (MUSTMATCH) argument to read-file-name
inside list-directory. I believe that this should instead be 'confirm. I
have tested the small attached patch for a couple weeks with no trouble.
In case there is a problem with the attached patch via gmail, the
change is around line 7385 of lisp/files.el:

      (list (read-file-name
>              (if pfx "List directory (verbose): "
>               "List directory (brief): ")
> -           nil default-directory t
> +           nil default-directory 'confirm
>              nil
>              (lambda (file)
>                (or (file-directory-p file)


This is a tiny change, and also I have assigned copyright papers on
file from past work on MH-e many moons ago, I believe under
"yandros@mit.edu" (which has, sadly, moved to MS Exchange in the years
since).

Thanks,
~Chad

In GNU Emacs 29.0.50 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.24,
cairo version 1.16.0)
 of 2022-06-09 built on penguin
Repository revision: 0e401fa2670210c7a5c4424ef6ec6896fff7486e
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12008000
System Description: Debian GNU/Linux 11 (bullseye)

Configured using:
 'configure --with-native-compilation --with-gnutls --without-xwidgets
 --without-pop'

Configured features:
CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON
LIBOTF LIBSELINUX LIBXML2 M17N_FLT MODULES NATIVE_COMP NOTIFY INOTIFY
PDUMPER PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS
X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB

Important settings:
  value of $LC_COLLATE: C
  value of $LC_CTYPE: en_US.UTF-8
  value of $LC_MESSAGES: en_US.UTF-8
  value of $LC_NUMERIC: en_US.UTF-8
  value of $LC_TIME: en_US.UTF-8
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  line-number-mode: t
  indent-tabs-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message mailcap yank-media rmc puny
dired dired-loaddefs rfc822 mml mml-sec password-cache epa derived epg
rfc6068 epg-config gnus-util text-property-search time-date seq gv
subr-x byte-opt bytecomp byte-compile cconv mm-decode mm-bodies
mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader cl-loaddefs
cl-lib sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils
iso-transl tooltip eldoc paren electric uniquify ediff-hook vc-hooks
lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd
tool-bar dnd fontset image regexp-opt fringe tabulated-list replace
newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar
rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock
font-lock syntax font-core term/tty-colors frame minibuffer nadvice
simple cl-generic indonesian philippine cham georgian utf-8-lang
misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms
cp51932 hebrew greek romanian slovak czech european ethiopic indian
cyrillic chinese composite emoji-zwj charscript charprop case-table
epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button
loaddefs faces cus-face macroexp files window text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads dbusbind inotify
dynamic-setting system-font-setting font-render-setting cairo
move-toolbar gtk x-toolkit xinput2 x multi-tty make-network-process
native-compile emacs)

Memory information:
((conses 16 56606 9544)
 (symbols 48 5724 0)
 (strings 32 16248 1701)
 (string-bytes 1 530792)
 (vectors 16 11364)
 (vector-slots 8 223293 17601)
 (floats 8 21 37)
 (intervals 56 234 3)
 (buffers 992 11))

[-- Attachment #1.2: Type: text/html, Size: 5065 bytes --]

[-- Attachment #2: 0001-Tweak-list-directory.patch --]
[-- Type: application/octet-stream, Size: 734 bytes --]

From 9f6bf3a58d3bc558d1d38111a0f9b6460cc84714 Mon Sep 17 00:00:00 2001
From: Chad Brown <yandros@gmail.com>
Date: Mon, 23 May 2022 14:49:38 -0400
Subject: [PATCH] Tweak list-directory to allow globbing on interactive use.

---
 lisp/files.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lisp/files.el b/lisp/files.el
index a505f62af8..0277a76e4c 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -7385,7 +7385,7 @@ list-directory
      (list (read-file-name
             (if pfx "List directory (verbose): "
 	      "List directory (brief): ")
-	    nil default-directory t
+	    nil default-directory 'confirm
             nil
             (lambda (file)
               (or (file-directory-p file)
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-09 18:56 bug#55877: 29.0.50; list-directory doesn't allow globbing interactively chad
@ 2022-06-09 19:20 ` Drew Adams
  2022-06-09 20:07 ` Lars Ingebrigtsen
  1 sibling, 0 replies; 13+ messages in thread
From: Drew Adams @ 2022-06-09 19:20 UTC (permalink / raw)
  To: chad, 55877@debbugs.gnu.org

I don't see that, or I don't understand what you're describing.

When I do `M-x list-directory *.el' it lists the *.el matches.

But I'm not using Emacs 29.  Maybe there's a regression?

^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-09 18:56 bug#55877: 29.0.50; list-directory doesn't allow globbing interactively chad
  2022-06-09 19:20 ` Drew Adams
@ 2022-06-09 20:07 ` Lars Ingebrigtsen
  2022-06-10  8:22   ` Lars Ingebrigtsen
  1 sibling, 1 reply; 13+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-09 20:07 UTC (permalink / raw)
  To: chad; +Cc: 55877

chad <yandros@gmail.com> writes:

> From emacs -Q, call list-directory ('C-x C-d'), and specify a glob
> pattern, such as "/usr/local/src/emacs/lisp/*.el". Emacs will accept
> this as the argument when called from lisp (following the behavior
> described in the docstring), but will not accept it interactively. This
> is due to passing t as the fourth (MUSTMATCH) argument to read-file-name
> inside list-directory. I believe that this should instead be 'confirm.

The code (introduced in ec3b6fa8e18a) tries to require that the user has
either typed an existing directory, or that it's a wildcard spec.  But
it does this in the wrong way -- and it does this misguided thing wrong,
anyway.  :-/

I'll try to fix it some other way.  Just changing the t to confirm
doesn't really help, because then you can type in non-existing
directories.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-09 20:07 ` Lars Ingebrigtsen
@ 2022-06-10  8:22   ` Lars Ingebrigtsen
  2022-06-10 21:04     ` chad
  0 siblings, 1 reply; 13+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-10  8:22 UTC (permalink / raw)
  To: chad; +Cc: 55877

Lars Ingebrigtsen <larsi@gnus.org> writes:

> I'll try to fix it some other way.  Just changing the t to confirm
> doesn't really help, because then you can type in non-existing
> directories.

I've now fixed this in Emacs 29.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-10  8:22   ` Lars Ingebrigtsen
@ 2022-06-10 21:04     ` chad
  2022-06-11  1:31       ` chad
  0 siblings, 1 reply; 13+ messages in thread
From: chad @ 2022-06-10 21:04 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55877

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

On Fri, Jun 10, 2022 at 4:22 AM Lars Ingebrigtsen <larsi@gnus.org> wrote:

> Lars Ingebrigtsen <larsi@gnus.org> writes:
>
> > I'll try to fix it some other way.  Just changing the t to confirm
> > doesn't really help, because then you can type in non-existing
> > directories.
>

That's fair. I haven't noticed a problem with it in practice, since there's
an extra confirmation step if you try to give it a non-existent dir, and I
don't tend to make directories with globs in the filenames. :-)


> I've now fixed this in Emacs 29.
>

Danke mucho.

~Chad

[-- Attachment #2: Type: text/html, Size: 1134 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-10 21:04     ` chad
@ 2022-06-11  1:31       ` chad
  2022-06-11 11:02         ` Lars Ingebrigtsen
  0 siblings, 1 reply; 13+ messages in thread
From: chad @ 2022-06-11  1:31 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55877

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

I thought I saw an error here when list-directory with a directory (not
file) glob (ex: ~/Project/emacs/*/) is followed by another list-directory,
but I think the actual issue is that the default directory in the first
case is set to something that doesn't exist, which messes up call-process
in the second invocation of list-directory. The error I saw was:

Debugger entered--Lisp error: (file-missing "Setting current directory" "No
> such file or directory" "/home/chadpbrown/Project/emacs/*/")
>   call-process("ls" nil t nil "-CF" "--"
> "/home/chadpbrown/Project/emacs/src/")
>   insert-directory("/home/chadpbrown/Project/emacs/src/" "-CF" nil t)
>   list-directory("~/Project/emacs/src/" nil)
>   funcall-interactively(list-directory "~/Project/emacs/src/" nil)
>   call-interactively(list-directory nil nil)
>   command-execute(list-directory)


I'm not sure it's worth the overhead to fix this. I'm testing a small
change that replaced default-directory in list-directory
(lisp/files.el:7387) with

            (if (file-exists-p default-directory)
                default-directory
              user-emacs-directory)

..but it feels like a hack?

~Chad

[-- Attachment #2: Type: text/html, Size: 1787 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-11  1:31       ` chad
@ 2022-06-11 11:02         ` Lars Ingebrigtsen
  2022-06-11 16:38           ` chad
  0 siblings, 1 reply; 13+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-11 11:02 UTC (permalink / raw)
  To: chad; +Cc: 55877

chad <yandros@gmail.com> writes:

> I thought I saw an error here when list-directory with a directory (not file) glob (ex: ~
> /Project/emacs/*/) is followed by another list-directory, but I think the actual issue is
> that the default directory in the first case is set to something that doesn't exist, which
> messes up call-process in the second invocation of list-directory. The error I saw was:
>
>  Debugger entered--Lisp error: (file-missing "Setting current directory" "No such
>  file or directory" "/home/chadpbrown/Project/emacs/*/")
>    call-process("ls" nil t nil "-CF" "--" "/home/chadpbrown/Project/emacs/src/")
>    insert-directory("/home/chadpbrown/Project/emacs/src/" "-CF" nil t)
>    list-directory("~/Project/emacs/src/" nil)
>    funcall-interactively(list-directory "~/Project/emacs/src/" nil)
>    call-interactively(list-directory nil nil)
>    command-execute(list-directory)

I'm unable to reproduce this -- if I say `C-x C-d /tmp/*/ RET' it works
fine for me...

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-11 11:02         ` Lars Ingebrigtsen
@ 2022-06-11 16:38           ` chad
  2022-06-11 16:55             ` Eli Zaretskii
  0 siblings, 1 reply; 13+ messages in thread
From: chad @ 2022-06-11 16:38 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55877

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

On Sat, Jun 11, 2022 at 7:02 AM Lars Ingebrigtsen <larsi@gnus.org> wrote:

> chad <yandros@gmail.com> writes:
>
> > I thought I saw an error here when list-directory with a directory (not
> file) glob (ex: ~
> > /Project/emacs/*/) is followed by another list-directory, but I think
> the actual issue is
> > that the default directory in the first case is set to something that
> doesn't exist, which
> > messes up call-process in the second invocation of list-directory. The
> error I saw was:
> >[...]
> I'm unable to reproduce this -- if I say `C-x C-d /tmp/*/ RET' it works
> fine for me...
>

Sorry, I was probably unclear, and my earlier hack-around was no good. The
first call to list-directory works fine. It's the followup, issued from the
buffer of the first, that raises the problem, because default-directory in
the buffer of the first call is set to, in your example, /tmp/*/, and
call-process balks when default-directory doesn't exist.  To repeat, from a
fresh emacs -Q:

`C-x C-d /tmp/*/ RET C-x 0 C-x C-d /tmp/ RET'.

I see "insert-directory: Setting current directory: No such file or
directory, /tmp/*/" in *Messages* in emacs -Q. (In practice, with a fresh
emacs -Q, sometimes I also get the same error from comp-run-async-workers,
if it triggers when I'm in that buffer, which was a surprise.)

I suspect this is due to the explicit setting of default-directory at the
end of list-directory:

>    ;; Finishing with-output-to-temp-buffer seems to clobber
default-directory.
>    (with-current-buffer buffer
>       (setq default-directory
>               (if (file-directory-p dirname)
>                   (file-name-as-directory dirname)
>                  (file-name-directory dirname))))

In the above test case, dirname ends up as "/tmp/*/", which falls through
file-directory-p and ends up passed to file-name-directory, which just
returns it unchanged under unix, because of the trailing slash. This is a
mirror to the logic up-function that checks for wildcards
(insert-directory-wildcard-in-dir-p, etc). I considered ways to pass down
that information or recreate it, but I don't (yet?) have a better answer
for what value it should have than "something safe" or "try to munge the
wildcard into an existing directory", which seems terrible. Maybe the right
answer is to not setq default-directory at all unless dirname is
file-directory-p?

Thanks,
~Chad

[-- Attachment #2: Type: text/html, Size: 3192 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-11 16:38           ` chad
@ 2022-06-11 16:55             ` Eli Zaretskii
  2022-06-11 17:03               ` chad
  0 siblings, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2022-06-11 16:55 UTC (permalink / raw)
  To: chad; +Cc: larsi, 55877

> Cc: 55877@debbugs.gnu.org
> From: chad <yandros@gmail.com>
> Date: Sat, 11 Jun 2022 12:38:53 -0400
> 
> Sorry, I was probably unclear, and my earlier hack-around was no good. The first call to list-directory works
> fine. It's the followup, issued from the buffer of the first, that raises the problem, because default-directory in
> the buffer of the first call is set to, in your example, /tmp/*/, and call-process balks when default-directory
> doesn't exist.  To repeat, from a fresh emacs -Q:
> 
> `C-x C-d /tmp/*/ RET C-x 0 C-x C-d /tmp/ RET'.
> 
> I see "insert-directory: Setting current directory: No such file or directory, /tmp/*/" in *Messages* in emacs
> -Q. (In practice, with a fresh emacs -Q, sometimes I also get the same error from
> comp-run-async-workers, if it triggers when I'm in that buffer, which was a surprise.) 
> 
> I suspect this is due to the explicit setting of default-directory at the end of list-directory:
> 
> >    ;; Finishing with-output-to-temp-buffer seems to clobber default-directory.
> >    (with-current-buffer buffer
> >       (setq default-directory
> >               (if (file-directory-p dirname)
> >                   (file-name-as-directory dirname)
> >                  (file-name-directory dirname))))
> 
> In the above test case, dirname ends up as "/tmp/*/", which falls through file-directory-p and ends up passed
> to file-name-directory, which just returns it unchanged under unix, because of the trailing slash. This is a
> mirror to the logic up-function that checks for wildcards (insert-directory-wildcard-in-dir-p, etc). I considered
> ways to pass down that information or recreate it, but I don't (yet?) have a better answer for what value it
> should have than "something safe" or "try to munge the wildcard into an existing directory", which seems
> terrible. Maybe the right answer is to not setq default-directory at all unless dirname is file-directory-p?

Does the below fix the problem?

diff --git a/lisp/files.el b/lisp/files.el
index 75a856c..aacc1cd 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -7406,9 +7406,9 @@ list-directory
     ;; Finishing with-output-to-temp-buffer seems to clobber default-directory.
     (with-current-buffer buffer
       (setq default-directory
-	    (if (file-directory-p dirname)
+	    (if (file-accessible-directory-p dirname)
 		(file-name-as-directory dirname)
-	      (file-name-directory dirname))))))
+	      (file-name-directory (directory-file-name dirname)))))))
 
 (defun shell-quote-wildcard-pattern (pattern)
   "Quote characters special to the shell in PATTERN, leave wildcards alone.





^ permalink raw reply related	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-11 16:55             ` Eli Zaretskii
@ 2022-06-11 17:03               ` chad
  2022-06-11 17:05                 ` Eli Zaretskii
  0 siblings, 1 reply; 13+ messages in thread
From: chad @ 2022-06-11 17:03 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Lars Ingebrigtsen, 55877

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

On Sat, Jun 11, 2022 at 12:55 PM Eli Zaretskii <eliz@gnu.org> wrote:

> [...]
> Does the below fix the problem?
>

Yes, it fixes the problem for me under GNU/Linux.

Thank you,
~Chad

[-- Attachment #2: Type: text/html, Size: 555 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-11 17:03               ` chad
@ 2022-06-11 17:05                 ` Eli Zaretskii
  2022-06-12  9:59                   ` Lars Ingebrigtsen
  0 siblings, 1 reply; 13+ messages in thread
From: Eli Zaretskii @ 2022-06-11 17:05 UTC (permalink / raw)
  To: chad; +Cc: larsi, 55877

> From: chad <yandros@gmail.com>
> Date: Sat, 11 Jun 2022 13:03:21 -0400
> Cc: Lars Ingebrigtsen <larsi@gnus.org>, 55877@debbugs.gnu.org
> 
> On Sat, Jun 11, 2022 at 12:55 PM Eli Zaretskii <eliz@gnu.org> wrote:
> 
>  [...]
>  Does the below fix the problem?
> 
> Yes, it fixes the problem for me under GNU/Linux.

Thanks for testing.

Lars, are you okay with the change I proposed?





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-11 17:05                 ` Eli Zaretskii
@ 2022-06-12  9:59                   ` Lars Ingebrigtsen
  2022-06-12 10:04                     ` Eli Zaretskii
  0 siblings, 1 reply; 13+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-12  9:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: chad, 55877

Eli Zaretskii <eliz@gnu.org> writes:

> Lars, are you okay with the change I proposed?

Looks fine to me.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 13+ messages in thread

* bug#55877: 29.0.50; list-directory doesn't allow globbing interactively
  2022-06-12  9:59                   ` Lars Ingebrigtsen
@ 2022-06-12 10:04                     ` Eli Zaretskii
  0 siblings, 0 replies; 13+ messages in thread
From: Eli Zaretskii @ 2022-06-12 10:04 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55877-done, yandros

> From: Lars Ingebrigtsen <larsi@gnus.org>
> Cc: chad <yandros@gmail.com>,  55877@debbugs.gnu.org
> Date: Sun, 12 Jun 2022 11:59:43 +0200
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > Lars, are you okay with the change I proposed?
> 
> Looks fine to me.

Thanks, installed on master.





^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2022-06-12 10:04 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-06-09 18:56 bug#55877: 29.0.50; list-directory doesn't allow globbing interactively chad
2022-06-09 19:20 ` Drew Adams
2022-06-09 20:07 ` Lars Ingebrigtsen
2022-06-10  8:22   ` Lars Ingebrigtsen
2022-06-10 21:04     ` chad
2022-06-11  1:31       ` chad
2022-06-11 11:02         ` Lars Ingebrigtsen
2022-06-11 16:38           ` chad
2022-06-11 16:55             ` Eli Zaretskii
2022-06-11 17:03               ` chad
2022-06-11 17:05                 ` Eli Zaretskii
2022-06-12  9:59                   ` Lars Ingebrigtsen
2022-06-12 10:04                     ` Eli Zaretskii

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.