Bug #10700
On case-sensitive filesystem on OS X, Dir.glob("*.TXT") matches case-insensitively
Description
My Mac has the disk reformatted so that it is case-sensitive (HFS+):
$ touch foo.txt foo.TXT FOO.txt FOO.TXT $ ls -li foo.* FOO.* 286444732 -rw-r--r-- 1 asari staff 0 Jan 6 08:00 FOO.TXT 286444731 -rw-r--r-- 1 asari staff 0 Jan 6 08:00 FOO.txt 286444729 -rw-r--r-- 1 asari staff 0 Jan 6 08:00 foo.TXT 286444728 -rw-r--r-- 1 asari staff 0 Jan 6 08:00 foo.txt
You notice that they are all different files.
In Ruby 2.1.5, Dir.glob("*.TxT") returns an empty array, but in 2.2.0, all of these files are returned:
$ rvm 2.1.5 do ruby -v -e 'p Dir.glob("*.TxT")' ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0] [] $ rvm 2.2.0 do ruby -v -e 'p Dir.glob("*.TxT")' ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin13] ["FOO.TXT", "FOO.txt", "foo.TXT", "foo.txt"]
This is unexpected and incorrect. This does not happen on Linux.
Associated revisions
dir.c: OSX case-folding
- dir.c (glob_helper): match in case-folding only if the directory resides on a case-insensitve file system, on OSX. [ruby-core:67364] [Bug #10700]
dir.c: OSX case-folding
- dir.c (glob_helper): match in case-folding only if the directory resides on a case-insensitve file system, on OSX. [ruby-core:67364] [Bug #10700]
dir.c: OSX case-folding
- dir.c (glob_helper): match in case-folding only if the directory resides on a case-insensitve file system, on OSX. [ruby-core:67364] [Bug #10700]
dir.c: OSX case-folding
- dir.c (glob_helper): match in case-folding only if the directory resides on a case-insensitve file system, on OSX. [ruby-core:67364] [Bug #10700]
dir.c: OSX case-folding
- dir.c (glob_helper): match in case-folding only if the directory resides on a case-insensitve file system, on OSX. [ruby-core:67364] [Bug #10700]
merge revision(s) 49178: [Backport #10700]
* dir.c (glob_helper): match in case-folding only if the directory resides on a case-insensitve file system, on OSX. [ruby-core:67364] [Bug #10700]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@49296 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
merge revision(s) 49178: [Backport #10700]
* dir.c (glob_helper): match in case-folding only if the directory resides on a case-insensitve file system, on OSX. [ruby-core:67364] [Bug #10700]
merge revision(s) 49168: [Backport #10700]
* dir.c (need_normalization): not only HFS+, CIFS (SMB) is also decomposed. [Bug #10704] * dir.c (NORMALIZE_UTF8PATH): Unicode decomposition seems to perform in an upper layer than file systems on OSX, as all path names are always decomposed regardless of file system types.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@49303 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
merge revision(s) 49168: [Backport #10700]
* dir.c (need_normalization): not only HFS+, CIFS (SMB) is also decomposed. [Bug #10704] * dir.c (NORMALIZE_UTF8PATH): Unicode decomposition seems to perform in an upper layer than file systems on OSX, as all path names are always decomposed regardless of file system types.
History
Updated by enebo (Thomas Enebo) almost 5 years ago
I just told @arsarih some of the horrific details of an environment I worked where they had case-insensitity built into a forked SVN client on a case sensitive filesystem. When people do not expect this behavior it leads to really confusing situations. The most obvious one is a winner is picked (in my example SVN but in this case by Ruby), like FOO.TXT, but that is the not file the user thinks is being loaded, like foo.txt.
Updated by nobu (Nobuyoshi Nakada) almost 5 years ago
- Category set to platform/darwin
- Status changed from Open to Feedback
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: REQUIRED
Updated by hasari (Hiro Asari) almost 5 years ago
Nobuyoshi Nakada wrote:
Can you try https://github.com/nobu/ruby/compare/Bug%2310700-OSX-case-folding ?
Confirmed that it works.
$ touch foo.txt foo.TXT FOO.txt FOO.TXT $ ls -l foo* FOO* -rw-r--r-- 1 asari staff 0 Jan 7 22:09 FOO.TXT -rw-r--r-- 1 asari staff 0 Jan 7 22:09 FOO.txt -rw-r--r-- 1 asari staff 0 Jan 7 22:09 foo.TXT -rw-r--r-- 1 asari staff 0 Jan 7 22:09 foo.txt $ ./ruby --disable-gems -v -e 'p Dir.glob("*.TxT")' ruby 2.3.0dev (2015-01-07 trunk 49171) [x86_64-darwin13] []
Updated by nobu (Nobuyoshi Nakada) almost 5 years ago
- Status changed from Feedback to Closed
- % Done changed from 0 to 100
Applied in changeset r49178.
dir.c: OSX case-folding
- dir.c (glob_helper): match in case-folding only if the directory resides on a case-insensitve file system, on OSX. [ruby-core:67364] [Bug #10700]
Updated by naruse (Yui NARUSE) almost 5 years ago
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: REQUIRED to 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: DONE
ruby_2_2 r49296 merged revision(s) 49178.
dir.c: OSX case-folding
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49178 b2dd03c8-39d4-4d8f-98ff-823fe69b080e