rubygems-update 0.8.6 → 0.8.8

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubygems-update might be problematic. Click here for more details.

Files changed (42) hide show
  1. data/ChangeLog +134 -0
  2. data/Rakefile +41 -17
  3. data/bin/gemwhich +61 -0
  4. data/examples/application/an-app.gemspec +1 -0
  5. data/lib/gemconfigure.rb +18 -0
  6. data/lib/rubygems.rb +65 -47
  7. data/lib/rubygems/cmd_manager.rb +3 -1
  8. data/lib/rubygems/command.rb +4 -0
  9. data/lib/rubygems/config_file.rb +2 -6
  10. data/lib/rubygems/custom_require.rb +2 -2
  11. data/lib/rubygems/dependency_list.rb +131 -0
  12. data/lib/rubygems/deployment.rb +265 -0
  13. data/lib/rubygems/doc_manager.rb +1 -0
  14. data/lib/rubygems/gem_commands.rb +216 -15
  15. data/lib/rubygems/installer.rb +111 -286
  16. data/lib/rubygems/remote_installer.rb +16 -6
  17. data/lib/rubygems/rubygems_version.rb +1 -1
  18. data/lib/rubygems/source_index.rb +11 -5
  19. data/lib/rubygems/specification.rb +5 -0
  20. data/lib/rubygems/version.rb +146 -129
  21. data/test/test_configfile.rb +1 -1
  22. data/test/test_dependency_list.rb +163 -0
  23. data/test/test_deployment.rb +93 -0
  24. data/test/test_remote_fetcher.rb +38 -36
  25. metadata +23 -47
  26. data/test/data/a-0.0.1.gem +0 -0
  27. data/test/data/a-0.0.2.gem +0 -0
  28. data/test/data/b-0.0.2.gem +0 -0
  29. data/test/data/c-1.2.gem +0 -0
  30. data/test/data/gemhome/cache/a-0.0.1.gem +0 -0
  31. data/test/data/gemhome/cache/a-0.0.2.gem +0 -0
  32. data/test/data/gemhome/cache/b-0.0.2.gem +0 -0
  33. data/test/data/gemhome/cache/c-1.2.gem +0 -0
  34. data/test/data/gemhome/gems/a-0.0.1/lib/code.rb +0 -1
  35. data/test/data/gemhome/gems/a-0.0.2/lib/code.rb +0 -1
  36. data/test/data/gemhome/gems/b-0.0.2/lib/code.rb +0 -1
  37. data/test/data/gemhome/gems/c-1.2/lib/code.rb +0 -1
  38. data/test/data/gemhome/specifications/a-0.0.1.gemspec +0 -8
  39. data/test/data/gemhome/specifications/a-0.0.2.gemspec +0 -8
  40. data/test/data/gemhome/specifications/b-0.0.2.gemspec +0 -8
  41. data/test/data/gemhome/specifications/c-1.2.gemspec +0 -8
  42. data/test/data/one/one-0.0.1.gem +0 -0
data/ChangeLog CHANGED
@@ -1,3 +1,137 @@
1
+ 2005-03-13 Gavin Sinclair <gsinclair@soyabean.com.au>
2
+
3
+ * lib/rubygems/installer.rb: Removed all code relating to library
4
+ stubs as we haven't generated them for ages.
5
+
6
+ 2005-03-13 Gavin Sinclair <gsinclair@soyabean.com.au>
7
+
8
+ * lib/rubygems/installer.rb (Gem::Installer#shebang): Refactored and
9
+ stripped result to avoid ^M issues.
10
+
11
+ 2005-03-11 Jim Weirich <jim@weirichhouse.org>
12
+
13
+ * lib/rubygems/gem_commands.rb (Gem::DependencyCommand): Added a
14
+ new command "gem dependency" to show the dependencies of an
15
+ installed gem.
16
+
17
+ * lib/rubygems/cmd_manager.rb (Gem::CommandManager::initialize):
18
+ Added DependencyCommand to the command manager registrar.
19
+
20
+ * lib/rubygems/version.rb (Gem::Requirement): Unnested Requirement
21
+ from the Version class. There was no benefit to having it nested.
22
+ Gem::Version::Requirement is set to point to the new class so to
23
+ be compatible with old gems.
24
+
25
+ * lib/rubygems/installer.rb (Gem::Uninstaller::ask_if_ok): Changed
26
+ uninstaller confirm message to read 'Continue with uninstall'.
27
+ Its clearer that way.
28
+
29
+ * lib/rubygems.rb (Gem::Exception::required_location): Switch to
30
+ use SourceIndex#find_name rather than search. Made sure a nil
31
+ value is returned with a path is not found.
32
+
33
+ * lib/rubygems/source_index.rb (Gem::SourceIndex::search): Changed
34
+ parameter name to gem_pattern to emphasize using Regex in search.
35
+ (Gem::SourceIndex::find_name): Added find_name to handle the
36
+ common case of searching for an exact match on the short name.
37
+
38
+ * lib/rubygems.rb (Gem::Exception::activate): Make sure that
39
+ activate more closely adheres to honoring the auto_require=>false
40
+ request.
41
+ (Gem::Exception::report_activate_error): Out of line error
42
+ reporting for activate.
43
+
44
+ * lib/rubygems/remote_installer.rb
45
+ (Gem::RemoteInstaller::find_dependencies_not_installed): Found
46
+ another location that was using require_gem with auto_require.
47
+ Fixed to use :auto_require=>false.
48
+
49
+ * lib/rubygems/gem_commands.rb
50
+ (Gem::InstallUpdateOptions::add_install_update_options): Added
51
+ --ignore-dependencies option. Still needs to be wired to logic.
52
+
53
+ * lib/rubygems/installer.rb (Gem::Installer::install): Added call
54
+ to require_gem_with_options.
55
+
56
+ * lib/rubygems.rb (Kernel::require_gem_with_options): Added to
57
+ allow easier specification of the autorequire flag for
58
+ Gem.activate.
59
+
60
+ 2005-03-10 Jim Weirich <jim@weirichhouse.org>
61
+
62
+ * lib/rubygems/remote_installer.rb
63
+ (Gem::RemoteSourceFetcher::normalize_uri): Normialize a URI to
64
+ start with http:// if it does not already.
65
+
66
+ * test/test_deployment.rb (TestDeployment::xtest_deploy_sources):
67
+ Disabled this test. It is part of the new deployment software and
68
+ is not working yet.
69
+
70
+ 2005-03-09 Jim Weirich <jim@weirichhouse.org>
71
+
72
+ * lib/gemconfigure.rb (Gem::self): Added to aid dynamic
73
+ versioning.
74
+
75
+ * lib/rubygems/command.rb (Gem::Command::command_manager): Moved
76
+ command_manager to base class.
77
+
78
+ * lib/rubygems/gem_commands.rb (Gem::CleanupCommand::execute):
79
+ Both implicit and explicit gems now work with cleanup.
80
+
81
+ 2005-03-08 Jim Weirich <jim@weirichhouse.org>
82
+
83
+ * lib/rubygems/installer.rb (Gem::Uninstaller::ok_to_remove):
84
+ Fixed source index to be loaded from the installed gems when doing
85
+ an "OK TO REMOVE" dependency check.
86
+
87
+ 2005-03-06 Rich Kilmer <rich@infoether.com>
88
+ * lib/rubygems/deployment.rb: beginning of a deployment capability
89
+
90
+ * test/test_deployment.rb: first tests of new deployment system
91
+
92
+ 2005-03-04 Chad Fowler <chad@chadfowler.com>
93
+ * lib/rubygems/gem_commands.rb: Small bugfix for the case when you
94
+ pass in a gem name (or more) to cleanup for the cleanup command.
95
+
96
+ 2005-03-04 Jim Weirich <jim@weirichhouse.org>
97
+
98
+ * lib/rubygems/installer.rb (Gem::Uninstaller::ok_to_remove):
99
+ Reworked logic in uninstall to be intelligent about dependencies.
100
+ We only complain about dependencies if removing a gem will cause a
101
+ dependency error. The uninstaller now checks for :ignore, :all
102
+ and :executables options.
103
+
104
+ * lib/rubygems/cmd_manager.rb (Gem::CommandManager::initialize):
105
+ Registered Cleanup command.
106
+
107
+ * lib/rubygems/gem_commands.rb (Gem::CleanupCommand): Added
108
+ Cleanup command to gem.
109
+ (Gem::UninstallCommand::initialize): Added --all, --ignore and
110
+ --executables options to uninstall. This helps to avoid excessive
111
+ YESes all the time.
112
+
113
+ 2005-02-28 Jim Weirich <jim@weirichhouse.org>
114
+
115
+ * lib/rubygems/remote_installer.rb
116
+ (Gem::LocalSourceInfoCache::write_cache): Open cache file in
117
+ binary mode.
118
+
119
+ 2005-02-28 Chad Fowler <chad@chadfowler.com>
120
+ * lib/rubygems/config_file.rb: don't warn about not being able to
121
+ find config file.
122
+ * lib/rubygems/doc_manager.rb: (for DHH) don't install rdoc docs for
123
+ * lib/rubygems/gem_commands.rb: Print which gems are updated on 'gem
124
+ update'. If --system is used, report that the rubygems system
125
+ software has been updated.
126
+ * lib/rubygems/installer.rb: Cleaned up the uninstall has_dependents
127
+ logic and output. It was misleading and buggy before.
128
+
129
+ 2005-02-27 Jim Weirich <jim@weirichhouse.org>
130
+
131
+ * lib/rubygems/config_file.rb
132
+ (Gem::ConfigFile::default_config_file_name): Fixed bug in finding
133
+ home directory for the .gemrc file.
134
+
1
135
  2005-02-27 Chad Fowler <chad@chadfowler.com>
2
136
 
3
137
  * Released 0.8.6
data/Rakefile CHANGED
@@ -7,8 +7,22 @@ require 'rake/packagetask'
7
7
  require 'rake/gempackagetask'
8
8
  require 'rake/rdoctask'
9
9
 
10
+ def announce(msg='')
11
+ STDERR.puts msg
12
+ end
13
+
10
14
  PKG_NAME = 'rubygems'
11
- PKG_VERSION = `ruby -Ilib bin/gem environment packageversion`.chomp
15
+ def package_version
16
+ `ruby -Ilib bin/gem environment packageversion`.chomp
17
+ end
18
+
19
+ if ENV['REL']
20
+ PKG_VERSION = ENV['REL']
21
+ CURRENT_VERSION = package_version
22
+ else
23
+ PKG_VERSION = package_version
24
+ CURRENT_VERSION = PKG_VERSION
25
+ end
12
26
 
13
27
  CLEAN.include("COMMENTS")
14
28
  CLOBBER.include(
@@ -68,10 +82,6 @@ end
68
82
  # --------------------------------------------------------------------
69
83
  # Creating a release
70
84
 
71
- def announce(msg='')
72
- STDERR.puts msg
73
- end
74
-
75
85
  desc "Make a new release"
76
86
  task :release => [
77
87
  :prerelease,
@@ -83,7 +93,7 @@ task :release => [
83
93
 
84
94
  announce
85
95
  announce "**************************************************************"
86
- announce "* Release #{ENV['REL']} Complete."
96
+ announce "* Release #{PKG_VERSION} Complete."
87
97
  announce "* Packages ready to upload."
88
98
  announce "**************************************************************"
89
99
  announce
@@ -93,8 +103,8 @@ end
93
103
  task :prerelease do
94
104
  announce
95
105
  announce "**************************************************************"
96
- announce "* Making RubyGem Release #{ENV['REL']}"
97
- announce "* (current version #{PKG_VERSION})"
106
+ announce "* Making RubyGem Release #{PKG_VERSION}"
107
+ announce "* (current version #{CURRENT_VERSION})"
98
108
  announce "**************************************************************"
99
109
  announce
100
110
 
@@ -105,7 +115,7 @@ task :prerelease do
105
115
 
106
116
  # Is the release different than the current release.
107
117
  # (or is REUSE set?)
108
- if PKG_VERSION == ENV['REL'] && ! ENV['REUSE']
118
+ if PKG_VERSION == CURRENT_VERSION && ! ENV['REUSE']
109
119
  fail "Current version is #{PKG_VERSION}, must specify REUSE=tag_suffix to reuse version"
110
120
  end
111
121
 
@@ -123,27 +133,35 @@ task :prerelease do
123
133
  end
124
134
 
125
135
  task :update_version => [:prerelease] do
126
- if PKG_VERSION == ENV['REL']
136
+ if PKG_VERSION == CURRENT_VERSION
127
137
  announce "No version change ... skipping version update"
128
138
  else
129
- announce "Updating RubyGem version to #{ENV['REL']}"
139
+ announce "Updating RubyGem version to #{PKG_VERSION}"
130
140
  open("lib/rubygems/rubygems_version.rb", "w") do |f|
131
141
  f.puts "# DO NOT EDIT"
132
142
  f.puts "# This file is auto-generated by build scripts."
133
143
  f.puts "# See: rake update_version"
134
144
  f.puts "module Gem"
135
- f.puts " RubyGemsVersion = '#{ENV['REL']}'"
145
+ f.puts " RubyGemsVersion = '#{PKG_VERSION}'"
136
146
  f.puts "end"
137
147
  end
138
- sh %{cvs commit -m "Updated to version #{ENV['REL']}" lib/rubygems/rubygems_version.rb}
148
+ if ENV['RELTEST']
149
+ announce "Release Task Testing, skipping commiting of new version"
150
+ else
151
+ sh %{cvs commit -m "Updated to version #{PKG_VERSION}" lib/rubygems/rubygems_version.rb}
152
+ end
139
153
  end
140
154
  end
141
155
 
142
156
  task :tag => [:prerelease] do
143
- reltag = "REL_#{ENV['REL'].gsub(/\./, '_')}"
157
+ reltag = "REL_#{PKG_VERSION.gsub(/\./, '_')}"
144
158
  reltag << ENV['REUSE'].gsub(/\./, '_') if ENV['REUSE']
145
159
  announce "Tagging CVS with [#{reltag}]"
146
- sh %{cvs tag #{reltag}}
160
+ if ENV['RELTEST']
161
+ announce "Release Task Testing, skipping CVS tagging"
162
+ else
163
+ sh %{cvs tag #{reltag}}
164
+ end
147
165
  end
148
166
 
149
167
  # --------------------------------------------------------------------
@@ -214,7 +232,7 @@ Rake::PackageTask.new("package") do |p|
214
232
  p.package_files = PKG_FILES
215
233
  end
216
234
 
217
- spec = Gem::Specification.new do |s|
235
+ Spec = Gem::Specification.new do |s|
218
236
  s.name = PKG_NAME + "-update"
219
237
  s.version = PKG_VERSION
220
238
  s.summary = "RubyGems Update GEM"
@@ -232,7 +250,13 @@ installation of RubyGems before this update can be applied.
232
250
  s.executables = ["update_rubygems"]
233
251
  end
234
252
 
235
- Rake::GemPackageTask.new(spec) do |p| end
253
+ Rake::GemPackageTask.new(Spec) do |p| end
254
+
255
+ desc "Build the Gem spec file for the rubygems-update package"
256
+ task :gemspec => "pkg/rubygems-update.gemspec"
257
+ file "pkg/rubygems-update.gemspec" => ["pkg", "Rakefile"] do |t|
258
+ open(t.name, "w") do |f| f.puts Spec.to_yaml end
259
+ end
236
260
 
237
261
  # Install RubyGems
238
262
 
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'optparse'
5
+
6
+ EXT = %w( .rb .rbw .so .dll )
7
+
8
+ options = OptionParser.new
9
+ options.banner = "gemwhich -- Find the location of a library module."
10
+ options.separator("")
11
+ options.separator("Usage: gemwhich [options] libname...")
12
+ options.on_tail('-v', '--verbose',
13
+ "Enable verbose output"
14
+ ) do |value|
15
+ $verbose = value
16
+ end
17
+ options.on_tail('-h', '--help',
18
+ "Display this help message"
19
+ ) do |value|
20
+ puts options
21
+ exit
22
+ end
23
+ ARGV << '-h' if ARGV.empty?
24
+
25
+ begin
26
+ options.parse!(ARGV)
27
+ rescue OptionParser::InvalidOption => ex
28
+ puts "Error: #{ex.message}"
29
+ exit
30
+ end
31
+
32
+ def find_path(package_name, dirs)
33
+ dirs.each do |dir|
34
+ EXT.each do |ext|
35
+ full_path = File.join(dir, "#{package_name}#{ext}")
36
+ if File.exist?(full_path)
37
+ return full_path
38
+ end
39
+ end
40
+ end
41
+ nil
42
+ end
43
+
44
+ searcher = Gem::GemPathSearcher.new
45
+ ARGV.each do |arg|
46
+ dirs = $LOAD_PATH
47
+ spec = searcher.find(arg)
48
+ if spec
49
+ dirs =
50
+ spec.require_paths.collect { |d|
51
+ File.join(spec.full_gem_path,d)
52
+ } + $LOAD_PATH
53
+ puts "(checking gem #{spec.full_name} for #{arg})" if $verbose
54
+ end
55
+ path = find_path(arg, dirs)
56
+ if path
57
+ puts path
58
+ else
59
+ puts "Can't find #{arg}"
60
+ end
61
+ end
@@ -13,6 +13,7 @@ spec = Gem::Specification.new do |s|
13
13
  s.require_path = 'lib'
14
14
  s.autorequire = 'somefunctionality'
15
15
  s.executables = ["myapp"]
16
+ s.has_rdoc = false
16
17
  #s.extra_rdoc_files = ["README", "Changes.rdoc"]
17
18
  #s.default_executable = "myapp"
18
19
  s.bindir = "bin"
@@ -0,0 +1,18 @@
1
+ module Gem
2
+
3
+ # Activate the gems specfied by the gem_pairs list.
4
+ #
5
+ # gem_pairs ::
6
+ # List of gem/version pairs.
7
+ # Eg. [['rake', '= 0.8.15'], ['RedCloth', '~> 3.0']]
8
+ # options ::
9
+ # options[:verbose] => print gems as they are required.
10
+ #
11
+ def self.configure(gem_pairs, options={})
12
+ gem_pairs.each do |name, version|
13
+ require 'rubygems'
14
+ puts "Requiring gem #{name} (version #{version})" if options[:verbose]
15
+ require_gem name, version
16
+ end
17
+ end
18
+ end
@@ -29,9 +29,13 @@ module Kernel
29
29
  # raises:: [Gem::LoadError] if Gem cannot be found, is listed in GEM_SKIP, or version requirement not met.
30
30
  #
31
31
  def require_gem(gem, *version_requirements)
32
+ require_gem_with_options(gem, version_requirements, :auto_require=>true)
33
+ end
34
+
35
+ def require_gem_with_options(gem, version_requirements, options={})
32
36
  skip_list = (ENV['GEM_SKIP'] || "").split(/:/)
33
37
  raise Gem::LoadError, "skipping #{gem}" if skip_list.include? gem
34
- Gem.activate(gem, true, *version_requirements)
38
+ Gem.activate(gem, options[:auto_require], *version_requirements)
35
39
  end
36
40
  end
37
41
 
@@ -64,12 +68,13 @@ module Gem
64
68
  require 'rubygems/cmd_manager'
65
69
  require 'rubygems/gem_runner'
66
70
  require 'rubygems/config_file'
71
+ require 'rubygems/deployment'
67
72
  end
68
73
 
69
74
  ##
70
75
  # Returns an Cache of specifications that are in the Gem.path
71
76
  #
72
- # return:: [Gem::Cache] cache of Gem::Specifications
77
+ # return:: [Gem::SourceIndex] Index of installed Gem::Specifications
73
78
  #
74
79
  def source_index
75
80
  @@source_index ||= SourceIndex.from_installed_gems
@@ -105,13 +110,21 @@ module Gem
105
110
  def user_home
106
111
  @user_home ||= find_home
107
112
  end
108
-
113
+
114
+ # Return the path to standard location of the users .gemrc file.
115
+ def config_file
116
+ File.join(Gem.user_home, '.gemrc')
117
+ end
118
+
109
119
  ##
110
120
  # Activate a gem (i.e. add it to the Ruby load path). The gem
111
121
  # must satisfy all the specified version constraints. If
112
122
  # +autorequire+ is true, then automatically require the specified
113
123
  # autorequire file in the gem spec.
114
124
  #
125
+ # Returns true if the gem is loaded by this call, false if it is
126
+ # already loaded, or an exception otherwise.
127
+ #
115
128
  def activate(gem, autorequire, *version_requirements)
116
129
  unless version_requirements.size > 0
117
130
  version_requirements = ["> 0.0.0"]
@@ -120,53 +133,57 @@ module Gem
120
133
  gem = Gem::Dependency.new(gem, version_requirements)
121
134
  end
122
135
 
123
- gem_name_pattern = /^#{gem.name}$/
124
- matches = Gem.source_index.search(gem_name_pattern, gem.version_requirements)
125
- if matches.size==0
126
- matches = Gem.source_index.search(gem_name_pattern)
127
- if matches.size==0
128
- error = Gem::LoadError.new("\nCould not find RubyGem #{gem.name} (#{gem.version_requirements})\n")
129
- error.name = gem.name
130
- error.version_requirement = gem.version_requirements
131
- raise error
132
- else
133
- error = Gem::LoadError.new("\nRubyGem version error: #{gem.name}(#{matches.first.version} not #{gem.version_requirements})\n")
134
- error.name = gem.name
135
- error.version_requirement = gem.version_requirements
136
- raise error
137
- end
138
- else
139
- # Get highest matching version
140
- spec = matches.last
141
- if spec.loaded?
142
- result = spec.autorequire ? require(spec.autorequire) : false
143
- return result || false
144
- end
145
-
146
- spec.loaded = true
147
-
148
- # Load dependent gems first
149
- spec.dependencies.each do |dep_gem|
150
- activate(dep_gem, autorequire)
151
- end
152
-
153
- # add bin dir to require_path
154
- if(spec.bindir) then
155
- spec.require_paths << spec.bindir
156
- end
136
+ matches = Gem.source_index.find_name(gem.name, gem.version_requirements)
137
+ report_activate_error(gem) if matches.empty?
157
138
 
158
- # Now add the require_paths to the LOAD_PATH
159
- spec.require_paths.each do |path|
160
- $:.unshift File.join(spec.full_gem_path, path)
161
- end
162
-
163
- require spec.autorequire if autorequire && spec.autorequire
164
- return true
139
+ # Get highest matching version
140
+ spec = matches.last
141
+ if spec.loaded?
142
+ return false unless autorequire
143
+ result = spec.autorequire ? require(spec.autorequire) : false
144
+ return result || false
165
145
  end
166
-
146
+
147
+ spec.loaded = true
148
+
149
+ # Load dependent gems first
150
+ spec.dependencies.each do |dep_gem|
151
+ activate(dep_gem, autorequire)
152
+ end
153
+
154
+ # add bin dir to require_path
155
+ if(spec.bindir) then
156
+ spec.require_paths << spec.bindir
157
+ end
158
+
159
+ # Now add the require_paths to the LOAD_PATH
160
+ spec.require_paths.each do |path|
161
+ $:.unshift File.join(spec.full_gem_path, path)
162
+ end
163
+
164
+ require spec.autorequire if autorequire && spec.autorequire
165
+ return true
167
166
  end
168
167
 
169
- ##
168
+ # Report a load error during activation. The message of load
169
+ # error depends on whether it was a version mismatch or if there
170
+ # are not gems of any version by the requested name.
171
+ def report_activate_error(gem)
172
+ matches = Gem.source_index.find_name(gem.name)
173
+ if matches.size==0
174
+ error = Gem::LoadError.new(
175
+ "Could not find RubyGem #{gem.name} (#{gem.version_requirements})\n")
176
+ else
177
+ error = Gem::LoadError.new(
178
+ "RubyGem version error: " +
179
+ "#{gem.name}(#{matches.first.version} not #{gem.version_requirements})\n")
180
+ end
181
+ error.name = gem.name
182
+ error.version_requirement = gem.version_requirements
183
+ raise error
184
+ end
185
+ private :report_activate_error
186
+
170
187
  # Reset the +dir+ and +path+ values. The next time +dir+ or +path+
171
188
  # is requested, the values will be calculated from scratch. This is
172
189
  # mainly used by the unit tests to provide test isolation.
@@ -213,13 +230,14 @@ module Gem
213
230
 
214
231
  def required_location(gemname, libfile, *version_constraints)
215
232
  version_constraints = [">0"] if version_constraints.empty?
216
- matches = Gem.source_index.search(gemname, version_constraints)
233
+ matches = Gem.source_index.find_name(gemname, version_constraints)
217
234
  return nil if matches.empty?
218
235
  spec = matches.last
219
236
  spec.require_paths.each do |path|
220
237
  result = File.join(spec.full_gem_path, path, libfile)
221
238
  return result if File.exists?(result)
222
239
  end
240
+ nil
223
241
  end
224
242
 
225
243