Feature #5994

Dir.glob without wildcards returns pattern, not filename

Added by Dave B about 2 years ago. Updated 2 months ago.

[ruby-core:42469]
Status:Closed
Priority:Low
Assignee:Nobuyoshi Nakada
Category:core
Target version:current: 2.2.0

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]' % [RUBYVERSION, RUBYPATCHLEVEL, RUBYRELEASEDATE, RUBY_PLATFORM]

ruby 1.9.3p0 (2011-10-30) [i386-mingw32]

Dir.chdir ENV['TEMP']
TMPDIR = Time.now.strftime('%Y%m%d%H%M%Sdelete')
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 2 months 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 2 months 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 2 months ago

dir.c: glob cases on case-insensitive system

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

Revision 44807
Added by Nobuyoshi Nakada 2 months 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 2 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 2 years ago

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

=begin
Dave B wrote:
p Dir.glob('foO') #=> ["foO"] not wanted

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

#3 Updated by Dave B about 2 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 HIVESOK = Dir['*'].deleteif {|fn| !hives.include?(fn.downcase)}
#=> ["default", "SAM", "SECURITY", "software", "system"]

Cheers,

daz

#4 Updated by Koichi Sasada over 1 year ago

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

nobu, could you reply to it?

#5 Updated by Nobuyoshi Nakada over 1 year ago

  • Tracker changed from Bug to Feature

#6 Updated by Koichi Sasada about 1 year ago

  • Target version changed from 2.0.0 to 2.1.0

ping -> nobu

#7 Updated by Hiroshi SHIBATA 3 months ago

  • Target version changed from 2.1.0 to current: 2.2.0

#8 Updated by Nobuyoshi Nakada 2 months ago

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

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]

Also available in: Atom PDF