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

ruby-changes:55125

From: shirosaki <ko1@a...>
Date: Thu, 21 Mar 2019 22:32:08 +0900 (JST)
Subject: [ruby-changes:55125] shirosaki:r67332 (trunk): dir.c: fix Dir.glob starts with brace

shirosaki	2019-03-21 22:32:03 +0900 (Thu, 21 Mar 2019)

  New Revision: 67332

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=67332

  Log:
    dir.c: fix Dir.glob starts with brace
    
    * dir.c (ruby_glob0): expand braces if a glob pattern starts with
      brace.
      [ruby-core:91728] [Bug #15649]

  Modified files:
    trunk/dir.c
    trunk/test/ruby/test_dir.rb
Index: dir.c
===================================================================
--- dir.c	(revision 67331)
+++ dir.c	(revision 67332)
@@ -2433,6 +2433,24 @@ push_caller(const char *path, VALUE val, https://github.com/ruby/ruby/blob/trunk/dir.c#L2433
     return status;
 }
 
+static int ruby_glob0(const char *path, int fd, const char *base, int flags,
+                      const ruby_glob_funcs_t *funcs, VALUE arg, rb_encoding *enc);
+
+struct push_glob0_args {
+    int fd;
+    const char *base;
+    int flags;
+    const ruby_glob_funcs_t *funcs;
+    VALUE arg;
+};
+
+static int
+push_glob0_caller(const char *path, VALUE val, void *enc)
+{
+    struct push_glob0_args *arg = (struct push_glob0_args *)val;
+    return ruby_glob0(path, arg->fd, arg->base, arg->flags, arg->funcs, arg->arg, enc);
+}
+
 static int
 ruby_glob0(const char *path, int fd, const char *base, int flags,
 	   const ruby_glob_funcs_t *funcs, VALUE arg,
@@ -2445,6 +2463,17 @@ ruby_glob0(const char *path, int fd, con https://github.com/ruby/ruby/blob/trunk/dir.c#L2463
     int status, dirsep = FALSE;
 
     start = root = path;
+
+    if (*root == '{') {
+        struct push_glob0_args args;
+        args.fd = fd;
+        args.base = base;
+        args.flags = flags;
+        args.funcs = funcs;
+        args.arg = arg;
+        return ruby_brace_expand(path, flags, push_glob0_caller, (VALUE)&args, enc, Qfalse);
+    }
+
     flags |= FNM_SYSCASE;
 #if defined DOSISH
     root = rb_enc_path_skip_prefix(root, root + strlen(root), enc);
Index: test/ruby/test_dir.rb
===================================================================
--- test/ruby/test_dir.rb	(revision 67331)
+++ test/ruby/test_dir.rb	(revision 67332)
@@ -205,6 +205,14 @@ class TestDir < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_dir.rb#L205
     end
   end
 
+  def test_glob_starts_with_brace
+    Dir.chdir(@root) do
+      bug15649 = '[ruby-core:91728] [Bug #15649]'
+      assert_equal(["#{@root}/a", "#{@root}/b"],
+                   Dir.glob("{#{@root}/a,#{@root}/b}"), bug15649)
+    end
+  end
+
   if Process.const_defined?(:RLIMIT_NOFILE)
     def test_glob_too_may_open_files
       assert_separately([], "#{<<-"begin;"}\n#{<<-'end;'}", chdir: @root)

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

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