Project

General

Profile

Bug #10700

On case-sensitive filesystem on OS X, Dir.glob("*.TXT") matches case-insensitively

Added by hasari (Hiro Asari) over 4 years ago. Updated over 4 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin13]
[ruby-core:67364]

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

Revision 49178
Added by nobu (Nobuyoshi Nakada) over 4 years ago

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]

Revision 49178
Added by nobu (Nobuyoshi Nakada) over 4 years ago

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]

Revision 49178
Added by nobu (Nobuyoshi Nakada) over 4 years ago

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]

Revision 49178
Added by nobu (Nobuyoshi Nakada) over 4 years ago

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]

Revision 49178
Added by nobu (Nobuyoshi Nakada) over 4 years ago

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]

Revision 49296
Added by naruse (Yui NARUSE) over 4 years ago

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]

Revision 49303
Added by naruse (Yui NARUSE) over 4 years ago

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) over 4 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) over 4 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) over 4 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) over 4 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) over 4 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.

Also available in: Atom PDF