dir.c: fix directory glob

* dir.c (glob_helper): fix directory glob which resulted in lacking
  the first byte.  adjust the length of basename to be appended as
  well as removing the heading path, not the length of the joined
  path.  [ruby-dev:50588] [Bug #14899]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63909 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2018-07-09 01:20:20 +00:00
parent 0528838b37
commit 58f2e6bc94
2 changed files with 27 additions and 4 deletions

7
dir.c
View File

@ -2068,10 +2068,11 @@ glob_helper(
if (status) return status; if (status) return status;
} }
if (match_dir && pathtype == path_directory) { if (match_dir && pathtype == path_directory) {
const char *subpath = path + baselen + (baselen && path[baselen] == '/'); int seplen = (baselen && path[baselen] == '/');
char *tmp = join_path(subpath, namelen, dirsep, "", 0); const char *subpath = path + baselen + seplen;
char *tmp = join_path(subpath, namelen - seplen, dirsep, "", 0);
if (!tmp) return -1; if (!tmp) return -1;
status = glob_call_func(funcs->match, tmp + (baselen ? dirsep : 0), arg, enc); status = glob_call_func(funcs->match, tmp, arg, enc);
GLOB_FREE(tmp); GLOB_FREE(tmp);
if (status) return status; if (status) return status;
} }

View File

@ -11,11 +11,13 @@ class TestDir < Test::Unit::TestCase
$VERBOSE = nil $VERBOSE = nil
@root = File.realpath(Dir.mktmpdir('__test_dir__')) @root = File.realpath(Dir.mktmpdir('__test_dir__'))
@nodir = File.join(@root, "dummy") @nodir = File.join(@root, "dummy")
@dirs = []
for i in "a".."z" for i in "a".."z"
if i.ord % 2 == 0 if i.ord % 2 == 0
FileUtils.touch(File.join(@root, i)) FileUtils.touch(File.join(@root, i))
else else
FileUtils.mkdir(File.join(@root, i)) FileUtils.mkdir(File.join(@root, i))
@dirs << File.join(i, "")
end end
end end
end end
@ -210,18 +212,38 @@ class TestDir < Test::Unit::TestCase
def test_glob_base def test_glob_base
files = %w[a/foo.c c/bar.c] files = %w[a/foo.c c/bar.c]
files.each {|n| File.write(File.join(@root, n), "")} files.each {|n| File.write(File.join(@root, n), "")}
Dir.mkdir(File.join(@root, "a/dir"))
dirs = @dirs + %w[a/dir/]
dirs.sort!
assert_equal(files, Dir.glob("*/*.c", base: @root).sort) assert_equal(files, Dir.glob("*/*.c", base: @root).sort)
assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: ".").sort}) assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: ".").sort})
assert_equal(%w[foo.c], Dir.chdir(@root) {Dir.glob("*.c", base: "a").sort}) assert_equal(%w[foo.c], Dir.chdir(@root) {Dir.glob("*.c", base: "a").sort})
assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: "").sort}) assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: "").sort})
assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: nil).sort}) assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: nil).sort})
assert_equal(@dirs, Dir.glob("*/", base: @root).sort)
assert_equal(@dirs, Dir.chdir(@root) {Dir.glob("*/", base: ".").sort})
assert_equal(%w[dir/], Dir.chdir(@root) {Dir.glob("*/", base: "a").sort})
assert_equal(@dirs, Dir.chdir(@root) {Dir.glob("*/", base: "").sort})
assert_equal(@dirs, Dir.chdir(@root) {Dir.glob("*/", base: nil).sort})
assert_equal(dirs, Dir.glob("**/*/", base: @root).sort)
assert_equal(dirs, Dir.chdir(@root) {Dir.glob("**/*/", base: ".").sort})
assert_equal(%w[dir/], Dir.chdir(@root) {Dir.glob("**/*/", base: "a").sort})
assert_equal(dirs, Dir.chdir(@root) {Dir.glob("**/*/", base: "").sort})
assert_equal(dirs, Dir.chdir(@root) {Dir.glob("**/*/", base: nil).sort})
end end
def test_glob_base_dir def test_glob_base_dir
files = %w[a/foo.c c/bar.c] files = %w[a/foo.c c/bar.c]
files.each {|n| File.write(File.join(@root, n), "")} files.each {|n| File.write(File.join(@root, n), "")}
Dir.mkdir(File.join(@root, "a/dir"))
dirs = @dirs + %w[a/dir/]
dirs.sort!
assert_equal(files, Dir.open(@root) {|d| Dir.glob("*/*.c", base: d)}.sort) assert_equal(files, Dir.open(@root) {|d| Dir.glob("*/*.c", base: d)}.sort)
assert_equal(%w[foo.c], Dir.chdir(@root) {Dir.open("a") {|d| Dir.glob("*", base: d)}}) assert_equal(%w[foo.c], Dir.chdir(@root) {Dir.open("a") {|d| Dir.glob("*.c", base: d)}})
assert_equal(@dirs, Dir.open(@root) {|d| Dir.glob("*/", base: d).sort})
assert_equal(%w[dir/], Dir.chdir(@root) {Dir.open("a") {|d| Dir.glob("*/", base: d).sort}})
assert_equal(dirs, Dir.open(@root) {|d| Dir.glob("**/*/", base: d).sort})
assert_equal(%w[dir/], Dir.chdir(@root) {Dir.open("a") {|d| Dir.glob("**/*/", base: d).sort}})
end end
def assert_entries(entries, children_only = false) def assert_entries(entries, children_only = false)