unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#66534: 30.0.50; [PATCH] Expand file-name of ~/.emacs before attempt to load it
@ 2023-10-13 18:41 Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-10-14  6:54 ` Eli Zaretskii
  2023-10-14  7:25 ` Andreas Schwab
  0 siblings, 2 replies; 6+ messages in thread
From: Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-10-13 18:41 UTC (permalink / raw)
  To: 66534

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

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

[-- Attachment #2: 0001-Expand-file-name-of-.emacs-before-attempt-to-load-it.patch --]
[-- Type: text/x-patch, Size: 2783 bytes --]

From 42bc428470f0b6907cfc81718f35083a2df30d12 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christoph=20G=C3=B6ttschkes?= <just.mychris@googlemail.com>
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


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

* bug#66534: 30.0.50; [PATCH] Expand file-name of ~/.emacs before attempt to load it
  2023-10-13 18:41 bug#66534: 30.0.50; [PATCH] Expand file-name of ~/.emacs before attempt to load it Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-10-14  6:54 ` Eli Zaretskii
  2023-10-14  9:04   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-10-23 15:56   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-10-14  7:25 ` Andreas Schwab
  1 sibling, 2 replies; 6+ messages in thread
From: Eli Zaretskii @ 2023-10-14  6:54 UTC (permalink / raw)
  To: Christoph; +Cc: 66534

> Date: Fri, 13 Oct 2023 20:41:16 +0200
> From:  Christoph via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
> 
> 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 don't understand what you are saying here.  The last sentence is
incorrect, as evidenced by the following:

  (expand-file-name "~/.emacs" "/tmp")
   => "/home/eliz/.emacs"

IOW, "~/.emacs" is indeed treated by Emacs as an absolute file name,
but expand-file-name does NOT return "~/.emacs" unchanged.

So please explain what exactly is the problem you see here, and in
particular what issues that problem causes in your case.

Thanks.





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

* bug#66534: 30.0.50; [PATCH] Expand file-name of ~/.emacs before attempt to load it
  2023-10-13 18:41 bug#66534: 30.0.50; [PATCH] Expand file-name of ~/.emacs before attempt to load it Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-10-14  6:54 ` Eli Zaretskii
@ 2023-10-14  7:25 ` Andreas Schwab
  2023-10-14  9:05   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 6+ messages in thread
From: Andreas Schwab @ 2023-10-14  7:25 UTC (permalink / raw)
  To: 66534; +Cc: just.mychris

On Okt 13 2023, Christoph via "Bug reports for GNU Emacs, the Swiss army knife of text editors" wrote:

> 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.

That's probably a bug in complete_filename_p.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."





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

* bug#66534: 30.0.50; [PATCH] Expand file-name of ~/.emacs before attempt to load it
  2023-10-14  6:54 ` Eli Zaretskii
@ 2023-10-14  9:04   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-10-23 15:56   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 6+ messages in thread
From: Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-10-14  9:04 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 66534

On Sat, Oct 14, 2023 at 8:54 AM Eli Zaretskii <eliz@gnu.org> wrote:
>
> > Date: Fri, 13 Oct 2023 20:41:16 +0200
> > From:  Christoph via "Bug reports for GNU Emacs,
> >  the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
> >
> > 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 don't understand what you are saying here.  The last sentence is
> incorrect, as evidenced by the following:
>
>   (expand-file-name "~/.emacs" "/tmp")
>    => "/home/eliz/.emacs"
>
> IOW, "~/.emacs" is indeed treated by Emacs as an absolute file name,
> but expand-file-name does NOT return "~/.emacs" unchanged.

What I meant is "unchanged" in the regard to the default
directory. You can give any default directory to expand-file-name and
it will always return the first argument in its expanded form, if the
expanded form of the first argument is an absolute path.

>
> So please explain what exactly is the problem you see here, and in
> particular what issues that problem causes in your case.
>
> Thanks.

If you start Emacs without an ~/.emacs file, and with using .emacs.d
and not .config/emacs, I think there is a difference as well, Emacs
will try to load ~/.emacs `(length load-path)' times.  If I start
Emacs with strace -e openat I see the following lines 147 times:

openat(AT_FDCWD, "/home/chris/.emacs", O_RDONLY|O_CLOEXEC) = -1 ENOENT
(No such file or directory)
openat(AT_FDCWD, "/home/chris/.emacs.gz", O_RDONLY|O_CLOEXEC) = -1
ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/chris/.emacs.so", O_RDONLY|O_CLOEXEC) = -1
ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/chris/.emacs.so.gz", O_RDONLY|O_CLOEXEC) = -1
ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/chris/.emacs.elc", O_RDONLY|O_CLOEXEC) = -1
ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/chris/.emacs.elc.gz", O_RDONLY|O_CLOEXEC) = -1
ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/chris/.emacs.el", O_RDONLY|O_CLOEXEC) = -1
ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/chris/.emacs.el.gz", O_RDONLY|O_CLOEXEC) = -1
ENOENT (No such file or directory)

But Emacs should only try to load the file once.  The problem is that
the path to ~/.emacs is not expanded before it is handed to `load' and
load basically does:

(dolist (path load-path)
  (low-level-load (expand-file-name "~/.emacs" path)))

where low-level-load is some magic function which really loads a file.
There is off course more going on, like iterating over the extension
and such, but I want to keep it simple, since I am not familiar with
it at all.

`load' does check if the given path is absolute and
changes its behavior.  If the path is absolute, `load' does not take the
load-path into account, but paths beginning with "~/" are not recognized as
beeing absolute, hence the paths should be expanded before passing them
to `load'.

Because all the other paths to init files (early-init.el and init.el)
are expanded before they are passed to `load', I think "~/.emacs"
should be expanded as well.

There is also the question if `load' itself should be able to handle
paths that begin with "~/" correctly, or if the user is expected to
expand paths before passing them to `load'.

Regards, Christoph





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

* bug#66534: 30.0.50; [PATCH] Expand file-name of ~/.emacs before attempt to load it
  2023-10-14  7:25 ` Andreas Schwab
@ 2023-10-14  9:05   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 6+ messages in thread
From: Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-10-14  9:05 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: 66534

On Sat, Oct 14, 2023 at 9:25 AM Andreas Schwab <schwab@linux-m68k.org> wrote:
>
> On Okt 13 2023, Christoph via "Bug reports for GNU Emacs, the Swiss army knife of text editors" wrote:
>
> > 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.
>
> That's probably a bug in complete_filename_p.
>

I am not so sure if complete_filename_p should be able to recognize
these kinds of paths, or if `load' should expand the filename before
using it.  I am not familiar with all supported platforms, but it might
be tricky to check if a filename is absolute, without expanding it
beforehand.

For instance, what about filenames that start with a series of "../".
I guess they should be considered to be absolute, if the path goes up
to the root.

On the other hand, the documentation of `load' does not mention
absolute paths at all and states, This function searches the
directories on `load-path'.  So I can't say what the expected behaviour
of load is with paths that aren't expanded, but are absolute.

I am hesitant with changing the C code, because I am not very familiar
with it and just started to get into it, so I thought it might be more
appropriate to change it on the Lisp side, since all the other paths
to init files are fully expanded before passing them to load.

But yes, as I wrote before, I think this behaviour of load could be
considered a bug as well.

-- Christoph





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

* bug#66534: 30.0.50; [PATCH] Expand file-name of ~/.emacs before attempt to load it
  2023-10-14  6:54 ` Eli Zaretskii
  2023-10-14  9:04   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-10-23 15:56   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 0 replies; 6+ messages in thread
From: Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-10-23 15:56 UTC (permalink / raw)
  To: 66534

On Sat, Oct 14, 2023 at 8:54 AM Eli Zaretskii <eliz@gnu.org> wrote:
> So please explain what exactly is the problem you see here, and in
> particular what issues that problem causes in your case.

Do you think the patch makes sense like that, or should I rather look
into the native side, as suggested by Andreas?





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

end of thread, other threads:[~2023-10-23 15:56 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-13 18:41 bug#66534: 30.0.50; [PATCH] Expand file-name of ~/.emacs before attempt to load it Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-10-14  6:54 ` Eli Zaretskii
2023-10-14  9:04   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-10-23 15:56   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-10-14  7:25 ` Andreas Schwab
2023-10-14  9:05   ` Christoph via Bug reports for GNU Emacs, the Swiss army knife of text editors

Code repositories for project(s) associated with this public inbox

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).