sagiegurari / duckscript

Simple, extendable and embeddable scripting language.
https://sagiegurari.github.io/duckscript
Apache License 2.0
514 stars 50 forks source link

glob follows symlinks recursively #281

Open sffc opened 2 years ago

sffc commented 2 years ago

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.

sagiegurari commented 2 years ago

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

sffc commented 1 year ago

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.

BurntSushi commented 1 year ago

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.