Feature #5994

Dir.glob without wildcards returns pattern, not filename

Added by Dave B about 3 years ago. Updated 10 months ago.

[ruby-core:42469]
Status:Closed
Priority:Low
Assignee:Nobuyoshi Nakada

Description

This is Windows specific, I guess, as filename case doesn't matter there.
Ruby version is not specific to 1.9.3p0 (ruby 1.8.7p334 gives the same).
The script below produces results that seem inconsistent.
Using special characters (wildcards) in the glob pattern returns the
actual filename on disk but a plain pattern (no wildcards) returns the
pattern itself. This means I have to use another method for producing
a file with the same name or else override the users case-style
preference (which is not my intention).

daz

#======================
puts 'ruby %sp%d (%s) [%s]' % [RUBY_VERSION, RUBY_PATCHLEVEL, RUBY_RELEASE_DATE, RUBY_PLATFORM]
# ruby 1.9.3p0 (2011-10-30) [i386-mingw32]

Dir.chdir ENV['TEMP']
TMPDIR = Time.now.strftime('%Y%m%d_%H%M%S_delete')
Dir.mkdir(TMPDIR)
Dir.chdir(TMPDIR)

TMPFN  = 'Foo'
File.open(TMPFN, 'w') {}

#----------------------------------------------
p Dir.glob('*')   #=> ["Foo"]  ok
p Dir.glob('f?O') #=> ["Foo"]  ok

# But a glob without special characters returns
#  the glob pattern instead of the filename
p Dir.glob('foO') #=> ["foO"]  not wanted
p Dir['foO']      #=> ["foO"]  same as above
p Dir.glob('foO', File::FNM_CASEFOLD)
                # casefold ignored, as docs say
#----------------------------------------------

File.delete(TMPFN)
Dir.delete(File.join('..', TMPDIR))


#+++++
# Same incorrect results from:
#   ruby 1.8.7p334 (2011-02-18) [i386-mingw32]

Associated revisions

Revision 44796
Added by Nobuyoshi Nakada about 1 year ago

dir.c: glob cases on case-insensitive system

  • dir.c (glob_helper): return the filename with actual cases on the filesystem if it is case-insensitive. [Feature #5994]

Revision 44796
Added by Nobuyoshi Nakada about 1 year ago

dir.c: glob cases on case-insensitive system

  • dir.c (glob_helper): return the filename with actual cases on the filesystem if it is case-insensitive. [Feature #5994]

Revision 44801
Added by Yui NARUSE about 1 year ago

Revert "dir.c: glob cases on case-insensitive system"

This reverts commit r44796.

* dir.c (glob_helper): return the filename with actual cases on
  the filesystem if it is case-insensitive.  
  [Feature #5994]

Revision 44801
Added by Yui NARUSE about 1 year ago

Revert "dir.c: glob cases on case-insensitive system"

This reverts commit r44796.

* dir.c (glob_helper): return the filename with actual cases on
  the filesystem if it is case-insensitive.  
  [Feature #5994]

Revision 44802
Added by Nobuyoshi Nakada about 1 year ago

dir.c: glob cases on case-insensitive system

  • dir.c (glob_make_pattern): all alphabets are magic characters on case-insensitive filesystems. [Feature #5994]

Revision 44802
Added by Nobuyoshi Nakada about 1 year ago

dir.c: glob cases on case-insensitive system

  • dir.c (glob_make_pattern): all alphabets are magic characters on case-insensitive filesystems. [Feature #5994]

Revision 44807
Added by Nobuyoshi Nakada about 1 year ago

dir.c: glob cases on case-insensitive system

  • dir.c (glob_helper): return the filename with actual cases on the filesystem if it is case-insensitive. [Feature #5994]

Revision 44807
Added by Nobuyoshi Nakada about 1 year ago

dir.c: glob cases on case-insensitive system

  • dir.c (glob_helper): return the filename with actual cases on the filesystem if it is case-insensitive. [Feature #5994]

History

#1 Updated by Dave B about 3 years ago

This *nix behaviour would be fine, for me.

# ruby 1.8.7p302 (2010-08-16) [i486-linux]
#-----------------------------------------------------
p Dir.glob('*')                        #=> ["Foo"]  ok
p Dir.glob('f?O')                      #=> []       ok
p Dir.glob('foO')                      #=> []       ok
p Dir.glob('foO', File::FNM_CASEFOLD)  #=> ["Foo"]  ok
#-----------------------------------------------------

( Couldn't find an ENV['TEMP'] .. used ENV['HOME'] )

daz

#2 Updated by Nobuyoshi Nakada about 3 years ago

  • Category set to core
  • Target version set to 2.0.0
  • Status changed from Open to Feedback

Dave B wrote:

p Dir.glob('foO') #=> ["foO"]  not wanted

What do you want, an empty array same as case-sensitive systems?

#3 Updated by Dave B about 3 years ago

Hi Nobu,

I expected:

p Dir.glob('foO') #=> ["Foo"]

The current behaviour would be difficult to justify.
The doc string says ...
"Returns the filenames found by expanding pattern ..."

There is no filename "foO"; it exists only as a glob pattern.

Instead of answering the question "Are there files which match this
pattern", it has answered an artificial question "What glob pattern
did I use to search for files"; I already knew the answer to that. ;)

Background:
I'm doing a Windows System Restore from Linux and the registry databases
are not things I want to make subtle changes to.

WINDIR   = '/media/XYSRES/WINDOWS'
CONFIG   = File.join( WINDIR, 'system32', 'config' )
Dir.chdir CONFIG

hives = %w{ system software sam security default }

# Can't do this ...
p HIVES_NO = hives.map {|vn| Dir[vn][0] }
#=> ["system", "software", "sam", "security", "default"]

# Have to do this, instead ...
p HIVES_OK = Dir['*'].delete_if {|fn| !hives.include?(fn.downcase)}
#=> ["default", "SAM", "SECURITY", "software", "system"]

Cheers,

daz

#4 Updated by Koichi Sasada over 2 years ago

  • Status changed from Feedback to Assigned
  • Assignee set to Nobuyoshi Nakada

nobu, could you reply to it?

#5 Updated by Nobuyoshi Nakada over 2 years ago

  • Tracker changed from Bug to Feature

#6 Updated by Koichi Sasada about 2 years ago

  • Target version changed from 2.0.0 to 2.1.0

ping -> nobu

#7 Updated by Hiroshi SHIBATA about 1 year ago

  • Target version changed from 2.1.0 to current: 2.2.0

#8 Updated by Nobuyoshi Nakada about 1 year ago

  • % Done changed from 0 to 100
  • Status changed from Assigned to Closed

Applied in changeset r44796.


dir.c: glob cases on case-insensitive system

  • dir.c (glob_helper): return the filename with actual cases on the filesystem if it is case-insensitive. [Feature #5994]

#9 Updated by Nobuyoshi Nakada 10 months ago

  • Description updated (diff)

Also available in: Atom PDF