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

From: Ship Mints <[email-masked]>
Date: Mon, 24 Mar 2025 11:15:20 -0400

On Mon, Mar 24, 2025 at 9:03 AM Eli Zaretskii <[email-masked]> wrote:

> > Cc: [email-masked], Dmitry Gutov <[email-masked]>
> > From: Ship Mints <[email-masked]>
> > Date: Mon, 24 Mar 2025 06:40:29 -0400
> >
> > Since I suggested it be optional, it would be off by default, right?  If
> you think you'd want to canonicalize
> > paths to project roots in some places and not others, perhaps we could
> contrive a project sentinel file ala .
> > project-notruename.el/d or .project-config.el/d, and for people that
> want to do things in code, a list project
> > can consult.
>
> AFAIR, you didn't respond to my suggest to try a different solution.
> Namely, instead of changing the file name by resolving links,
> something that could cause problems for some people, how about using
> file-equal-p to avoid duplication of projects in these cases?  If my
> proposal makes sense, it will allow use to avoid duplication without
> changing the file names, because symlinks will be chased internally,
> only where we decide whether two projects are different or not.
>
> This is better than having an optional behavior, because inevitably
> someone will want to use this option, but also wouldn't like his/her
> project directories appear under their resolved names, and then we are
> back at the same problem.
>

I did consider it.  The most popular project objects, project-vc, and
transient are defined as (list 'vc vcbackend dir) and (cons 'transient
dir), respectively and vc objects are cached.  If we don't canonicalize the
dir name, we can't find the vc cache entry if a probe is attempted from
another dir, even if that dir morally is equivalent.  One can't change the
embedded dir on the way out of without creating two objects, one with the
first location to create the cache entry, and a second from an equivalent
convenience dir.

I'm curious to hear more about why people would object to (project-root
project-obj) being canonicalized.  I don't think many people ever manually
enter project dirs.  The persisted known projects, I'd think, would also
benefit from no duplicates.

If you see the place in project.el where file-equal-p helps, I'll happily
hack on it.