Subject: bug#66534: 30.0.50; [PATCH] Expand file-name of ~/.emacs before attempt to load it

From: Christoph <[email-masked]>
Date: Fri, 13 Oct 2023 20:41:16 +0200

Hi,

I noticed that during startup, emacs tries to load ~/.emacs (with
different extensions) many times over.  You can see this by using
strace and tracing the openat syscall.  The problem is, that `load'
does not expand the ~/ in the filename passed to it.  So it does not
recognize the file as being absolute and tries to resolve it using
the load-path.

While resolving the path in the openp function in lread.c,
`expand-file-name' is used with the default directory being the
elements of the load-path.  Since for `expand-file-name', ~/.emacs is
an absolute path, it returns the path unchanged, and load tries to
load ~/.emacs many times over.  I am not sure if the behavior of
`load' should also be considered a bug, but since all the other paths
of init files are resolved using `expand-file-name', I guess the same
should be done for the ~/.emacs path as well.

-- Christoph
From 42bc428470f0b6907cfc81718f35083a2df30d12 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20G=C3=B6ttschkes?= <[email-masked]>
Date: Fri, 13 Oct 2023 20:19:48 +0200
Subject: [PATCH] Expand file-name of ~/.emacs before attempt to load it.

* lisp/startup.el (command-line):
Expand the name of the ~/.emacs (or its other variant)
initialization file-name before passing the absolute path to load.
Otherwise, load does not recognize the path to be absolute and uses the
load-path to find the file.
---
 lisp/startup.el | 40 +++++++++++++++++++++-------------------
 1 file changed, 21 insertions(+), 19 deletions(-)

diff --git a/lisp/startup.el b/lisp/startup.el
index 6329e3ea8d0..73e27439e50 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -1493,25 +1493,27 @@ command-line
     ;; Load that user's init file, or the default one, or none.
     (startup--load-user-init-file
      (lambda ()
-       (cond
-	((eq startup-init-directory xdg-dir) nil)
-        ((eq system-type 'ms-dos)
-         (concat "~" init-file-user "/_emacs"))
-        ((not (eq system-type 'windows-nt))
-         (concat "~" init-file-user "/.emacs"))
-        ;; Else deal with the Windows situation.
-        ((directory-files "~" nil "\\`\\.emacs\\(\\.elc?\\)?\\'")
-         ;; Prefer .emacs on Windows.
-         "~/.emacs")
-        ((directory-files "~" nil "\\`_emacs\\(\\.elc?\\)?\\'")
-         ;; Also support _emacs for compatibility, but warn about it.
-         (push `(initialization
-                 ,(format-message
-                   "`_emacs' init file is deprecated, please use `.emacs'"))
-               delayed-warnings-list)
-         "~/_emacs")
-        (t ;; But default to .emacs if _emacs does not exist.
-         "~/.emacs")))
+       (if (eq startup-init-directory xdg-dir)
+           nil
+         (expand-file-name
+          (cond
+           ((eq system-type 'ms-dos)
+            (concat "~" init-file-user "/_emacs"))
+           ((not (eq system-type 'windows-nt))
+            (concat "~" init-file-user "/.emacs"))
+           ;; Else deal with the Windows situation.
+           ((directory-files "~" nil "\\`\\.emacs\\(\\.elc?\\)?\\'")
+            ;; Prefer .emacs on Windows.
+            "~/.emacs")
+           ((directory-files "~" nil "\\`_emacs\\(\\.elc?\\)?\\'")
+            ;; Also support _emacs for compatibility, but warn about it.
+            (push `(initialization
+                    ,(format-message
+                      "`_emacs' init file is deprecated, please use `.emacs'"))
+                  delayed-warnings-list)
+            "~/_emacs")
+           (t ;; But default to .emacs if _emacs does not exist.
+            "~/.emacs")))))
      (lambda ()
        (expand-file-name
         "init.el"
-- 
2.42.0