bundler 2.1.4 → 2.2.2

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

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (208) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1577 -1425
  3. data/README.md +6 -8
  4. data/bundler.gemspec +3 -3
  5. data/exe/bundle +3 -0
  6. data/lib/bundler.rb +35 -7
  7. data/lib/bundler/build_metadata.rb +3 -11
  8. data/lib/bundler/cli.rb +58 -21
  9. data/lib/bundler/cli/add.rb +1 -1
  10. data/lib/bundler/cli/binstubs.rb +6 -2
  11. data/lib/bundler/cli/cache.rb +1 -7
  12. data/lib/bundler/cli/clean.rb +1 -1
  13. data/lib/bundler/cli/common.rb +14 -0
  14. data/lib/bundler/cli/console.rb +1 -1
  15. data/lib/bundler/cli/doctor.rb +1 -1
  16. data/lib/bundler/cli/exec.rb +4 -4
  17. data/lib/bundler/cli/fund.rb +36 -0
  18. data/lib/bundler/cli/gem.rb +84 -11
  19. data/lib/bundler/cli/info.rb +15 -4
  20. data/lib/bundler/cli/init.rb +2 -2
  21. data/lib/bundler/cli/inject.rb +1 -1
  22. data/lib/bundler/cli/install.rb +13 -11
  23. data/lib/bundler/cli/issue.rb +2 -2
  24. data/lib/bundler/cli/list.rb +12 -10
  25. data/lib/bundler/cli/outdated.rb +87 -66
  26. data/lib/bundler/cli/plugin.rb +10 -0
  27. data/lib/bundler/cli/pristine.rb +5 -0
  28. data/lib/bundler/cli/show.rb +1 -1
  29. data/lib/bundler/cli/update.rb +2 -0
  30. data/lib/bundler/compact_index_client.rb +1 -1
  31. data/lib/bundler/compact_index_client/cache.rb +1 -1
  32. data/lib/bundler/compact_index_client/updater.rb +5 -5
  33. data/lib/bundler/definition.rb +49 -72
  34. data/lib/bundler/dep_proxy.rb +1 -1
  35. data/lib/bundler/dependency.rb +3 -10
  36. data/lib/bundler/dsl.rb +5 -9
  37. data/lib/bundler/endpoint_specification.rb +1 -1
  38. data/lib/bundler/env.rb +1 -1
  39. data/lib/bundler/environment_preserver.rb +26 -2
  40. data/lib/bundler/errors.rb +1 -0
  41. data/lib/bundler/feature_flag.rb +0 -3
  42. data/lib/bundler/fetcher.rb +4 -3
  43. data/lib/bundler/fetcher/base.rb +1 -1
  44. data/lib/bundler/fetcher/compact_index.rb +1 -1
  45. data/lib/bundler/fetcher/downloader.rb +1 -1
  46. data/lib/bundler/fetcher/index.rb +3 -4
  47. data/lib/bundler/friendly_errors.rb +22 -13
  48. data/lib/bundler/gem_helper.rb +32 -17
  49. data/lib/bundler/gem_helpers.rb +6 -1
  50. data/lib/bundler/gem_version_promoter.rb +2 -2
  51. data/lib/bundler/graph.rb +1 -1
  52. data/lib/bundler/index.rb +6 -2
  53. data/lib/bundler/injector.rb +22 -4
  54. data/lib/bundler/inline.rb +1 -1
  55. data/lib/bundler/installer.rb +35 -32
  56. data/lib/bundler/installer/gem_installer.rb +3 -3
  57. data/lib/bundler/installer/parallel_installer.rb +10 -10
  58. data/lib/bundler/installer/standalone.rb +2 -2
  59. data/lib/bundler/lazy_specification.rb +34 -9
  60. data/lib/bundler/lockfile_generator.rb +1 -1
  61. data/lib/bundler/lockfile_parser.rb +1 -1
  62. data/lib/bundler/man/.document +1 -0
  63. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
  64. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
  65. data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
  66. data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  67. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  68. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +19 -30
  69. data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  70. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
  71. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
  72. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  73. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
  74. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
  75. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
  76. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  77. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  78. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  79. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
  80. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
  81. data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  82. data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  83. data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
  84. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
  85. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
  86. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
  87. data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
  88. data/lib/bundler/mirror.rb +2 -2
  89. data/lib/bundler/plugin.rb +30 -5
  90. data/lib/bundler/plugin/api/source.rb +1 -1
  91. data/lib/bundler/plugin/dsl.rb +1 -1
  92. data/lib/bundler/plugin/index.rb +10 -1
  93. data/lib/bundler/plugin/installer.rb +1 -1
  94. data/lib/bundler/plugin/installer/rubygems.rb +1 -1
  95. data/lib/bundler/plugin/source_list.rb +1 -1
  96. data/lib/bundler/psyched_yaml.rb +0 -15
  97. data/lib/bundler/remote_specification.rb +5 -2
  98. data/lib/bundler/resolver.rb +37 -18
  99. data/lib/bundler/resolver/spec_group.rb +28 -11
  100. data/lib/bundler/retry.rb +1 -1
  101. data/lib/bundler/ruby_version.rb +1 -1
  102. data/lib/bundler/rubygems_ext.rb +53 -9
  103. data/lib/bundler/rubygems_gem_installer.rb +3 -9
  104. data/lib/bundler/rubygems_integration.rb +25 -55
  105. data/lib/bundler/runtime.rb +4 -14
  106. data/lib/bundler/settings.rb +49 -46
  107. data/lib/bundler/shared_helpers.rb +2 -2
  108. data/lib/bundler/similarity_detector.rb +1 -1
  109. data/lib/bundler/source.rb +1 -1
  110. data/lib/bundler/source/git.rb +5 -5
  111. data/lib/bundler/source/git/git_proxy.rb +57 -60
  112. data/lib/bundler/source/path.rb +7 -3
  113. data/lib/bundler/source/path/installer.rb +8 -10
  114. data/lib/bundler/source/rubygems.rb +13 -16
  115. data/lib/bundler/source/rubygems/remote.rb +1 -1
  116. data/lib/bundler/source_list.rb +2 -2
  117. data/lib/bundler/spec_set.rb +2 -1
  118. data/lib/bundler/stub_specification.rb +17 -7
  119. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  120. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  121. data/lib/bundler/templates/newgem/README.md.tt +1 -2
  122. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  123. data/lib/bundler/templates/newgem/bin/console.tt +1 -0
  124. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  125. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  126. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  127. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  128. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  129. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  130. data/lib/bundler/templates/newgem/newgem.gemspec.tt +14 -6
  131. data/lib/bundler/templates/newgem/rubocop.yml.tt +10 -0
  132. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  133. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  134. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  135. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  136. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  137. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  138. data/lib/bundler/ui/shell.rb +5 -5
  139. data/lib/bundler/uri_credentials_filter.rb +3 -1
  140. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  141. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
  142. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  143. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  144. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  145. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +38 -40
  146. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
  147. data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  148. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  149. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  150. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  151. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  152. data/lib/bundler/vendored_persistent.rb +0 -7
  153. data/lib/bundler/vendored_tmpdir.rb +4 -0
  154. data/lib/bundler/version.rb +1 -1
  155. data/lib/bundler/worker.rb +1 -1
  156. data/lib/bundler/yaml_serializer.rb +1 -1
  157. data/man/bundle-add.1 +1 -1
  158. data/man/bundle-binstubs.1 +5 -3
  159. data/man/bundle-cache.1 +1 -1
  160. data/man/bundle-check.1 +1 -1
  161. data/man/bundle-clean.1 +1 -1
  162. data/man/bundle-config.1 +16 -25
  163. data/man/bundle-doctor.1 +1 -1
  164. data/man/bundle-exec.1 +1 -1
  165. data/man/bundle-gem.1 +25 -3
  166. data/man/bundle-info.1 +1 -1
  167. data/man/bundle-init.1 +1 -1
  168. data/man/bundle-inject.1 +1 -1
  169. data/man/bundle-install.1 +30 -3
  170. data/man/bundle-list.1 +7 -7
  171. data/man/bundle-lock.1 +1 -1
  172. data/man/bundle-open.1 +1 -1
  173. data/man/bundle-outdated.1 +1 -1
  174. data/man/bundle-platform.1 +1 -1
  175. data/man/bundle-pristine.1 +1 -1
  176. data/man/bundle-remove.1 +1 -1
  177. data/man/bundle-show.1 +1 -1
  178. data/man/bundle-update.1 +1 -1
  179. data/man/bundle-viz.1 +1 -1
  180. data/man/bundle.1 +1 -1
  181. data/man/gemfile.5 +4 -4
  182. metadata +43 -59
  183. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  184. data/man/bundle-add.1.txt +0 -58
  185. data/man/bundle-binstubs.1.txt +0 -48
  186. data/man/bundle-cache.1.txt +0 -78
  187. data/man/bundle-check.1.txt +0 -33
  188. data/man/bundle-clean.1.txt +0 -26
  189. data/man/bundle-config.1.txt +0 -528
  190. data/man/bundle-doctor.1.txt +0 -44
  191. data/man/bundle-exec.1.txt +0 -178
  192. data/man/bundle-gem.1.txt +0 -91
  193. data/man/bundle-info.1.txt +0 -21
  194. data/man/bundle-init.1.txt +0 -34
  195. data/man/bundle-inject.1.txt +0 -32
  196. data/man/bundle-install.1.txt +0 -401
  197. data/man/bundle-list.1.txt +0 -43
  198. data/man/bundle-lock.1.txt +0 -93
  199. data/man/bundle-open.1.txt +0 -29
  200. data/man/bundle-outdated.1.txt +0 -131
  201. data/man/bundle-platform.1.txt +0 -57
  202. data/man/bundle-pristine.1.txt +0 -44
  203. data/man/bundle-remove.1.txt +0 -34
  204. data/man/bundle-show.1.txt +0 -27
  205. data/man/bundle-update.1.txt +0 -390
  206. data/man/bundle-viz.1.txt +0 -39
  207. data/man/bundle.1.txt +0 -116
  208. data/man/gemfile.5.txt +0 -649
@@ -104,7 +104,7 @@ module Bundler
104
104
  @remote_specification = spec
105
105
  end
106
106
 
107
- private
107
+ private
108
108
 
109
109
  def local_specification_path
110
110
  "#{base_dir}/specifications/#{full_name}.gemspec"
@@ -105,7 +105,7 @@ module Bundler
105
105
  out << [" User Home", Gem.user_home]
106
106
  out << [" User Path", Gem.user_dir]
107
107
  out << [" Bin Dir", Gem.bindir]
108
- if defined?(OpenSSL)
108
+ if defined?(OpenSSL::SSL)
109
109
  out << ["OpenSSL"]
110
110
  out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
111
111
  out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
@@ -17,14 +17,38 @@ module Bundler
17
17
  ].map(&:freeze).freeze
18
18
  BUNDLER_PREFIX = "BUNDLER_ORIG_".freeze
19
19
 
20
- # @param env [ENV]
20
+ def self.from_env
21
+ new(env_to_hash(ENV), BUNDLER_KEYS)
22
+ end
23
+
24
+ def self.env_to_hash(env)
25
+ to_hash = env.to_hash
26
+ return to_hash unless Gem.win_platform?
27
+
28
+ to_hash.each_with_object({}) {|(k,v), a| a[k.upcase] = v }
29
+ end
30
+
31
+ # @param env [Hash]
21
32
  # @param keys [Array<String>]
22
33
  def initialize(env, keys)
23
- @original = env.to_hash
34
+ @original = env
24
35
  @keys = keys
25
36
  @prefix = BUNDLER_PREFIX
26
37
  end
27
38
 
39
+ # Replaces `ENV` with the bundler environment variables backed up
40
+ def replace_with_backup
41
+ ENV.replace(backup) unless Gem.win_platform?
42
+
43
+ # Fallback logic for Windows below to workaround
44
+ # https://bugs.ruby-lang.org/issues/16798. Can be dropped once all
45
+ # supported rubies include the fix for that.
46
+
47
+ ENV.clear
48
+
49
+ backup.each {|k, v| ENV[k] = v }
50
+ end
51
+
28
52
  # @return [Hash]
29
53
  def backup
30
54
  env = @original.clone
@@ -56,6 +56,7 @@ module Bundler
56
56
  class SudoNotPermittedError < BundlerError; status_code(30); end
57
57
  class ThreadCreationError < BundlerError; status_code(33); end
58
58
  class APIResponseMismatchError < BundlerError; status_code(34); end
59
+ class APIResponseInvalidDependenciesError < BundlerError; status_code(35); end
59
60
  class GemfileEvalError < GemfileError; end
60
61
  class MarshalError < StandardError; end
61
62
 
@@ -30,7 +30,6 @@ module Bundler
30
30
  settings_flag(:allow_bundler_dependency_conflicts) { bundler_3_mode? }
31
31
  settings_flag(:allow_offline_install) { bundler_3_mode? }
32
32
  settings_flag(:auto_clean_without_path) { bundler_3_mode? }
33
- settings_flag(:auto_config_jobs) { bundler_3_mode? }
34
33
  settings_flag(:cache_all) { bundler_3_mode? }
35
34
  settings_flag(:default_install_uses_path) { bundler_3_mode? }
36
35
  settings_flag(:deployment_means_frozen) { bundler_3_mode? }
@@ -42,8 +41,6 @@ module Bundler
42
41
  settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
43
42
  settings_flag(:print_only_version_number) { bundler_3_mode? }
44
43
  settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
45
- settings_flag(:skip_default_git_sources) { bundler_3_mode? }
46
- settings_flag(:specific_platform) { bundler_3_mode? }
47
44
  settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
48
45
  settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? }
49
46
  settings_flag(:update_requires_all_flag) { bundler_4_mode? }
@@ -47,7 +47,7 @@ module Bundler
47
47
  remote_uri = filter_uri(remote_uri)
48
48
  super "Authentication is required for #{remote_uri}.\n" \
49
49
  "Please supply credentials for this source. You can do this by running:\n" \
50
- " bundle config set #{remote_uri} username:password"
50
+ " bundle config set --global #{remote_uri} username:password"
51
51
  end
52
52
  end
53
53
  # This error is raised if HTTP authentication is provided, but incorrect.
@@ -216,7 +216,7 @@ module Bundler
216
216
  "#<#{self.class}:0x#{object_id} uri=#{uri}>"
217
217
  end
218
218
 
219
- private
219
+ private
220
220
 
221
221
  FETCHERS = [CompactIndex, Dependency, Index].freeze
222
222
 
@@ -229,6 +229,7 @@ module Bundler
229
229
  "BUILDBOX" => "buildbox",
230
230
  "GO_SERVER_URL" => "go",
231
231
  "SNAP_CI" => "snap",
232
+ "GITLAB_CI" => "gitlab",
232
233
  "CI_NAME" => ENV["CI_NAME"],
233
234
  "CI" => "ci",
234
235
  }
@@ -302,7 +303,7 @@ module Bundler
302
303
  store
303
304
  end
304
305
 
305
- private
306
+ private
306
307
 
307
308
  def remote_uri
308
309
  @remote.uri
@@ -38,7 +38,7 @@ module Bundler
38
38
  false
39
39
  end
40
40
 
41
- private
41
+ private
42
42
 
43
43
  def log_specs(debug_msg)
44
44
  if Bundler.ui.debug?
@@ -83,7 +83,7 @@ module Bundler
83
83
  true
84
84
  end
85
85
 
86
- private
86
+ private
87
87
 
88
88
  def compact_index_client
89
89
  @compact_index_client ||=
@@ -74,7 +74,7 @@ module Bundler
74
74
  end
75
75
  end
76
76
 
77
- private
77
+ private
78
78
 
79
79
  def validate_uri_scheme!(uri)
80
80
  return if uri.scheme =~ /\Ahttps?\z/
@@ -8,7 +8,7 @@ module Bundler
8
8
  class Index < Base
9
9
  def specs(_gem_names)
10
10
  Bundler.rubygems.fetch_all_remote_specs(remote)
11
- rescue Gem::RemoteFetcher::FetchError, OpenSSL::SSL::SSLError, Net::HTTPFatalError => e
11
+ rescue Gem::RemoteFetcher::FetchError => e
12
12
  case e.message
13
13
  when /certificate verify failed/
14
14
  raise CertificateFailureError.new(display_uri)
@@ -19,8 +19,7 @@ module Bundler
19
19
  raise BadAuthenticationError, remote_uri if remote_uri.userinfo
20
20
  raise AuthenticationRequiredError, remote_uri
21
21
  else
22
- Bundler.ui.trace e
23
- raise HTTPError, "Could not fetch specs from #{display_uri}"
22
+ raise HTTPError, "Could not fetch specs from #{display_uri} due to underlying error <#{e.message}>"
24
23
  end
25
24
  end
26
25
 
@@ -42,7 +41,7 @@ module Bundler
42
41
  "Your network or your gem server is probably having issues right now."
43
42
  end
44
43
 
45
- private
44
+ private
46
45
 
47
46
  # cached gem specification path, if one exists
48
47
  def gemspec_cached_path(spec_file_name)
@@ -4,7 +4,19 @@ require_relative "vendored_thor"
4
4
 
5
5
  module Bundler
6
6
  module FriendlyErrors
7
- module_function
7
+ module_function
8
+
9
+ def enable!
10
+ @disabled = false
11
+ end
12
+
13
+ def disabled?
14
+ @disabled
15
+ end
16
+
17
+ def disable!
18
+ @disabled = true
19
+ end
8
20
 
9
21
  def log_error(error)
10
22
  case error
@@ -23,13 +35,7 @@ module Bundler
23
35
  Bundler.ui.error error.message
24
36
  when LoadError
25
37
  raise error unless error.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
26
- Bundler.ui.error "\nCould not load OpenSSL."
27
- Bundler.ui.warn <<-WARN, :wrap => true
28
- You must recompile Ruby with OpenSSL support or change the sources in your \
29
- Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL \
30
- using RVM are available at https://rvm.io/packages/openssl.
31
- WARN
32
- Bundler.ui.trace error
38
+ Bundler.ui.error "\nCould not load OpenSSL. #{error.class}: #{error}\n#{error.backtrace.join("\n ")}"
33
39
  when Interrupt
34
40
  Bundler.ui.error "\nQuitting..."
35
41
  Bundler.ui.trace error
@@ -57,7 +63,7 @@ module Bundler
57
63
  end
58
64
 
59
65
  def request_issue_report_for(e)
60
- Bundler.ui.info <<-EOS.gsub(/^ {8}/, "")
66
+ Bundler.ui.error <<-EOS.gsub(/^ {8}/, ""), nil, nil
61
67
  --- ERROR REPORT TEMPLATE -------------------------------------------------------
62
68
  # Error Report
63
69
 
@@ -82,7 +88,7 @@ module Bundler
82
88
 
83
89
  I tried...
84
90
 
85
- - **Have you read our issues document, https://github.com/bundler/bundler/blob/master/doc/contributing/ISSUES.md?**
91
+ - **Have you read our issues document, https://github.com/rubygems/rubygems/blob/master/bundler/doc/contributing/ISSUES.md?**
86
92
 
87
93
  ...
88
94
 
@@ -100,13 +106,13 @@ module Bundler
100
106
 
101
107
  Bundler.ui.error "Unfortunately, an unexpected error occurred, and Bundler cannot continue."
102
108
 
103
- Bundler.ui.warn <<-EOS.gsub(/^ {8}/, "")
109
+ Bundler.ui.error <<-EOS.gsub(/^ {8}/, ""), nil, :yellow
104
110
 
105
111
  First, try this link to see if there are any existing issue reports for this error:
106
112
  #{issues_url(e)}
107
113
 
108
114
  If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
109
- https://github.com/bundler/bundler/issues/new
115
+ https://github.com/rubygems/rubygems/issues/new?labels=Bundler
110
116
  EOS
111
117
  end
112
118
 
@@ -114,16 +120,19 @@ module Bundler
114
120
  message = exception.message.lines.first.tr(":", " ").chomp
115
121
  message = message.split("-").first if exception.is_a?(Errno)
116
122
  require "cgi"
117
- "https://github.com/bundler/bundler/search?q=" \
123
+ "https://github.com/rubygems/rubygems/search?q=" \
118
124
  "#{CGI.escape(message)}&type=Issues"
119
125
  end
120
126
  end
121
127
 
122
128
  def self.with_friendly_errors
129
+ FriendlyErrors.enable!
123
130
  yield
124
131
  rescue SignalException
125
132
  raise
126
133
  rescue Exception => e # rubocop:disable Lint/RescueException
134
+ raise if FriendlyErrors.disabled?
135
+
127
136
  FriendlyErrors.log_error(e)
128
137
  exit FriendlyErrors.exit_status(e)
129
138
  end
@@ -15,6 +15,10 @@ module Bundler
15
15
  new(opts[:dir], opts[:name]).install
16
16
  end
17
17
 
18
+ def tag_prefix=(prefix)
19
+ instance.tag_prefix = prefix
20
+ end
21
+
18
22
  def gemspec(&block)
19
23
  gemspec = instance.gemspec
20
24
  block.call(gemspec) if block
@@ -24,12 +28,15 @@ module Bundler
24
28
 
25
29
  attr_reader :spec_path, :base, :gemspec
26
30
 
31
+ attr_writer :tag_prefix
32
+
27
33
  def initialize(base = nil, name = nil)
28
- @base = (base ||= SharedHelpers.pwd)
29
- gemspecs = name ? [File.join(base, "#{name}.gemspec")] : Dir[File.join(base, "{,*}.gemspec")]
34
+ @base = File.expand_path(base || SharedHelpers.pwd)
35
+ gemspecs = name ? [File.join(@base, "#{name}.gemspec")] : Gem::Util.glob_files_in_dir("{,*}.gemspec", @base)
30
36
  raise "Unable to determine name from existing gemspec. Use :name => 'gemname' in #install_tasks to manually set it." unless gemspecs.size == 1
31
37
  @spec_path = gemspecs.first
32
38
  @gemspec = Bundler.load_gemspec(@spec_path)
39
+ @tag_prefix = ""
33
40
  end
34
41
 
35
42
  def install
@@ -73,7 +80,7 @@ module Bundler
73
80
 
74
81
  def build_gem
75
82
  file_name = nil
76
- sh("#{gem_command} build -V #{spec_path.shellescape}".shellsplit) do
83
+ sh([*gem_command, "build", "-V", spec_path]) do
77
84
  file_name = File.basename(built_gem_path)
78
85
  SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
79
86
  FileUtils.mv(built_gem_path, "pkg")
@@ -84,36 +91,44 @@ module Bundler
84
91
 
85
92
  def install_gem(built_gem_path = nil, local = false)
86
93
  built_gem_path ||= build_gem
87
- cmd = "#{gem_command} install #{built_gem_path}"
88
- cmd += " --local" if local
89
- _, status = sh_with_status(cmd.shellsplit)
94
+ cmd = [*gem_command, "install", built_gem_path.to_s]
95
+ cmd << "--local" if local
96
+ _, status = sh_with_status(cmd)
90
97
  unless status.success?
91
98
  raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output"
92
99
  end
93
100
  Bundler.ui.confirm "#{name} (#{version}) installed."
94
101
  end
95
102
 
96
- protected
103
+ protected
97
104
 
98
105
  def rubygem_push(path)
99
- cmd = %W[#{gem_command} push #{path}]
106
+ cmd = [*gem_command, "push", path]
100
107
  cmd << "--key" << gem_key if gem_key
101
108
  cmd << "--host" << allowed_push_host if allowed_push_host
102
- unless allowed_push_host || Bundler.user_home.join(".gem/credentials").file?
103
- raise "Your rubygems.org credentials aren't set. Run `gem push` to set them."
104
- end
105
109
  sh_with_input(cmd)
106
110
  Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}"
107
111
  end
108
112
 
109
113
  def built_gem_path
110
- Dir[File.join(base, "#{name}-*.gem")].sort_by {|f| File.mtime(f) }.last
114
+ Gem::Util.glob_files_in_dir("#{name}-*.gem", base).sort_by {|f| File.mtime(f) }.last
111
115
  end
112
116
 
113
- def git_push(remote = "")
117
+ def git_push(remote = nil)
118
+ remote ||= default_remote
114
119
  perform_git_push remote
115
- perform_git_push "#{remote} --tags"
116
- Bundler.ui.confirm "Pushed git commits and tags."
120
+ perform_git_push "#{remote} #{version_tag}"
121
+ Bundler.ui.confirm "Pushed git commits and release tag."
122
+ end
123
+
124
+ def default_remote
125
+ current_branch = sh(%w[git rev-parse --abbrev-ref HEAD]).strip
126
+ return "origin" if current_branch.empty?
127
+
128
+ remote_for_branch = sh(%W[git config --get branch.#{current_branch}.remote]).strip
129
+ return "origin" if remote_for_branch.empty?
130
+
131
+ remote_for_branch
117
132
  end
118
133
 
119
134
  def allowed_push_host
@@ -168,7 +183,7 @@ module Bundler
168
183
  end
169
184
 
170
185
  def version_tag
171
- "v#{version}"
186
+ "#{@tag_prefix}v#{version}"
172
187
  end
173
188
 
174
189
  def name
@@ -210,7 +225,7 @@ module Bundler
210
225
  end
211
226
 
212
227
  def gem_command
213
- ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem"
228
+ ENV["GEM_COMMAND"]&.shellsplit || ["gem"]
214
229
  end
215
230
  end
216
231
  end
@@ -24,10 +24,15 @@ module Bundler
24
24
  module_function :generic
25
25
 
26
26
  def generic_local_platform
27
- generic(Bundler.local_platform)
27
+ generic(local_platform)
28
28
  end
29
29
  module_function :generic_local_platform
30
30
 
31
+ def local_platform
32
+ Bundler.local_platform
33
+ end
34
+ module_function :local_platform
35
+
31
36
  def platform_specificity_match(spec_platform, user_platform)
32
37
  spec_platform = Gem::Platform.new(spec_platform)
33
38
  return PlatformMatch::EXACT_MATCH if spec_platform == user_platform
@@ -7,7 +7,7 @@ module Bundler
7
7
  # available dependency versions as found in its index, before returning it to
8
8
  # to the resolution engine to select the best version.
9
9
  class GemVersionPromoter
10
- DEBUG = ENV["DEBUG_RESOLVER"]
10
+ DEBUG = ENV["BUNDLER_DEBUG_RESOLVER"] || ENV["DEBUG_RESOLVER"]
11
11
 
12
12
  attr_reader :level, :locked_specs, :unlock_gems
13
13
 
@@ -98,7 +98,7 @@ module Bundler
98
98
  level == :minor
99
99
  end
100
100
 
101
- private
101
+ private
102
102
 
103
103
  def filter_dep_specs(spec_groups, locked_spec)
104
104
  res = spec_groups.select do |spec_group|
@@ -27,7 +27,7 @@ module Bundler
27
27
  GraphVizClient.new(self).run
28
28
  end
29
29
 
30
- private
30
+ private
31
31
 
32
32
  def _populate_relations
33
33
  parent_dependencies = _groups.values.to_set.flatten
@@ -179,7 +179,7 @@ module Bundler
179
179
  @sources.uniq! # need to use uniq! here instead of checking for the item before adding
180
180
  end
181
181
 
182
- private
182
+ private
183
183
 
184
184
  def specs_by_name(name)
185
185
  @specs[name].values
@@ -195,7 +195,11 @@ module Bundler
195
195
  if base # allow all platforms when searching from a lockfile
196
196
  dependency.matches_spec?(spec)
197
197
  else
198
- dependency.matches_spec?(spec) && Gem::Platform.match(spec.platform)
198
+ if Gem::Platform.respond_to? :match_spec?
199
+ dependency.matches_spec?(spec) && Gem::Platform.match_spec?(spec)
200
+ else
201
+ dependency.matches_spec?(spec) && Gem::Platform.match(spec.platform)
202
+ end
199
203
  end
200
204
  end
201
205
 
@@ -74,7 +74,7 @@ module Bundler
74
74
  end
75
75
  end
76
76
 
77
- private
77
+ private
78
78
 
79
79
  def conservative_version(spec)
80
80
  version = spec.version
@@ -179,11 +179,22 @@ module Bundler
179
179
  # @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
180
180
  def remove_gems_from_gemfile(gems, gemfile_path)
181
181
  patterns = /gem\s+(['"])#{Regexp.union(gems)}\1|gem\s*\((['"])#{Regexp.union(gems)}\2\)/
182
+ new_gemfile = []
183
+ multiline_removal = false
184
+ IO.readlines(gemfile_path).each do |line|
185
+ match_data = line.match(patterns)
186
+ if match_data && is_not_within_comment?(line, match_data)
187
+ multiline_removal = line.rstrip.end_with?(",")
188
+ # skip lines which match the regex
189
+ next
190
+ end
182
191
 
183
- # remove lines which match the regex
184
- new_gemfile = IO.readlines(gemfile_path).reject {|line| line.match(patterns) }
192
+ # skip followup lines until line does not end with ','
193
+ new_gemfile << line unless multiline_removal
194
+ multiline_removal = line.rstrip.end_with?(",") if multiline_removal
195
+ end
185
196
 
186
- # remove lone \n and append them with other strings
197
+ # remove line \n and append them with other strings
187
198
  new_gemfile.each_with_index do |_line, index|
188
199
  if new_gemfile[index + 1] == "\n"
189
200
  new_gemfile[index] += new_gemfile[index + 1]
@@ -196,6 +207,13 @@ module Bundler
196
207
  new_gemfile.join.chomp
197
208
  end
198
209
 
210
+ # @param [String] line Individual line of gemfile content.
211
+ # @param [MatchData] match_data Data about Regex match.
212
+ def is_not_within_comment?(line, match_data)
213
+ match_start_index = match_data.offset(0).first
214
+ !line[0..match_start_index].include?("#")
215
+ end
216
+
199
217
  # @param [Array] gemfile Array of gemfile contents.
200
218
  # @param [String] block_name Name of block name to look for.
201
219
  def remove_nested_blocks(gemfile, block_name)