[#46105] [ruby-trunk - Feature #6687][Open] Enumerable#with — "merborne (kyo endo)" <redmine@...>

14 messages 2012/07/02

[#46133] [ruby-trunk - Feature #6688][Open] Object#replace — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

24 messages 2012/07/03

[#46160] [ruby-trunk - Feature #6693][Open] Don't warn for unused variables starting with _ — "marcandre (Marc-Andre Lafortune)" <ruby-core@...>

15 messages 2012/07/04

[#46200] [ruby-trunk - Bug #6702][Open] Date should be either required or not — "rosenfeld (Rodrigo Rosenfeld Rosas)" <rr.rosas@...>

14 messages 2012/07/05

[#46296] [ruby-trunk - Feature #6717][Open] Method like #instance_eval that returns self (like #tap) — "alexeymuranov (Alexey Muranov)" <redmine@...>

10 messages 2012/07/10

[#46320] [ruby-trunk - Feature #6721][Open] Object#yield_self — "alexeymuranov (Alexey Muranov)" <redmine@...>

25 messages 2012/07/11

[#46339] [ruby-trunk - Bug #6724][Open] waaaaaaant! ( — "zenspider (Ryan Davis)" <redmine@...>

11 messages 2012/07/11

[#46377] [ruby-trunk - Feature #6727][Open] Add Array#rest (with implementation) — "duckinator (Nick Markwell)" <nick@...>

25 messages 2012/07/13

[#46492] [ruby-trunk - Feature #6737][Open] Add Hash#read and alias as #[]. — "trans (Thomas Sawyer)" <transfire@...>

12 messages 2012/07/15

[#46500] [ruby-trunk - Feature #6739][Open] One-line rescue statement should support specifying an exception class — Quintus (Marvin Gülker) <sutniuq@...>

22 messages 2012/07/15

[#46562] [ruby-trunk - Feature #6758][Open] Object#sequence — "merborne (kyo endo)" <redmine@...>

19 messages 2012/07/20

[#46574] [ruby-trunk - Feature #6762][Open] Control interrupt timing — "ko1 (Koichi Sasada)" <redmine@...>

39 messages 2012/07/20

[#46641] [ruby-trunk - Bug #6780][Open] cannot compile zlib module, when cross-compiling. — "jinleileiking (lei king)" <jinleileiking@...>

14 messages 2012/07/23

[#46659] [ruby-trunk - Bug #6783][Open] Infinite loop in inspect, not overriding inspect, to_s, and no known circular references. Stepping into inspect in debugger locks it up with 100% CPU. — "garysweaver (Gary Weaver)" <garysweaver@...>

8 messages 2012/07/23

[#46792] [ruby-trunk - Bug #6799][Open] Digest::*.hexdigest returns an ASCII-8BIT String — "Eregon (Benoit Daloze)" <redmine@...>

11 messages 2012/07/26

[#46799] [ruby-trunk - Feature #6801][Open] String#~ for a here document — "merborne (kyo endo)" <redmine@...>

12 messages 2012/07/27

[#46829] [ruby-trunk - Feature #6806][Open] Support functional programming: forbid instance/class variables for ModuleName::method_name, allow for ModuleName.method_name — "alexeymuranov (Alexey Muranov)" <redmine@...>

7 messages 2012/07/28

[#46832] [ruby-trunk - Bug #6807][Open] Can't compile ruby without ruby — "devcurmudgeon (Paul Sherwood)" <storitel@...>

13 messages 2012/07/28

[#46834] [ruby-trunk - Feature #6808][Open] Implicit index for enumerations — "trans (Thomas Sawyer)" <transfire@...>

15 messages 2012/07/28

[#46838] [ruby-trunk - Bug #6810][Open] `module A::B; end` is not equivalent to `module A; module B; end; end` with respect to constant lookup (scope) — "alexeymuranov (Alexey Muranov)" <redmine@...>

17 messages 2012/07/28

[#46896] (Half-baked DRAFT) new `require' framework — SASADA Koichi <ko1@...>

Hi,

22 messages 2012/07/31

[ruby-core:46804] [ruby-trunk - Bug #6608][Rejected] File.join behavior

From: "usa (Usaku NAKAMURA)" <usa@...>
Date: 2012-07-27 08:13:48 UTC
List: ruby-core #46804
Issue #6608 has been updated by usa (Usaku NAKAMURA).

Status changed from Assigned to Rejected

=begin
These behavor is the spec of File.join.

(0) File.join never touchs any charcters in the parameters except
    boundary ones. 
(1) When a separator is passed, File.join respects it.
     cf. File.join('a\\', 'b') #=> 'a\\b'
         File.join('a', '\\b') #=> 'a\\b'
(2) If not, File.join uses File::SEPARATOR
     cf. File.join('a', 'b') #=> 'a/b'
(3) If both of left and right parameters have separators,
    File.join respects the right one.
    The reason is that we guess that the right one is reflecting
    the intention of the programmer more strongly. 
     cf. dir = read_from_user_edited_config_file
         File.join(dir, '/file')  #=> '..some_dir../file'
         File.join(dir, '\\file') #=> '..some_dir..\\file'
    Of course, I strongly recommend that we should use File.expand_path
    in such case.

Your example of Dir.glob is a sad case.
Please understand this as a defect of the specification of Dir.glob, not
of File.join.
=end

----------------------------------------
Bug #6608: File.join behavior
https://bugs.ruby-lang.org/issues/6608#change-28474

Author: Eregon (Benoit Daloze)
Status: Rejected
Priority: Normal
Assignee: usa (Usaku NAKAMURA)
Category: 
Target version: 
ruby -v: ruby 1.9.2p290 (2011-07-09) [i386-mingw32]


Hello,

I would like to know if the current behavior of File.join is intended, and what should be its specification, especially on systems with File::ALT_SEPARATOR.

File.join adds '/' for joining if no separator is present:
File.join('a', 'b') # => "a/b"
And if a forward slash is present or two, it just acts the same:
File.join('a', '/b') or File.join('a/', 'b') # => "a/b" # => "a/b"

(These are expected)

But when a backward slash is present (= File::ALT_SEPARATOR), it seems it is kept only if it is on the right side or no other separator is present:
File.join('a', '\b') or File.join('a\\', 'b') # => "a\\b"
File.join('a/', '\b') # => "a\\b"
but
File.join('a\\', '/b') # => "a/b"

And it seems the right part is never touched, while the left part loses all its separators, unless there are none on the right side.
File.join('a/\/', '\b') # => "a\\b"
File.join('a/\/', '\//b') # => "a\\//b"
File.join('a/\/', 'b') # => "a/\/b"

Ruby is usually giving only forward-slash paths (Dir.getwd) and accepts them only in some cases (Dir.glob).
I think conceptually File.join should remove all "\" and replace them by "/", like File.expand_path does for example.
I guess this is not done for efficiency reasons.
But it also means it might produce not natural behavior:
Dir.glob(File.join('C:', '\WINDOWS', '*')) == Dir.glob('C:\WINDOWS/*') # =>  ["C:WINDOWS/system"] # sounds like a bug, isn't it?
but
Dir.glob(File.join('C:', '/WINDOWS', '*')) # => all files/dirs under C:/WINDOWS

The current RubySpec is a bit misleading in this regard: https://github.com/rubyspec/rubyspec/blob/master/core/file/join_spec.rb#L21-26


-- 
http://bugs.ruby-lang.org/

In This Thread