[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]