diff options
author | NAKAMURA Usaku <usa@ruby-lang.org> | 2019-12-23 11:54:25 +0900 |
---|---|---|
committer | NAKAMURA Usaku <usa@ruby-lang.org> | 2019-12-23 11:54:25 +0900 |
commit | 204dc3f39f12b4e2640555306bd1dd4530344277 (patch) | |
tree | 1532d86db7caeb9b6f5b74b3602918ceb04e11a4 | |
parent | 048f797bf019cdf303d70494fba63d4a4e606462 (diff) |
Revert "Should return "." for File.extname("file.") also on Windows"
We want to introduce consistency and better compatibility with unixen,
but the Windows APIs doues not have consistency fundamentally and
we can not found any logical way...
This reverts commit 61aff0cd189e67fa6f2565639ad0128fa33b88fc.
-rw-r--r-- | file.c | 22 | ||||
-rw-r--r-- | spec/ruby/core/file/extname_spec.rb | 4 | ||||
-rw-r--r-- | test/ruby/test_file_exhaustive.rb | 6 | ||||
-rw-r--r-- | test/ruby/test_path.rb | 6 |
4 files changed, 15 insertions, 23 deletions
@@ -4711,26 +4711,13 @@ ruby_enc_find_extname(const char *name, long *len, rb_encoding *enc) while (*p) { if (*p == '.' || istrailinggarbage(*p)) { #if USE_NTFS - const char *first = 0, *last, *dot; - if (*p == '.') first = p; - last = p++; - dot = last; + const char *last = p++, *dot = last; while (istrailinggarbage(*p)) { - if (*p == '.') { - dot = p; - if (!first) { - first = p; - } - } + if (*p == '.') dot = p; p++; } if (!*p || isADS(*p)) { - if (first == dot && e == 0) { - e = first; - } - else { - p = last; - } + p = last; break; } if (*last == '.' || dot > last) e = dot; @@ -4779,7 +4766,8 @@ ruby_enc_find_extname(const char *name, long *len, rb_encoding *enc) * File.extname("test.rb") #=> ".rb" * File.extname("a/b/d/test.rb") #=> ".rb" * File.extname(".a/b/d/test.rb") #=> ".rb" - * File.extname("foo.") #=> "." + * File.extname("foo.") #=> "" on Windows + * File.extname("foo.") #=> "." on non-Windows * File.extname("test") #=> "" * File.extname(".profile") #=> "" * File.extname(".profile.sh") #=> ".sh" diff --git a/spec/ruby/core/file/extname_spec.rb b/spec/ruby/core/file/extname_spec.rb index 79290960fb..e9b53bc24d 100644 --- a/spec/ruby/core/file/extname_spec.rb +++ b/spec/ruby/core/file/extname_spec.rb @@ -23,14 +23,14 @@ describe "File.extname" do end describe "for a filename ending with a dot" do - ruby_version_is ""..."2.7" do + guard -> { platform_is :windows or ruby_version_is ""..."2.7" } do it "returns ''" do File.extname(".foo.").should == "" File.extname("foo.").should == "" end end - ruby_version_is "2.7" do + guard -> { platform_is_not :windows and ruby_version_is "2.7" } do it "returns '.'" do File.extname(".foo.").should == "." File.extname("foo.").should == "." diff --git a/test/ruby/test_file_exhaustive.rb b/test/ruby/test_file_exhaustive.rb index de4c21e5ca..975bcb6bc2 100644 --- a/test/ruby/test_file_exhaustive.rb +++ b/test/ruby/test_file_exhaustive.rb @@ -1268,19 +1268,19 @@ class TestFileExhaustive < Test::Unit::TestCase infixes2 = infixes + [".ext "] appendixes = [""] if NTFS - appendixes << " " << [".", ".", ""] << "::$DATA" << "::$DATA.bar" + appendixes << " " << "." << "::$DATA" << "::$DATA.bar" else appendixes << [".", "."] end prefixes.each do |prefix| - appendixes.each do |appendix, ext = "", ext2 = ext| + appendixes.each do |appendix, ext = ""| infixes.each do |infix| path = "#{prefix}foo#{infix}#{appendix}" assert_equal(ext, File.extname(path), "File.extname(#{path.inspect})") end infixes2.each do |infix| path = "#{prefix}foo#{infix}.ext#{appendix}" - assert_equal(ext2.empty? ? ".ext" : appendix, File.extname(path), "File.extname(#{path.inspect})") + assert_equal(ext.empty? ? ".ext" : appendix, File.extname(path), "File.extname(#{path.inspect})") end end end diff --git a/test/ruby/test_path.rb b/test/ruby/test_path.rb index 64111ee805..b35e942a2a 100644 --- a/test/ruby/test_path.rb +++ b/test/ruby/test_path.rb @@ -239,7 +239,11 @@ class TestPath < Test::Unit::TestCase ext = '.' end assert_equal(ext, File.extname('a.rb.')) - assert_equal('.', File.extname('a.')) + if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM + # trailing spaces and dots are ignored on NTFS. + ext = '' + end + assert_equal(ext, File.extname('a.')) assert_equal('', File.extname('.x')) assert_equal('', File.extname('..x')) end |