From 4e600d87e06ebc00c10629b52f70fb17dfb22878 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Tue, 13 Aug 2019 16:45:03 -0700 Subject: [PATCH] Make File.basename(filename, '.*') include trailing period This matches the behavior of basename(1), and makes it so: File.basename(name, '.*')+File.extname(name) == File.basename(name) Fixes [Bug #15267] --- file.c | 5 ++++- test/ruby/test_file_exhaustive.rb | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/file.c b/file.c index 70f32833ba..b87d56fa8c 100644 --- a/file.c +++ b/file.c @@ -4527,7 +4527,10 @@ ruby_enc_find_basename(const char *name, long *baselen, long *alllen, rb_encodin for (e = 0; q - p < n; Inc(q, end, enc)) { if (*q == '.') e = q; } - if (e) f = e - p; + if (e) { + f = e - p; + if (*(e+1) == '\0') f++; + } else f = n; } diff --git a/test/ruby/test_file_exhaustive.rb b/test/ruby/test_file_exhaustive.rb index 33ed73d9fc..1074c91061 100644 --- a/test/ruby/test_file_exhaustive.rb +++ b/test/ruby/test_file_exhaustive.rb @@ -1227,6 +1227,7 @@ def test_basename assert_equal("foo", File.basename("foo", ".ext")) assert_equal("foo", File.basename("foo.ext", ".ext")) assert_equal("foo", File.basename("foo.ext", ".*")) + assert_equal("foo.", File.basename("foo.", ".*")) end if NTFS @@ -1255,7 +1256,7 @@ def test_basename_strip assert_equal(basename + " ", File.basename(file + " ", ".test")) assert_equal(basename + ".", File.basename(file + ".", ".test")) assert_equal(basename + "::$DATA", File.basename(file + "::$DATA", ".test")) - assert_equal(basename, File.basename(file + ".", ".*")) + assert_equal(basename + '.', File.basename(file + ".", ".*")) basename.chomp!(".test") assert_equal(basename, File.basename(file + " ", ".*")) assert_equal(basename, File.basename(file + "::$DATA", ".*")) -- 2.22.0