rubygems-update 2.7.7 → 2.7.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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +51 -0
  3. data/Rakefile +12 -2
  4. data/bundler/CHANGELOG.md +80 -0
  5. data/bundler/README.md +1 -1
  6. data/bundler/bundler.gemspec +2 -1
  7. data/bundler/lib/bundler.rb +10 -6
  8. data/bundler/lib/bundler/build_metadata.rb +19 -2
  9. data/bundler/lib/bundler/cli.rb +1 -1
  10. data/bundler/lib/bundler/cli/exec.rb +1 -0
  11. data/bundler/lib/bundler/cli/update.rb +3 -3
  12. data/bundler/lib/bundler/current_ruby.rb +8 -1
  13. data/bundler/lib/bundler/definition.rb +18 -13
  14. data/bundler/lib/bundler/dep_proxy.rb +2 -2
  15. data/bundler/lib/bundler/dependency.rb +1 -0
  16. data/bundler/lib/bundler/deprecate.rb +2 -1
  17. data/bundler/lib/bundler/endpoint_specification.rb +1 -1
  18. data/bundler/lib/bundler/env.rb +10 -8
  19. data/bundler/lib/bundler/fetcher.rb +1 -1
  20. data/bundler/lib/bundler/fetcher/downloader.rb +10 -5
  21. data/bundler/lib/bundler/gem_helper.rb +1 -1
  22. data/bundler/lib/bundler/gem_version_promoter.rb +12 -0
  23. data/bundler/lib/bundler/injector.rb +1 -1
  24. data/bundler/lib/bundler/installer/gem_installer.rb +6 -4
  25. data/bundler/lib/bundler/installer/parallel_installer.rb +1 -1
  26. data/bundler/lib/bundler/lazy_specification.rb +1 -1
  27. data/bundler/lib/bundler/mirror.rb +2 -2
  28. data/bundler/lib/bundler/plugin.rb +2 -2
  29. data/bundler/lib/bundler/plugin/index.rb +1 -1
  30. data/bundler/lib/bundler/process_lock.rb +1 -1
  31. data/bundler/lib/bundler/resolver.rb +10 -9
  32. data/bundler/lib/bundler/resolver/spec_group.rb +0 -4
  33. data/bundler/lib/bundler/ruby_version.rb +1 -1
  34. data/bundler/lib/bundler/runtime.rb +1 -1
  35. data/bundler/lib/bundler/shared_helpers.rb +15 -3
  36. data/bundler/lib/bundler/source/metadata.rb +1 -1
  37. data/bundler/lib/bundler/source/rubygems.rb +6 -2
  38. data/bundler/lib/bundler/source/rubygems/remote.rb +4 -1
  39. data/bundler/lib/bundler/templates/newgem/newgem.gemspec.tt +4 -0
  40. data/bundler/lib/bundler/templates/newgem/travis.yml.tt +2 -0
  41. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -1
  42. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +7 -2
  43. data/bundler/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  44. data/bundler/lib/bundler/version.rb +1 -1
  45. data/bundler/man/bundle-binstubs.ronn +1 -1
  46. data/bundler/man/bundle-config.ronn +4 -4
  47. data/bundler/man/bundle-exec.ronn +2 -2
  48. data/bundler/man/bundle-gem.ronn +1 -1
  49. data/bundler/man/bundle-install.ronn +12 -3
  50. data/bundler/man/bundle-lock.ronn +1 -1
  51. data/bundler/man/bundle-outdated.ronn +1 -1
  52. data/bundler/man/bundle-package.ronn +3 -3
  53. data/bundler/man/bundle-show.ronn +3 -2
  54. data/bundler/man/bundle-update.ronn +18 -14
  55. data/bundler/man/bundle-viz.ronn +1 -1
  56. data/bundler/man/bundle.ronn +18 -18
  57. data/bundler/man/gemfile.5.ronn +23 -8
  58. data/lib/rubygems.rb +3 -3
  59. data/lib/rubygems/commands/install_command.rb +7 -0
  60. data/lib/rubygems/commands/push_command.rb +36 -3
  61. data/lib/rubygems/commands/uninstall_command.rb +1 -1
  62. data/lib/rubygems/core_ext/kernel_require.rb +2 -7
  63. data/lib/rubygems/install_update_options.rb +1 -1
  64. data/lib/rubygems/package/tar_header.rb +3 -1
  65. data/lib/rubygems/package/tar_writer.rb +2 -3
  66. data/lib/rubygems/request_set.rb +25 -16
  67. data/lib/rubygems/requirement.rb +14 -3
  68. data/lib/rubygems/resolver/api_specification.rb +5 -0
  69. data/lib/rubygems/security.rb +6 -1
  70. data/lib/rubygems/util/licenses.rb +35 -4
  71. data/lib/rubygems/version.rb +7 -2
  72. data/test/rubygems/test_gem_commands_build_command.rb +2 -0
  73. data/test/rubygems/test_gem_commands_install_command.rb +37 -0
  74. data/test/rubygems/test_gem_commands_push_command.rb +20 -0
  75. data/test/rubygems/test_gem_install_update_options.rb +2 -0
  76. data/test/rubygems/test_gem_remote_fetcher.rb +5 -1
  77. data/test/rubygems/test_gem_request.rb +5 -2
  78. data/test/rubygems/test_gem_requirement.rb +6 -0
  79. data/test/rubygems/test_gem_resolver_api_specification.rb +24 -0
  80. data/test/rubygems/test_gem_specification.rb +17 -3
  81. data/test/rubygems/test_gem_version.rb +29 -3
  82. data/util/ci +1 -1
  83. data/util/generate_spdx_license_list.rb +15 -6
  84. metadata +2 -2
@@ -123,7 +123,7 @@ module Bundler
123
123
  @required_ruby_version = Gem::Requirement.new(v)
124
124
  end
125
125
  end
126
- rescue => e
126
+ rescue StandardError => e
127
127
  raise GemspecError, "There was an error parsing the metadata for the gem #{name} (#{version}): #{e.class}\n#{e}\nThe metadata was #{data.inspect}"
128
128
  end
129
129
 
@@ -61,10 +61,10 @@ module Bundler
61
61
  end
62
62
 
63
63
  def self.read_file(filename)
64
- File.read(filename.to_s).strip
64
+ Bundler.read_file(filename.to_s).strip
65
65
  rescue Errno::ENOENT
66
66
  "<No #{filename} found>"
67
- rescue => e
67
+ rescue RuntimeError => e
68
68
  "#{e.class}: #{e.message}"
69
69
  end
70
70
 
@@ -88,7 +88,7 @@ module Bundler
88
88
 
89
89
  def self.version_of(script)
90
90
  return "not installed" unless Bundler.which(script)
91
- `#{script} --version`
91
+ `#{script} --version`.chomp
92
92
  end
93
93
 
94
94
  def self.chruby_version
@@ -110,11 +110,13 @@ module Bundler
110
110
  out << [" Gem Path", ENV.fetch("GEM_PATH") { Gem.path.join(File::PATH_SEPARATOR) }]
111
111
  out << [" User Path", Gem.user_dir]
112
112
  out << [" Bin Dir", Gem.bindir]
113
- out << ["OpenSSL"] if defined?(OpenSSL)
114
- out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
115
- out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
116
- out << [" Cert File", OpenSSL::X509::DEFAULT_CERT_FILE] if defined?(OpenSSL::X509::DEFAULT_CERT_FILE)
117
- out << [" Cert Dir", OpenSSL::X509::DEFAULT_CERT_DIR] if defined?(OpenSSL::X509::DEFAULT_CERT_DIR)
113
+ if defined?(OpenSSL)
114
+ out << ["OpenSSL"]
115
+ out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
116
+ out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
117
+ out << [" Cert File", OpenSSL::X509::DEFAULT_CERT_FILE] if defined?(OpenSSL::X509::DEFAULT_CERT_FILE)
118
+ out << [" Cert Dir", OpenSSL::X509::DEFAULT_CERT_DIR] if defined?(OpenSSL::X509::DEFAULT_CERT_DIR)
119
+ end
118
120
  out << ["Tools"]
119
121
  out << [" Git", git_version]
120
122
  out << [" RVM", ENV.fetch("rvm_version") { version_of("rvm") }]
@@ -178,7 +178,7 @@ module Bundler
178
178
  # engine_version raises on unknown engines
179
179
  engine_version = begin
180
180
  ruby.engine_versions
181
- rescue
181
+ rescue RuntimeError
182
182
  "???"
183
183
  end
184
184
  agent << " #{ruby.engine}/#{ruby.versions_string(engine_version)}"
@@ -11,10 +11,10 @@ module Bundler
11
11
  @redirect_limit = redirect_limit
12
12
  end
13
13
 
14
- def fetch(uri, options = {}, counter = 0)
14
+ def fetch(uri, headers = {}, counter = 0)
15
15
  raise HTTPError, "Too many redirects" if counter >= redirect_limit
16
16
 
17
- response = request(uri, options)
17
+ response = request(uri, headers)
18
18
  Bundler.ui.debug("HTTP #{response.code} #{response.message} #{uri}")
19
19
 
20
20
  case response
@@ -26,7 +26,12 @@ module Bundler
26
26
  new_uri.user = uri.user
27
27
  new_uri.password = uri.password
28
28
  end
29
- fetch(new_uri, options, counter + 1)
29
+ fetch(new_uri, headers, counter + 1)
30
+ when Net::HTTPRequestedRangeNotSatisfiable
31
+ new_headers = headers.dup
32
+ new_headers.delete("Range")
33
+ new_headers["Accept-Encoding"] = "gzip"
34
+ fetch(uri, new_headers)
30
35
  when Net::HTTPRequestEntityTooLarge
31
36
  raise FallbackError, response.body
32
37
  when Net::HTTPUnauthorized
@@ -38,11 +43,11 @@ module Bundler
38
43
  end
39
44
  end
40
45
 
41
- def request(uri, options)
46
+ def request(uri, headers)
42
47
  validate_uri_scheme!(uri)
43
48
 
44
49
  Bundler.ui.debug "HTTP GET #{uri}"
45
- req = Net::HTTP::Get.new uri.request_uri, options
50
+ req = Net::HTTP::Get.new uri.request_uri, headers
46
51
  if uri.user
47
52
  user = CGI.unescape(uri.user)
48
53
  password = uri.password ? CGI.unescape(uri.password) : nil
@@ -153,7 +153,7 @@ module Bundler
153
153
  sh "git tag -m \"Version #{version}\" #{version_tag}"
154
154
  Bundler.ui.confirm "Tagged #{version_tag}."
155
155
  yield if block_given?
156
- rescue
156
+ rescue RuntimeError
157
157
  Bundler.ui.error "Untagging #{version_tag} due to error."
158
158
  sh_with_code "git tag -d #{version_tag}"
159
159
  raise
@@ -22,6 +22,8 @@ module Bundler
22
22
  # existing in the referenced source.
23
23
  attr_accessor :strict
24
24
 
25
+ attr_accessor :prerelease_specified
26
+
25
27
  # Given a list of locked_specs and a list of gems to unlock creates a
26
28
  # GemVersionPromoter instance.
27
29
  #
@@ -37,6 +39,7 @@ module Bundler
37
39
  @locked_specs = locked_specs
38
40
  @unlock_gems = unlock_gems
39
41
  @sort_versions = {}
42
+ @prerelease_specified = {}
40
43
  end
41
44
 
42
45
  # @param value [Symbol] One of three Symbols: :major, :minor or :patch.
@@ -121,6 +124,15 @@ module Bundler
121
124
  result = spec_groups.sort do |a, b|
122
125
  @a_ver = a.version
123
126
  @b_ver = b.version
127
+
128
+ unless @prerelease_specified[@gem_name]
129
+ a_pre = @a_ver.prerelease?
130
+ b_pre = @b_ver.prerelease?
131
+
132
+ next -1 if a_pre && !b_pre
133
+ next 1 if b_pre && !a_pre
134
+ end
135
+
124
136
  if major?
125
137
  @a_ver <=> @b_ver
126
138
  elsif either_version_older_than_locked
@@ -75,7 +75,7 @@ module Bundler
75
75
  end
76
76
 
77
77
  if d.groups != Array(:default)
78
- group = d.groups.size == 1 ? ", :group => #{d.groups.inspect}" : ", :groups => #{d.groups.inspect}"
78
+ group = d.groups.size == 1 ? ", :group => #{d.groups.first.inspect}" : ", :groups => #{d.groups.inspect}"
79
79
  end
80
80
 
81
81
  source = ", :source => \"#{d.source}\"" unless d.source.nil?
@@ -21,7 +21,7 @@ module Bundler
21
21
  raise
22
22
  rescue Errno::ENOSPC
23
23
  return false, out_of_space_message
24
- rescue => e
24
+ rescue StandardError => e
25
25
  return false, specific_failure_message(e)
26
26
  end
27
27
 
@@ -44,9 +44,11 @@ module Bundler
44
44
  end
45
45
 
46
46
  def gem_install_message
47
- remotes = spec.source.remotes
48
- if remotes.size == 1
49
- "Make sure that `gem install #{spec.name} -v '#{spec.version}' --source '#{remotes.first}'` succeeds before bundling."
47
+ source = spec.source
48
+ return unless source.respond_to?(:remotes)
49
+
50
+ if source.remotes.size == 1
51
+ "Make sure that `gem install #{spec.name} -v '#{spec.version}' --source '#{source.remotes.first}'` succeeds before bundling."
50
52
  else
51
53
  "Make sure that `gem install #{spec.name} -v '#{spec.version}'` succeeds before bundling."
52
54
  end
@@ -160,7 +160,7 @@ module Bundler
160
160
  )
161
161
  success, message = begin
162
162
  gem_installer.install_from_spec
163
- rescue => e
163
+ rescue RuntimeError => e
164
164
  raise e, "#{e}\n\n#{require_tree_for_spec(spec_install.spec)}"
165
165
  end
166
166
  if success
@@ -80,7 +80,7 @@ module Bundler
80
80
  "To use the platform-specific version of the gem, run `bundle config specific_platform true` and install again."
81
81
  search = source.specs.search(self).last
82
82
  end
83
- search.dependencies = dependencies if search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification)
83
+ search.dependencies = dependencies if search && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
84
84
  search
85
85
  end
86
86
  end
@@ -152,7 +152,7 @@ module Bundler
152
152
  socket.connect_nonblock(address)
153
153
  rescue Errno::EINPROGRESS
154
154
  wait_for_writtable_socket(socket, address, timeout)
155
- rescue # Connection failed somehow, again
155
+ rescue RuntimeError # Connection failed somehow, again
156
156
  false
157
157
  end
158
158
  end
@@ -172,7 +172,7 @@ module Bundler
172
172
  socket.connect_nonblock(address)
173
173
  rescue Errno::EISCONN
174
174
  true
175
- rescue # Connection failed
175
+ rescue StandardError # Connection failed
176
176
  false
177
177
  end
178
178
  end
@@ -66,7 +66,7 @@ module Bundler
66
66
  installed_specs = Installer.new.install_definition(definition)
67
67
 
68
68
  save_plugins plugins, installed_specs, builder.inferred_plugins
69
- rescue => e
69
+ rescue RuntimeError => e
70
70
  unless e.is_a?(GemfileError)
71
71
  Bundler.ui.error "Failed to install plugin: #{e.message}\n #{e.backtrace[0]}"
72
72
  end
@@ -264,7 +264,7 @@ module Bundler
264
264
  load path.join(PLUGIN_FILE_NAME)
265
265
 
266
266
  @loaded_plugin_names << name
267
- rescue => e
267
+ rescue RuntimeError => e
268
268
  Bundler.ui.error "Failed loading plugin #{name}: #{e.message}"
269
269
  raise
270
270
  end
@@ -63,7 +63,7 @@ module Bundler
63
63
  @plugin_paths[name] = path
64
64
  @load_paths[name] = load_paths
65
65
  save_index
66
- rescue
66
+ rescue StandardError
67
67
  @commands = old_commands
68
68
  raise
69
69
  end
@@ -12,7 +12,7 @@ module Bundler
12
12
  yield
13
13
  f.flock(File::LOCK_UN)
14
14
  end
15
- rescue Errno::EACCES, Errno::ENOLCK
15
+ rescue Errno::EACCES, Errno::ENOLCK, *[SharedHelpers.const_get_safely(:ENOTSUP, Errno)].compact
16
16
  # In the case the user does not have access to
17
17
  # create the lock file or is using NFS where
18
18
  # locks are not available we skip locking.
@@ -39,10 +39,11 @@ module Bundler
39
39
  @gem_version_promoter = gem_version_promoter
40
40
  @allow_bundler_dependency_conflicts = Bundler.feature_flag.allow_bundler_dependency_conflicts?
41
41
  @lockfile_uses_separate_rubygems_sources = Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
42
+ @use_gvp = !@gem_version_promoter.major?
42
43
  end
43
44
 
44
45
  def start(requirements)
45
- @prerelease_specified = {}
46
+ @gem_version_promoter.prerelease_specified = @prerelease_specified = {}
46
47
  requirements.each {|dep| @prerelease_specified[dep.name] ||= dep.prerelease? }
47
48
 
48
49
  verify_gemfile_dependencies_are_found!(requirements)
@@ -104,16 +105,17 @@ module Bundler
104
105
  index = index_for(dependency)
105
106
  results = index.search(dependency, @base[dependency.name])
106
107
 
107
- unless @prerelease_specified[dependency.name]
108
+ if vertex = @base_dg.vertex_named(dependency.name)
109
+ locked_requirement = vertex.payload.requirement
110
+ end
111
+
112
+ if !@prerelease_specified[dependency.name] && (!@use_gvp || locked_requirement.nil?)
108
113
  # Move prereleases to the beginning of the list, so they're considered
109
114
  # last during resolution.
110
115
  pre, results = results.partition {|spec| spec.version.prerelease? }
111
116
  results = pre + results
112
117
  end
113
118
 
114
- if vertex = @base_dg.vertex_named(dependency.name)
115
- locked_requirement = vertex.payload.requirement
116
- end
117
119
  spec_groups = if results.any?
118
120
  nested = []
119
121
  results.each do |spec|
@@ -179,10 +181,6 @@ module Bundler
179
181
 
180
182
  def requirement_satisfied_by?(requirement, activated, spec)
181
183
  return false unless requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
182
- if spec.version.prerelease? && !requirement.prerelease? && search_for(requirement).any? {|sg| !sg.version.prerelease? }
183
- vertex = activated.vertex_named(spec.name)
184
- return false if vertex.requirements.none?(&:prerelease?)
185
- end
186
184
  spec.activate_platform!(requirement.__platform) if !@platforms || @platforms.include?(requirement.__platform)
187
185
  true
188
186
  end
@@ -306,6 +304,9 @@ module Bundler
306
304
  :solver_name => "Bundler",
307
305
  :possibility_type => "gem",
308
306
  :reduce_trees => lambda do |trees|
307
+ # called first, because we want to reduce the amount of work required to find maximal empty sets
308
+ trees = trees.uniq {|t| t.flatten.map {|dep| [dep.name, dep.requirement] } }
309
+
309
310
  # bail out if tree size is too big for Array#combination to make any sense
310
311
  return trees if trees.size > 15
311
312
  maximal = 1.upto(trees.size).map do |size|
@@ -54,10 +54,6 @@ module Bundler
54
54
  dependencies.concat(metadata_dependencies).flatten
55
55
  end
56
56
 
57
- def platforms_for_dependency_named(dependency)
58
- __dependencies.select {|_, deps| deps.map(&:name).include? dependency }.keys
59
- end
60
-
61
57
  def ==(other)
62
58
  return unless other.is_a?(SpecGroup)
63
59
  name == other.name &&
@@ -118,7 +118,7 @@ module Bundler
118
118
  when "jruby"
119
119
  JRUBY_VERSION.dup
120
120
  else
121
- raise BundlerError, "RUBY_ENGINE value #{RUBY_ENGINE} is not recognized"
121
+ RUBY_ENGINE_VERSION.dup
122
122
  end
123
123
  patchlevel = RUBY_PATCHLEVEL.to_s
124
124
 
@@ -79,7 +79,7 @@ module Bundler
79
79
  required_file = file
80
80
  begin
81
81
  Kernel.require file
82
- rescue => e
82
+ rescue RuntimeError => e
83
83
  raise e if e.is_a?(LoadError) # we handle this a little later
84
84
  raise Bundler::GemRequireError.new e,
85
85
  "There was an error while trying to load the gem '#{file}'."
@@ -293,7 +293,12 @@ module Bundler
293
293
 
294
294
  def set_bundle_variables
295
295
  begin
296
- Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", Bundler.rubygems.bin_path("bundler", "bundle", VERSION)
296
+ exe_file = Bundler.rubygems.bin_path("bundler", "bundle", VERSION)
297
+ unless File.exist?(exe_file)
298
+ exe_file = File.expand_path("../../../exe/bundle", __FILE__)
299
+ end
300
+
301
+ Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", exe_file
297
302
  rescue Gem::GemNotFoundException
298
303
  Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", File.expand_path("../../../exe/bundle", __FILE__)
299
304
  end
@@ -324,7 +329,7 @@ module Bundler
324
329
  end
325
330
 
326
331
  def bundler_ruby_lib
327
- File.expand_path("../..", __FILE__)
332
+ resolve_path File.expand_path("../..", __FILE__)
328
333
  end
329
334
 
330
335
  def clean_load_path
@@ -336,12 +341,19 @@ module Bundler
336
341
  loaded_gem_paths = Bundler.rubygems.loaded_gem_paths
337
342
 
338
343
  $LOAD_PATH.reject! do |p|
339
- next if File.expand_path(p).start_with?(bundler_lib)
344
+ next if resolve_path(p).start_with?(bundler_lib)
340
345
  loaded_gem_paths.delete(p)
341
346
  end
342
347
  $LOAD_PATH.uniq!
343
348
  end
344
349
 
350
+ def resolve_path(path)
351
+ expanded = File.expand_path(path)
352
+ return expanded unless File.respond_to?(:realpath) && File.exist?(expanded)
353
+
354
+ File.realpath(expanded)
355
+ end
356
+
345
357
  def prints_major_deprecations?
346
358
  require "bundler"
347
359
  deprecation_release = Bundler::VERSION.split(".").drop(1).include?("99")
@@ -19,7 +19,7 @@ module Bundler
19
19
  # can't point to the actual gemspec or else the require paths will be wrong
20
20
  s.loaded_from = File.expand_path("..", __FILE__)
21
21
  end
22
- if loaded_spec = nil && Bundler.rubygems.loaded_specs("bundler")
22
+ if loaded_spec = Bundler.rubygems.loaded_specs("bundler")
23
23
  idx << loaded_spec # this has to come after the fake gemspec, to override it
24
24
  elsif local_spec = Bundler.rubygems.find_name("bundler").find {|s| s.version.to_s == VERSION }
25
25
  idx << local_spec
@@ -138,7 +138,7 @@ module Bundler
138
138
  bin_path = Bundler.system_bindir
139
139
  end
140
140
 
141
- Bundler.mkdir_p bin_path unless spec.executables.empty? || Bundler.rubygems.provides?(">= 2.7.5")
141
+ Bundler.mkdir_p bin_path, :no_sudo => true unless spec.executables.empty? || Bundler.rubygems.provides?(">= 2.7.5")
142
142
 
143
143
  installed_spec = nil
144
144
  Bundler.rubygems.preserve_paths do
@@ -338,7 +338,11 @@ module Bundler
338
338
  end
339
339
 
340
340
  def remove_auth(remote)
341
- remote.dup.tap {|uri| uri.user = uri.password = nil }.to_s
341
+ if remote.user || remote.password
342
+ remote.dup.tap {|uri| uri.user = uri.password = nil }.to_s
343
+ else
344
+ remote.to_s
345
+ end
342
346
  end
343
347
 
344
348
  def installed_specs
@@ -25,7 +25,10 @@ module Bundler
25
25
 
26
26
  cache_uri = original_uri || uri
27
27
 
28
- uri_parts = [cache_uri.host, cache_uri.user, cache_uri.port, cache_uri.path]
28
+ # URI::File of Ruby 2.6 returns empty string when given "file://".
29
+ host = defined?(URI::File) && cache_uri.is_a?(URI::File) ? nil : cache_uri.host
30
+
31
+ uri_parts = [host, cache_uri.user, cache_uri.port, cache_uri.path]
29
32
  uri_digest = SharedHelpers.digest(:MD5).hexdigest(uri_parts.compact.join("."))
30
33
 
31
34
  uri_parts[-1] = uri_digest
@@ -23,6 +23,10 @@ Gem::Specification.new do |spec|
23
23
  # to allow pushing to a single host or delete this section to allow pushing to any host.
24
24
  if spec.respond_to?(:metadata)
25
25
  spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
26
+
27
+ spec.metadata["homepage_uri"] = spec.homepage
28
+ spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
29
+ spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
26
30
  else
27
31
  raise "RubyGems 2.0 or newer is required to protect against " \
28
32
  "public gem pushes."
@@ -1,5 +1,7 @@
1
+ ---
1
2
  sudo: false
2
3
  language: ruby
4
+ cache: bundler
3
5
  rvm:
4
6
  - <%= RUBY_VERSION %>
5
7
  before_install: gem install bundler -v <%= Bundler::VERSION %>