Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Look for META files rather than just directories to list plugins #10458

Merged
merged 6 commits into from
May 22, 2024

Conversation

shym
Copy link
Contributor

@shym shym commented Apr 25, 2024

This PR proposes a possible fix for #10457.

If the plugin directory contains anything but directories that each contain a META file, loading plugins fails. This PR proposes to check additionally for the presence of the META files and ignore other entries in the plugin directory.

Copy link
Collaborator

@anmonteiro anmonteiro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

works for me. it'd be nice to have a test case for this

otherlibs/dune-site/src/plugins/plugins.ml Outdated Show resolved Hide resolved
List.concat
(List.map
(fun dir -> Array.to_list (Sys.readdir dir))
(fun dir ->
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can probably be a List.filter_map instead.

It's available since OCaml 4.08, so it should be safe to use inside dune (https://github.com/ocaml/ocaml/blob/8b6b7cfbf26ae50ae87d5849c827e609a1309c98/stdlib/list.mli#L195-L200)

shym and others added 2 commits April 26, 2024 15:46
Signed-off-by: Samuel Hym <samuel.hym@rustyne.lautre.net>
If the plugin directory contains anything but directories that each
contain a `META` file, loading plugins fails

This can happen naturally in particular in the following scenario:
- install a package providing a plugin to a command in another package
- and remove that plugin package.
This leaves an empty directory which triggers that failure.

Co-authored-by: Antonio Nuno Monteiro <anmonteiro@gmail.com>
Signed-off-by: Samuel Hym <samuel.hym@rustyne.lautre.net>
@shym
Copy link
Contributor Author

shym commented Apr 26, 2024

Thank you for your review!

I wasn’t sure about the best way to test this behaviour. I have added such a possible test, where the empty directory is explicitly created to mimick what happens with OPAM.

Your suggestion to go with filter_map sent me on another exploration. Checking that Sys.file_exists on each candidate directory is not enough to ensure readdir will not fail. So I ended up with the following proposition: just try to Sys.readdir each plugins directory and handle the errors as empty directories.

@rgrinberg
Copy link
Member

ping @anmonteiro

Signed-off-by: Antonio Nuno Monteiro <anmonteiro@gmail.com>
@emillon
Copy link
Collaborator

emillon commented May 22, 2024

Thanks. Can you add a changelog entry in doc/changes/?

@emillon emillon linked an issue May 22, 2024 that may be closed by this pull request
Signed-off-by: Samuel Hym <samuel.hym@rustyne.lautre.net>
@emillon emillon merged commit 3ec11db into ocaml:main May 22, 2024
27 of 28 checks passed
@shym shym deleted the plugin-meta branch May 22, 2024 11:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

An empty directory in the plugin directory makes load_all fail
4 participants