[ruby-core:98246] [Ruby master Bug#16831] Running `Pathname#glob` with `File::FNM_DOTMATCH` option loses `.` and `..`
From:
me@...
Date:
2020-05-10 01:53:35 UTC
List:
ruby-core #98246
Issue #16831 has been updated by jnchito (Junichi Ito).
Thank you for your explanation. With your hint and reading [the implementation code](https://github.com/ruby/ruby/blob/761528e8aa7c54ec92c90335fe26a584b992918b/ext/pathname/pathname.c#L1131-L1161) solved my question.
Dan0042 (Daniel DeLorme) wrote in #note-3:
> I don't think those can have consistent results, because Pathname#glob is equivalent to using the `base` option of `Dir.glob` and then joining the paths, which is not the same as joining the paths into a glob and then invoking `Dir.glob`. In particular they have different behavior if the base contains globbing characters. And I don't think there's a method of Pathname that allows to join without cleaning the path.
>
> ```ruby
> b = Pathname.new("ext")
> b.glob("*").min #=> #<Pathname:ext/-test->
> Dir.glob("*", base: b).min #=> "-test-"
> Dir.glob(b+"*").min #=> "ext/-test-"
>
> b = Pathname.new("{ext,man}")
> b.glob("*").min #=> nil because there's no literal "{ext,man}" dir
> Dir.glob("*", base: b).min #=> nil
> Dir.glob(b+"*").min #=> "ext/-test-"
> ```
Dan0042 (Daniel DeLorme) wrote in #note-3:
> I don't think those can have consistent results, because Pathname#glob is equivalent to using the `base` option of `Dir.glob` and then joining the paths, which is not the same as joining the paths into a glob and then invoking `Dir.glob`. In particular they have different behavior if the base contains globbing characters. And I don't think there's a method of Pathname that allows to join without cleaning the path.
>
> ```ruby
> b = Pathname.new("ext")
> b.glob("*").min #=> #<Pathname:ext/-test->
> Dir.glob("*", base: b).min #=> "-test-"
> Dir.glob(b+"*").min #=> "ext/-test-"
>
> b = Pathname.new("{ext,man}")
> b.glob("*").min #=> nil because there's no literal "{ext,man}" dir
> Dir.glob("*", base: b).min #=> nil
> Dir.glob(b+"*").min #=> "ext/-test-"
> ```
----------------------------------------
Bug #16831: Running `Pathname#glob` with `File::FNM_DOTMATCH` option loses `.` and `..`
https://bugs.ruby-lang.org/issues/16831#change-85487
* Author: jnchito (Junichi Ito)
* Status: Open
* Priority: Normal
* ruby -v: ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN
----------------------------------------
Running `Dir.glob`, `Pathname.glob` with `File::FNM_DOTMATCH` option keeps `.` and `..` as their basename:
``` ruby
require 'pathname'
pathname = Pathname.pwd
#=> #<Pathname:/Users/jnito/dev>
# Dir.glob keeps "." and ".."
Dir.glob(pathname.join('*'), File::FNM_DOTMATCH).sort[0..1]
#=> ["/Users/jnito/dev/.", "/Users/jnito/dev/.."]
# Pathname.glob keeps "." and ".." too
Pathname.glob(pathname.join('*'), File::FNM_DOTMATCH).sort[0..1]
#=> [#<Pathname:/Users/jnito/dev/.>, #<Pathname:/Users/jnito/dev/..>]
```
I expect `Pathname#glob` with `File::FNM_DOTMATCH` option has same behavior, but it loses `.` and `..`:
``` ruby
# Pathname#glob loses "." and ".."
pathname.glob('*', File::FNM_DOTMATCH).sort[0..1]
#=> [#<Pathname:/Users/jnito>, #<Pathname:/Users/jnito/dev>]
```
I wanted to replace my code from `Pathname.glob(pathname.join('*'), File::FNM_DOTMATCH)` to `pathname.glob('*', File::FNM_DOTMATCH)`, but I couldn't do due to their incompatibility. So I want `Pathname#glob` to keep `.` and `..`.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>