Project

General

Profile

Actions

Bug #10700

closed

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

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

Status:
Closed
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.

Updated by enebo (Thomas Enebo) over 9 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 9 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 9 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 9 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 9 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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0