summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-03-28 03:28:38 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-03-28 03:28:38 +0000
commitd1b82673bcf7e67c836f8f7f32a299ca81d10b47 (patch)
tree64a44eb37b48d798d378e80f7696e1441e667144
parent8bf06cb9752273f8fa1c9e176bb5ba85381f22a5 (diff)
merge revision(s) 67332: [Backport #15649]
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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67353 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--dir.c29
-rw-r--r--test/ruby/test_dir.rb8
-rw-r--r--version.h2
3 files changed, 38 insertions, 1 deletions
diff --git a/dir.c b/dir.c
index a8aebefb52..69b53cb0e6 100644
--- a/dir.c
+++ b/dir.c
@@ -2432,6 +2432,24 @@ push_caller(const char *path, VALUE val, void *enc)
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,
@@ -2444,6 +2462,17 @@ ruby_glob0(const char *path, int fd, const char *base, int flags,
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);
diff --git a/test/ruby/test_dir.rb b/test/ruby/test_dir.rb
index 02b9c32202..5196c08f81 100644
--- a/test/ruby/test_dir.rb
+++ b/test/ruby/test_dir.rb
@@ -205,6 +205,14 @@ class TestDir < Test::Unit::TestCase
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)
diff --git a/version.h b/version.h
index 22b5937fdf..d68e3a45d1 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.6.3"
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 50
+#define RUBY_PATCHLEVEL 51
#define RUBY_RELEASE_YEAR 2019
#define RUBY_RELEASE_MONTH 3