ruby-changes:38679
From: nobu <ko1@a...>
Date: Thu, 4 Jun 2015 07:12:36 +0900 (JST)
Subject: [ruby-changes:38679] nobu:r50760 (trunk): dir.c: FNM_SHORTNAME
nobu 2015-06-04 07:12:24 +0900 (Thu, 04 Jun 2015) New Revision: 50760 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=50760 Log: dir.c: FNM_SHORTNAME * dir.c (dirent_match): match short names only when FNM_SHORTNAME flag is given, for the backward compatibility, and the new behavior is often dangerous. [ruby-core:69435] [Bug #11206] Modified files: trunk/ChangeLog trunk/dir.c trunk/test/ruby/test_dir.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 50759) +++ ChangeLog (revision 50760) @@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Thu Jun 4 07:12:20 2015 Nobuyoshi Nakada <nobu@r...> + + * dir.c (dirent_match): match short names only when FNM_SHORTNAME + flag is given, for the backward compatibility, and the new + behavior is often dangerous. [ruby-core:69435] [Bug #11206] + Thu Jun 4 05:44:01 2015 Eric Wong <e@8...> * variable.c (special_generic_ivar): remove flag Index: dir.c =================================================================== --- dir.c (revision 50759) +++ dir.c (revision 50760) @@ -157,6 +157,11 @@ has_nonascii(const char *ptr, size_t len https://github.com/ruby/ruby/blob/trunk/dir.c#L157 #else #define FNM_SYSCASE 0 #endif +#if _WIN32 +#define FNM_SHORTNAME 0x20 +#else +#define FNM_SHORTNAME 0 +#endif #define FNM_NOMATCH 1 #define FNM_ERROR 2 @@ -1595,7 +1600,7 @@ dirent_match(const char *pat, rb_encodin https://github.com/ruby/ruby/blob/trunk/dir.c#L1600 { if (fnmatch(pat, enc, name, flags) == 0) return 1; #ifdef _WIN32 - if (dp->d_altname) { + if (dp->d_altname && (flags & FNM_SHORTNAME)) { if (fnmatch(pat, enc, dp->d_altname, flags) == 0) return 1; } #endif @@ -2636,4 +2641,11 @@ Init_Dir(void) https://github.com/ruby/ruby/blob/trunk/dir.c#L2641 * 0. */ rb_file_const("FNM_SYSCASE", INT2FIX(FNM_SYSCASE)); + + /* Document-const: File::Constants::FNM_SHORTNAME + * + * Makes patterns to match short names if existing. Valid only + * on Microsoft Windows. + */ + rb_file_const("FNM_SHORTNAME", INT2FIX(FNM_SHORTNAME)); } Index: test/ruby/test_dir.rb =================================================================== --- test/ruby/test_dir.rb (revision 50759) +++ test/ruby/test_dir.rb (revision 50760) @@ -262,6 +262,7 @@ class TestDir < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_dir.rb#L262 if /mswin|mingw/ =~ RUBY_PLATFORM def test_glob_legacy_short_name bug10819 = '[ruby-core:67954] [Bug #10819]' + bug11206 = '[ruby-core:69435] [Bug #11206]' skip unless /\A\w:/ =~ ENV["ProgramFiles"] short = "#$&/PROGRA~1" skip unless File.directory?(short) @@ -270,8 +271,9 @@ class TestDir < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_dir.rb#L271 long = File.expand_path(short) assert_equal(Dir.glob("#{long}/Common*"), entries, bug10819) wild = short.sub(/1\z/, '*') - assert_include(Dir.glob(wild), long, bug10819) - assert_empty(entries - Dir.glob("#{wild}/Common*"), bug10819) + assert_not_include(Dir.glob(wild), long, bug11206) + assert_include(Dir.glob(wild, File::FNM_SHORTNAME), long, bug10819) + assert_empty(entries - Dir.glob("#{wild}/Common*", File::FNM_SHORTNAME), bug10819) end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/