duckscript icon indicating copy to clipboard operation
duckscript copied to clipboard

glob follows symlinks recursively

Open sffc opened this issue 3 years ago • 3 comments
trafficstars

Describe The Bug

In a directory that has a recursive symbolic link, the duckscript glob_array command performs a cyclic recursion.

To Reproduce

  1. Create a symbolic link that points at its parent directory
  2. Use glob_array

Commentary

This is a bug in glob, not duckscript, but duckscript isn't completely off the hook because the glob crate has had an issue open since 2017 (https://github.com/rust-lang/glob/issues/62), and a PR to fix it, but the crate hasn't been updated in several years. There are other glob-like crates in the ecosystem now with better options, including ones to ignore symlinks. It might be worthwhile migrating to one of them.

sffc avatar Oct 21 '22 21:10 sffc

thanks for reporting. which glob crate do you recommend? also do you plan to PR this?

sagiegurari avatar Oct 22 '22 07:10 sagiegurari

We no longer have the symlink, so this isn't a pressing need any more. But it would still be nice lower-priority cleanup.

I've used globset before, maintained by @BurntSushi. It is more featureful than glob, but I'm not sure if it fixes the cyclic symlink issue.

sffc avatar Nov 03 '22 22:11 sffc

globset unfortunately only provides glob matching. It does not also provide directory traversal, which glob does. The ignore crate does directory traversal and has a very complicated API, but does support glob matching too (and relies on globset). There is also globwalk, which is built on top of ignore and has a simpler API.

The glob situation in Rust is not so great. I built globset specifically to be able to efficiently handle gitignore files, but kind of just stopped there and I haven't gotten a chance to revisit the situation. (Which I still hope to do.)

Anything that's built on walkdir (or ignore) should not have the cyclic symlink problem. It has specific logic for detecting loops.

BurntSushi avatar Nov 04 '22 11:11 BurntSushi