Subject: bug#77122: [PATCH] project--find-in-directory resolves symlinks

From: Ship Mints <[email-masked]>
Date: Wed, 19 Mar 2025 13:18:49 -0400

On Wed, Mar 19, 2025 at 1:10 PM Eli Zaretskii <[email-masked]> wrote:

> > From: Ship Mints <[email-masked]>
> > Date: Wed, 19 Mar 2025 12:55:09 -0400
> >
> > This avoids duplicate projects accessed via symlinks that share resolved
> directory locations.  This has
> > bothered me for a while, so here we go.
> >
> > From 074905ff365c6bcd7cbcf72e0158ae9db0908a20 Mon Sep 17 00:00:00 2001
> > From: shipmints <[email-masked]>
> > Date: Wed, 19 Mar 2025 12:50:28 -0400
> > Subject: [PATCH] project--find-in-directory resolves symlinks (bug#xxx)
> >
> > This avoids duplicate projects that share resolved directory locations.
> >
> > * lisp/progmodes/project.el (project--find-in-directory): Invoke
> > 'project-find-functions' on 'file-truename' resolved dir.
> > ---
> >  lisp/progmodes/project.el | 4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/lisp/progmodes/project.el b/lisp/progmodes/project.el
> > index 4eac541167a..45f5328f6be 100644
> > --- a/lisp/progmodes/project.el
> > +++ b/lisp/progmodes/project.el
> > @@ -251,6 +251,10 @@ project-current
> >      pr))
> >
> >  (defun project--find-in-directory (dir)
> > +  "Invoke `project-find-functions' for DIR.
> > +DIR is resolved to its true name, 'chasing' symbolic links, to avoid
> > +duplicate projects that share resolved directory locations."
> > +  (setq dir (file-truename dir))
>
> That's not necessarily what the user will want, since it changes the
> name of the file (and potentially its directory as well).  If the file
> or the directory have some "magical" name that matters, this will
> backfire.
>
> I think it is better to detect the fact that two directories point to
> the same place via symlinks (e.g., with file-equal-p), and avoid
> duplication in that case, but without actually substituting the file's
> name by its truename.
>
> But of course the final word is for Dmitry.
>

I expect that (project-current) whether invoked when default-directory
points to a symlinked project or not, returns the same thing.  It's an
opaque value to users?