[Rubygems-developers] [ rubygems-Bugs-25882 ] Handling of Windows paths broken in 1.3.3

noreply at rubyforge.org noreply at rubyforge.org
Mon Sep 13 10:04:03 EDT 2010


Bugs item #25882, was opened at 2009-05-12 08:01
You can respond by visiting: 
http://rubyforge.org/tracker/?func=detail&atid=575&aid=25882&group_id=126

Category: `gem install` command
Group: v1.3.x
Status: Closed
Resolution: Accepted
Priority: 3
Submitted By: Lars Christensen (larsch)
Assigned to: Daniel Berger (djberg96)
Summary: Handling of Windows paths broken in 1.3.3

Initial Comment:
Installing gems from local drives other than the current is broken on Windows. RubyGems strips the drive letter (through using the URI class for something which isn't an URI).

C:\> gem install p:\path\to\mygem-2.1.18.gem

ERROR:  While executing gem ... (Errno::ENOENT)
    No such file or directory - /path/to/mygem-2.1.18.gem

Then I tried to pass a valid URI:

C:\> gem install file:///p:/path/to/mygem-2.1.18.gem

But that doesn't work either;

ERROR:  could not find gem file:///p:/path/to/mygem-2.1.18.gem locally or in a repository

I believe this is because URI#path returns "/p:/path/to/mygem..." (with leading slash), which is not a valid path on Windows.

Finally, I attempted to hack RubyGems to prefix file:/// itself, but I don't understand the reason for this line of code in remote_fetcher.rb:

        remote_gem_path = File.join(path, 'gems', gem_file_name)

That causes this error instead:

ERROR:  While executing gem ... (Errno::ENOENT)
    No such file or directory - p:/path/to/gems/mygem-2.1.18.gem

Notice the extra /gems/ path.


----------------------------------------------------------------------

Comment By: Saurabh Doshi (cashkap)
Date: 2010-09-13 10:04

Message:
I have used the One Click Ruby installer(1.9.2) and have installed it as C:\Ruby192.

I am facing the same error:

C:\Ruby192\bin>gem install rake
ERROR:  While executing gem ... (Errno::ENOENT)
    No such file or directory - Z:/

I have tried changing the default mapping from z: to c: but havent found success. I don't have admin priv on my m/c.

can some please guide me on this

Thanks,

----------------------------------------------------------------------

Comment By: Daniel Berger (djberg96)
Date: 2009-05-12 13:55

Message:
Fixed in SVN.

Thanks for the report.

Dan

----------------------------------------------------------------------

Comment By: Daniel Berger (djberg96)
Date: 2009-05-12 11:59

Message:
Oops, let's update that to "if Gem.win_platform && source_uri.scheme"

Regards,

Dan

----------------------------------------------------------------------

Comment By: Daniel Berger (djberg96)
Date: 2009-05-12 11:51

Message:
I think this patch does what we want:

--- remote_fetcher.orig Sun Apr 12 13:52:46 2009
+++ remote_fetcher.rb   Tue May 12 09:35:30 2009
@@ -139,7 +139,11 @@
         Gem.configuration.really_verbose
     when nil then # TODO test for local overriding cache
       begin
-        FileUtils.cp URI.unescape(source_uri.path), local_gem_path
+        if Gem.win_platform?
+          FileUtils.cp URI.unescape(source_uri.scheme + ':' + source_uri.path), local_gem_path
+        else
+          FileUtils.cp URI.unescape(source_uri.path), local_gem_path
+        end
       rescue Errno::EACCES
         local_gem_path = source_uri.to_s
       end

----------------------------------------------------------------------

Comment By: Daniel Berger (djberg96)
Date: 2009-05-12 09:46

Message:
Looks like a bug in line 142 of remote_fetcher.rb related to the URI class and the fact that we're stripping the scheme off of Windows paths.

It works for "C:" because, iirc, certain Ruby core File methods assume "C:" if no drive is found. We'll have to fix this.

Regards,

Dan

----------------------------------------------------------------------

Comment By: Daniel Berger (djberg96)
Date: 2009-05-12 09:22

Message:
Well, this is odd. I tried installing from an explicit path using "C:\Documents and Settings\djberge". That worked fine. But, when I tried to install from a drive other than "C:", things went bad:

C:\Documents and Settings\djberge>gem install "z:\djberge on my mac\documents\workspace\ptools\ptools-1.1.7.gem" --verbose --debug
Exception `NameError' at C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:161 - uninitialized constant Gem::Commands::InstallCommand
Exception `IOError' at C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/format.rb:50 - closed stream
Installing gem ptools-1.1.7
Exception `Errno::ENOENT' at C:/Ruby/lib/ruby/1.8/fileutils.rb:1200 - No such file or directory - /djberge on my mac/documents/workspace/ptools/ptools-1.1.7.gem

ERROR:  While executing gem ... (Errno::ENOENT)
    No such file or directory - /djberge on my mac/documents/workspace/ptools/ptools-1.1.7.gem
        C:/Ruby/lib/ruby/1.8/fileutils.rb:1200:in `stat'
        C:/Ruby/lib/ruby/1.8/fileutils.rb:1200:in `lstat'
        C:/Ruby/lib/ruby/1.8/fileutils.rb:1178:in `stat'
        C:/Ruby/lib/ruby/1.8/fileutils.rb:1260:in `copy_file'
        C:/Ruby/lib/ruby/1.8/fileutils.rb:463:in `copy_file'
        C:/Ruby/lib/ruby/1.8/fileutils.rb:383:in `cp'
        C:/Ruby/lib/ruby/1.8/fileutils.rb:1395:in `fu_each_src_dest'
        C:/Ruby/lib/ruby/1.8/fileutils.rb:1411:in `fu_each_src_dest0'
        C:/Ruby/lib/ruby/1.8/fileutils.rb:1393:in `fu_each_src_dest'
        C:/Ruby/lib/ruby/1.8/fileutils.rb:382:in `cp'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/remote_fetcher.rb:142:in `download'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/dependency_installer.rb:232:in `install'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/dependency_installer.rb:222:in `each'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/dependency_installer.rb:222:in `install'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/commands/install_command.rb:78:in `execute'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/commands/install_command.rb:75:in `each'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/commands/install_command.rb:75:in `execute'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/command.rb:254:in `invoke'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:132:in `process_args'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:102:in `run'
        C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/gem_runner.rb:58:in `run'
        C:/Ruby/bin/gem:21

I'll have to investigate further to determine if this is a bug in rubygems or fileutils.

Regards,

Dan

----------------------------------------------------------------------

Comment By: Daniel Berger (djberg96)
Date: 2009-05-12 08:20

Message:
The use of file urls is meant for use with the --source flag (i.e. from a local repository), which is why the method includes the 'gems' directory.

However, the "gem install p:\path\to\mygem-2.1.18.gem" should work. I'll take a look.

Regards,

Dan

----------------------------------------------------------------------

You can respond by visiting: 
http://rubyforge.org/tracker/?func=detail&atid=575&aid=25882&group_id=126


More information about the Rubygems-developers mailing list