Glad I set project-files-relative-names to t and have been testing. This side-effect in Eglot is sure to bite other people who are teased by the NEWS of this new option, despite not being a defcustom.

If it is not intended to be set (yet? ever?), perhaps update the docstring to indicate this. I do tend to agree with Joao that the API to project-files probably could have an optional additional argument vs. a global, especially if the intention is merely to influence a specific call-site's expected results.

WRT to Eglot using relative as default, in this context it is looking for directory components and relative names might need to be adorned at least with "./" so that file-name-directory doesn't fail. Perhaps project-files-relative-names could be set to a symbol such as 'retain-relative-directory-component.

On Thu, Aug 22, 2024 at 7:22 PM Dmitry Gutov <dmitry@gutov.dev> wrote:
Hi!

On 18/08/2024 18:43, Ship Mints wrote:
> project-files-relative-names was introduced a few months ago, so it's no
> surprise that there are some side effects when set.
>
> This affects the handler for workspace/didChangeWatchedFiles. The result
> is that dirs-to-watch...
>
>           (dirs-to-watch
>            (delete-dups (mapcar #'file-name-directory
>                                 (project-files
>                                  (eglot--project server))))))
>
> ...is nil when project-files-relative-names is t, due to
> file-name-directory failing to parse the directories it was expecting.
> This results in file-readable-p failing with a nil dir:

You're not really supposed to customize it as an end user (or at least
not yet) - the caller code either sets it to t to indicate support for
relative names, or not.

>           (watch-dir (dir)
>             (when-let ((probe
>                         (and (file-readable-p dir)
>
> One solution which I've tested is simply the defensive:
>
>           (project-files-relative-names nil) ; add this
>           (dirs-to-watch
>            (delete-dups (mapcar #'file-name-directory
>                                 (project-files
>                                  (eglot--project server))))))

...that said, someday the default value of this var will be flipped, and
some changes like that might be needed.

The relative version is a bit faster, though, so maybe Eglot could
switch to relative names too. If it makes sense.