Project

General

Profile

Bug #22194

Updated by andrykonchin (Andrew Konchin) 3 months ago

Both `realpath` and `realdirpath` methods accept a `path` parameter and try to return result in the `path`'s encoding. 

 `realpath`: 

 ```ruby 
 File.realpath(".rubocop.yml").encoding # => #<Encoding:UTF-8> 
 File.realpath(".rubocop.yml".encode("US-ASCII")).encoding # => #<Encoding:US-ASCII> 
 ``` 

 `realdirpath`: 

 ```ruby 
 File.realdirpath("src").encoding # => #<Encoding:UTF-8> 
 File.realdirpath("src".encode("US-ASCII")).encoding # => #<Encoding:US-ASCII> 
 ``` 

 But it's possible that `path`'s encoding isn't compatible with to the filesystem's one (that's is common to be UTF-8 on Linux and macOS), that's converting from the filesystem's encoding to `path`'s encoding fails. 

 In this case `realpath` and `realdirpath` behaves differently - `realpath` just "forces" encoding to `path`'s one (and as fallback to filesystem's and then to binary if a string becomes broken) and `realdirpath` just returns a string in the filesystem's encoding. 

 `realpath`: 

 ```ruby 
 File.realpath(".".encode(Encoding::ISO_8859_1), "test_dir_🦊").encoding # => #<Encoding:ISO-8859-1> 
 ``` 

 `realdirpath`: 

 ```ruby 
 File.realdirpath(".".encode(Encoding::ISO_8859_1), "test_dir_🦊").encoding # => #<Encoding:UTF-8> 
 ``` 

 It makes sense for the methods to handle this edge case consistently. 

Back