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

ruby-changes:32717

From: nobu <ko1@a...>
Date: Mon, 3 Feb 2014 10:49:55 +0900 (JST)
Subject: [ruby-changes:32717] nobu:r44796 (trunk): dir.c: glob cases on case-insensitive system

nobu	2014-02-03 10:49:50 +0900 (Mon, 03 Feb 2014)

  New Revision: 44796

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=44796

  Log:
    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.  [ruby-core:42469]
      [Feature #5994]

  Modified files:
    trunk/ChangeLog
    trunk/dir.c
    trunk/test/ruby/test_dir.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 44795)
+++ ChangeLog	(revision 44796)
@@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Mon Feb  3 10:49:48 2014  Nobuyoshi Nakada  <nobu@r...>
+
+	* dir.c (glob_helper): return the filename with actual cases on
+	  the filesystem if it is case-insensitive.  [ruby-core:42469]
+	  [Feature #5994]
+
 Sun Feb 2 05:48:42 2014  Eric Wong <e@8...>
 
 	* io.c (rb_io_syswrite): add RB_GC_GUARD
Index: dir.c
===================================================================
--- dir.c	(revision 44795)
+++ dir.c	(revision 44796)
@@ -1397,14 +1397,29 @@ glob_helper( https://github.com/ruby/ruby/blob/trunk/dir.c#L1397
 
     if (exist == NO || isdir == NO) return 0;
 
-    if (magical || recursive) {
+    if (magical || recursive || ((FNM_SYSCASE || HAVE_HFS) && plain)) {
 	struct dirent *dp;
 	DIR *dirp;
 	IF_HAVE_HFS(int hfs_p);
 	dirp = do_opendir(*path ? path : ".", flags, enc);
-	if (dirp == NULL) return 0;
+	if (dirp == NULL) {
+# if FNM_SYSCASE || HAVE_HFS
+	    if (!(magical || recursive) && (errno == EACCES)) {
+		/* no read permission, fallback */
+		goto literally;
+	    }
+# endif
+	    return 0;
+	}
 	IF_HAVE_HFS(hfs_p = is_hfs(dirp));
 
+# if HAVE_HFS
+	if (!(hfs_p || magical || recursive)) {
+	    closedir(dirp);
+	    goto literally;
+	}
+	flags |= FNM_CASEFOLD;
+# endif
 	while ((dp = READDIR(dirp, enc)) != NULL) {
 	    char *buf;
 	    enum answer new_isdir = UNKNOWN;
@@ -1486,6 +1501,9 @@ glob_helper( https://github.com/ruby/ruby/blob/trunk/dir.c#L1501
     else if (plain) {
 	struct glob_pattern **copy_beg, **copy_end, **cur2;
 
+# if FNM_SYSCASE || HAVE_HFS
+      literally:
+# endif
 	copy_beg = copy_end = GLOB_ALLOC_N(struct glob_pattern *, end - beg);
 	if (!copy_beg) return -1;
 	for (cur = beg; cur < end; ++cur)
Index: test/ruby/test_dir.rb
===================================================================
--- test/ruby/test_dir.rb	(revision 44795)
+++ test/ruby/test_dir.rb	(revision 44796)
@@ -228,6 +228,27 @@ class TestDir < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_dir.rb#L228
     assert_empty(Dir.glob(File.join(@root, "<")), bug8597)
   end
 
+  def test_glob_cases
+    feature5994 = "[ruby-core:42469] [Feature #5994]"
+    feature5994 << "\nDir.glob should return the filename with actual cases on the filesystem"
+    Dir.chdir(File.join(@root, "a")) do
+      open("FileWithCases", "w") {}
+      return unless File.exist?("filewithcases")
+      assert_equal(%w"FileWithCases", Dir.glob("filewithcases"), feature5994)
+    end
+    Dir.chdir(File.join(@root, "c")) do
+      open("FileWithCases", "w") {}
+      mode = File.stat(".").mode
+      begin
+        File.chmod(mode & ~0444, ".")
+        return if mode == File.stat(".").mode
+        assert_equal(%w"filewithcases", Dir.glob("filewithcases"), feature5994)
+      ensure
+        File.chmod(mode, ".")
+      end
+    end
+  end
+
   def test_home
     env_home = ENV["HOME"]
     env_logdir = ENV["LOGDIR"]

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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