Case of drive letter


#1

Using MRI on Windows, Dir.pwd can use either lower-case or upper-case
for the drive letter (“C:/” or “c:/”) depending on the Command Prompt it
is run from. However, FILE always uses lower-case drive letter. This
can cause problems when comparing Dir.pwd and FILE. For eg,
Pathname#relative_path_fromhttp://ruby-doc.org/core/classes/Pathname.html#M001745
raises an ArgumentError if the arguments use different cases for the
drive letter.

C:\Users\sborde> cat c:\bugs\rb1.rb
require ‘pathname’
Pathname.new(Dir.pwd).relative_path_from(Pathname.new(FILE))

C:\Users\sborde> c:\Ruby\bin\ruby.exe c:\bugs\rb1.rb
c:/Ruby/lib/ruby/1.8/pathname.rb:709:in `relative_path_from’: different
prefix:
“C:/” and “c:/bugs/rb1.rb” (ArgumentError)
from c:/bugs/rb1.rb:2

I did not find any good documentation on which case is used by Command
Prompt, but https://lists.ubuntu.com/archives/bazaar/2006q2/013921.html
refers to the issue. I can create Command Prompts with either case by
creating a shortcut on the desktop, and specifying a “Start in” folder
property for the shortcut. Command Prompt will use the case specified
for the “Start in” folder.

Does anyone have experience dealing with this issue? What is the
recommended solution? I would rather not check the case of the drive
letter manually. I looked for APIs which would convert the drive letter
to lower-case, but could not find anything.

Thanks,
Shri


#2

(Responding late … hopefully this is still useful)

FILE always uses lower-case drive letter

FILE is just the value you gave to require/load. FILE and
$PROGRAM_NAME only get munged with when running ruby.exe, but it doesn’t
touch casing, only changes all directory separators to ‘/’.

c:\dev\foo.rb

module Foo
def self.file
FILE
end
end
puts Foo.file

c:\dev\ironruby>irb
irb(main):001:0> load ‘C:\dev\foo.rb’
“C:\dev\foo.rb”
=> true

c:\dev\ironruby>irb
irb(main):001:0> load ‘c:\dev\foo.rb’
“c:\dev\foo.rb”
=> true

c:\dev\ironruby>ruby c:\dev\foo.rb
c:/dev/foo.rb

c:\dev\ironruby>ruby C:\dev\foo.rb
C:/dev/foo.rb

My recent FILE changes made IronRuby work identically to MRI, but
that only changes the path separator, does nothing with casing. IronRuby
behaves the same as this.

~js

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Shri B.
Sent: Tuesday, April 07, 2009 11:36 AM
To: removed_email_address@domain.invalid
Subject: [Ironruby-core] Case of drive letter

Using MRI on Windows, Dir.pwd can use either lower-case or upper-case
for the drive letter (“C:/” or “c:/”) depending on the Command Prompt it
is run from. However, FILE always uses lower-case drive letter. This
can cause problems when comparing Dir.pwd and FILE. For eg,
Pathname#relative_path_fromhttp://ruby-doc.org/core/classes/Pathname.html#M001745
raises an ArgumentError if the arguments use different cases for the
drive letter.

C:\Users\sborde> cat c:\bugs\rb1.rb
require ‘pathname’
Pathname.new(Dir.pwd).relative_path_from(Pathname.new(FILE))

C:\Users\sborde> c:\Ruby\bin\ruby.exe c:\bugs\rb1.rb
c:/Ruby/lib/ruby/1.8/pathname.rb:709:in `relative_path_from’: different
prefix:
“C:/” and “c:/bugs/rb1.rb” (ArgumentError)
from c:/bugs/rb1.rb:2

I did not find any good documentation on which case is used by Command
Prompt, but https://lists.ubuntu.com/archives/bazaar/2006q2/013921.html
refers to the issue. I can create Command Prompts with either case by
creating a shortcut on the desktop, and specifying a “Start in” folder
property for the shortcut. Command Prompt will use the case specified
for the “Start in” folder.

Does anyone have experience dealing with this issue? What is the
recommended solution? I would rather not check the case of the drive
letter manually. I looked for APIs which would convert the drive letter
to lower-case, but could not find anything.

Thanks,
Shri


#3

The case issue is tracked by the following MRI bug -
http://redmine.ruby-lang.org/issues/show/1266. It will be fixed in some
future version of MRI.

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Jimmy
Schementi
Sent: Tuesday, April 21, 2009 10:59 AM
To: removed_email_address@domain.invalid
Subject: Re: [Ironruby-core] Case of drive letter

(Responding late … hopefully this is still useful)

FILE always uses lower-case drive letter

FILE is just the value you gave to require/load. FILE and
$PROGRAM_NAME only get munged with when running ruby.exe, but it doesn’t
touch casing, only changes all directory separators to ‘/’.

c:\dev\foo.rb

module Foo
def self.file
FILE
end
end
puts Foo.file

c:\dev\ironruby>irb
irb(main):001:0> load ‘C:\dev\foo.rb’
“C:\dev\foo.rb”
=> true

c:\dev\ironruby>irb
irb(main):001:0> load ‘c:\dev\foo.rb’
“c:\dev\foo.rb”
=> true

c:\dev\ironruby>ruby c:\dev\foo.rb
c:/dev/foo.rb

c:\dev\ironruby>ruby C:\dev\foo.rb
C:/dev/foo.rb

My recent FILE changes made IronRuby work identically to MRI, but
that only changes the path separator, does nothing with casing. IronRuby
behaves the same as this.

~js

From: removed_email_address@domain.invalid
[mailto:removed_email_address@domain.invalid] On Behalf Of Shri B.
Sent: Tuesday, April 07, 2009 11:36 AM
To: removed_email_address@domain.invalid
Subject: [Ironruby-core] Case of drive letter

Using MRI on Windows, Dir.pwd can use either lower-case or upper-case
for the drive letter (“C:/” or “c:/”) depending on the Command Prompt it
is run from. However, FILE always uses lower-case drive letter. This
can cause problems when comparing Dir.pwd and FILE. For eg,
Pathname#relative_path_fromhttp://ruby-doc.org/core/classes/Pathname.html#M001745
raises an ArgumentError if the arguments use different cases for the
drive letter.

C:\Users\sborde> cat c:\bugs\rb1.rb
require ‘pathname’
Pathname.new(Dir.pwd).relative_path_from(Pathname.new(FILE))

C:\Users\sborde> c:\Ruby\bin\ruby.exe c:\bugs\rb1.rb
c:/Ruby/lib/ruby/1.8/pathname.rb:709:in `relative_path_from’: different
prefix:
“C:/” and “c:/bugs/rb1.rb” (ArgumentError)
from c:/bugs/rb1.rb:2

I did not find any good documentation on which case is used by Command
Prompt, but https://lists.ubuntu.com/archives/bazaar/2006q2/013921.html
refers to the issue. I can create Command Prompts with either case by
creating a shortcut on the desktop, and specifying a “Start in” folder
property for the shortcut. Command Prompt will use the case specified
for the “Start in” folder.

Does anyone have experience dealing with this issue? What is the
recommended solution? I would rather not check the case of the drive
letter manually. I looked for APIs which would convert the drive letter
to lower-case, but could not find anything.

Thanks,
Shri