From: zverok.offline@... Date: 2020-02-18T10:09:44+00:00 Subject: [ruby-core:97188] [Ruby master Bug#14891] Pathname#join has different behaviour to File.join Issue #14891 has been updated by zverok (Victor Shepelev). > I am wondering about the current behavior of Pathname#join, too. Are there any useful use cases for `Pathname.new('/a').join('/c', '/b').to_s #=> "/b"` I believe that `Pathname#join` acts kinda like `cd` in the shell: `cd x` is "go deeper to `x` level" while `cd /x` si "go to the root, then into `/x` folder". I believe it can be useful and desired behavior when working with configs for some authoring systems and devops tools, where you take from config "do 'action' by path 'path'", and config can specify lot of actions relative to app folder (like `touch: "tmp/restart.txt"`), but eventually want to specify something to do in relative-from-root folder (like `read: "/etc/myapp/settings.ini"`). Without following the specification "`/` at the beginning means go to root" it becomes rather ugly. In other words, this: ```ruby # I am just trying to merge pathes explicitly, and receive "unexpected" result: Pathname.new('foo').merge('/bar') ``` ��� might seem "weird", while this: ```ruby @app_path = Path.new(__dir__) # ... @app_path.join(action.target_path) # when target_path is "/foo/bar", it allows to act outside of base dir ``` ��� is desirable (and is NOT achievable if `Pathname's` behavior will be changed) I assume that those finding the behavior less logical think about paths about "just some abstract strings" and `Pathname#join` as a fancy way to write `Array#join(SYSTEM_PATH_DELIMITER)`. But `Pathname` tries to represent "filesystem path object" in a meaningful way, consistent with filesystem's intuitions. ---------------------------------------- Bug #14891: Pathname#join has different behaviour to File.join https://bugs.ruby-lang.org/issues/14891#change-84296 * Author: robotdana (Dana Sherson) * Status: Open * Priority: Normal * ruby -v: 2.6.0-preview2, and before * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- ~~~ ruby Pathname.new('/a').join('/b').to_s # => "/b" File.join(Pathname.new('/a'), '/b').to_s # => "/a/b" ~~~ in my case `'/b'` was in a variable and it wasn't immediately obvious why it wasn't working when I moved to use Pathname This seems to not be desired behaviour as it's different to `File.join`, and this case isn't document anywhere. Can we either change the behaviour to treat the "other" of `Pathname#+` as always relative (possibly just removing a leading slash), or add this case to the documentation? -- https://bugs.ruby-lang.org/ Unsubscribe: