bundler 2.1.4 → 2.2.18

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 (227) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1790 -1430
  3. data/README.md +6 -8
  4. data/bundler.gemspec +5 -6
  5. data/exe/bundle +3 -0
  6. data/lib/bundler/build_metadata.rb +3 -11
  7. data/lib/bundler/cli/add.rb +1 -1
  8. data/lib/bundler/cli/binstubs.rb +6 -2
  9. data/lib/bundler/cli/cache.rb +2 -7
  10. data/lib/bundler/cli/clean.rb +1 -1
  11. data/lib/bundler/cli/common.rb +29 -2
  12. data/lib/bundler/cli/console.rb +1 -1
  13. data/lib/bundler/cli/doctor.rb +1 -1
  14. data/lib/bundler/cli/exec.rb +4 -4
  15. data/lib/bundler/cli/fund.rb +36 -0
  16. data/lib/bundler/cli/gem.rb +129 -28
  17. data/lib/bundler/cli/info.rb +15 -4
  18. data/lib/bundler/cli/init.rb +2 -2
  19. data/lib/bundler/cli/inject.rb +1 -1
  20. data/lib/bundler/cli/install.rb +13 -11
  21. data/lib/bundler/cli/issue.rb +2 -2
  22. data/lib/bundler/cli/list.rb +12 -10
  23. data/lib/bundler/cli/outdated.rb +94 -76
  24. data/lib/bundler/cli/plugin.rb +10 -0
  25. data/lib/bundler/cli/pristine.rb +5 -0
  26. data/lib/bundler/cli/show.rb +1 -1
  27. data/lib/bundler/cli/update.rb +3 -1
  28. data/lib/bundler/cli.rb +72 -56
  29. data/lib/bundler/compact_index_client/cache.rb +6 -14
  30. data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  31. data/lib/bundler/compact_index_client/updater.rb +13 -17
  32. data/lib/bundler/compact_index_client.rb +1 -1
  33. data/lib/bundler/current_ruby.rb +1 -0
  34. data/lib/bundler/definition.rb +117 -188
  35. data/lib/bundler/dep_proxy.rb +16 -9
  36. data/lib/bundler/dependency.rb +3 -10
  37. data/lib/bundler/dsl.rb +40 -33
  38. data/lib/bundler/endpoint_specification.rb +1 -1
  39. data/lib/bundler/env.rb +1 -1
  40. data/lib/bundler/environment_preserver.rb +26 -2
  41. data/lib/bundler/errors.rb +1 -0
  42. data/lib/bundler/feature_flag.rb +0 -6
  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 +9 -5
  46. data/lib/bundler/fetcher/index.rb +3 -4
  47. data/lib/bundler/fetcher.rb +5 -4
  48. data/lib/bundler/friendly_errors.rb +22 -13
  49. data/lib/bundler/gem_helper.rb +51 -18
  50. data/lib/bundler/gem_helpers.rb +36 -25
  51. data/lib/bundler/gem_version_promoter.rb +4 -4
  52. data/lib/bundler/graph.rb +1 -1
  53. data/lib/bundler/index.rb +13 -9
  54. data/lib/bundler/injector.rb +23 -5
  55. data/lib/bundler/inline.rb +3 -2
  56. data/lib/bundler/installer/gem_installer.rb +3 -3
  57. data/lib/bundler/installer/parallel_installer.rb +46 -25
  58. data/lib/bundler/installer/standalone.rb +17 -2
  59. data/lib/bundler/installer.rb +37 -49
  60. data/lib/bundler/lazy_specification.rb +45 -25
  61. data/lib/bundler/lockfile_generator.rb +1 -1
  62. data/lib/bundler/lockfile_parser.rb +4 -14
  63. data/lib/bundler/man/.document +1 -0
  64. data/{man → lib/bundler/man}/bundle-add.1 +1 -1
  65. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
  66. data/{man → lib/bundler/man}/bundle-binstubs.1 +5 -3
  67. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
  68. data/{man → lib/bundler/man}/bundle-cache.1 +1 -1
  69. data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
  70. data/{man → lib/bundler/man}/bundle-check.1 +1 -1
  71. data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  72. data/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  73. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  74. data/{man → lib/bundler/man}/bundle-config.1 +40 -38
  75. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +50 -50
  76. data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  77. data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  78. data/{man → lib/bundler/man}/bundle-exec.1 +1 -1
  79. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
  80. data/{man → lib/bundler/man}/bundle-gem.1 +25 -3
  81. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
  82. data/{man → lib/bundler/man}/bundle-info.1 +1 -1
  83. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  84. data/{man → lib/bundler/man}/bundle-init.1 +1 -1
  85. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
  86. data/{man → lib/bundler/man}/bundle-inject.1 +1 -1
  87. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
  88. data/{man → lib/bundler/man}/bundle-install.1 +30 -3
  89. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
  90. data/{man → lib/bundler/man}/bundle-list.1 +7 -7
  91. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  92. data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  93. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  94. data/{man → lib/bundler/man}/bundle-open.1 +1 -1
  95. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  96. data/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
  97. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
  98. data/{man → lib/bundler/man}/bundle-platform.1 +1 -1
  99. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
  100. data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  101. data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  102. data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  103. data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  104. data/{man → lib/bundler/man}/bundle-show.1 +1 -1
  105. data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
  106. data/{man → lib/bundler/man}/bundle-update.1 +1 -1
  107. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
  108. data/{man → lib/bundler/man}/bundle-viz.1 +1 -1
  109. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
  110. data/{man → lib/bundler/man}/bundle.1 +1 -1
  111. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
  112. data/{man → lib/bundler/man}/gemfile.5 +4 -4
  113. data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
  114. data/{man → lib/bundler/man}/index.txt +0 -0
  115. data/lib/bundler/mirror.rb +2 -2
  116. data/lib/bundler/plugin/api/source.rb +22 -1
  117. data/lib/bundler/plugin/dsl.rb +1 -1
  118. data/lib/bundler/plugin/index.rb +10 -1
  119. data/lib/bundler/plugin/installer/rubygems.rb +1 -1
  120. data/lib/bundler/plugin/installer.rb +9 -11
  121. data/lib/bundler/plugin/source_list.rb +5 -1
  122. data/lib/bundler/plugin.rb +33 -7
  123. data/lib/bundler/psyched_yaml.rb +0 -15
  124. data/lib/bundler/remote_specification.rb +5 -2
  125. data/lib/bundler/resolver/spec_group.rb +56 -53
  126. data/lib/bundler/resolver.rb +88 -115
  127. data/lib/bundler/retry.rb +2 -2
  128. data/lib/bundler/ruby_version.rb +1 -1
  129. data/lib/bundler/rubygems_ext.rb +71 -11
  130. data/lib/bundler/rubygems_gem_installer.rb +50 -9
  131. data/lib/bundler/rubygems_integration.rb +25 -60
  132. data/lib/bundler/runtime.rb +4 -14
  133. data/lib/bundler/settings.rb +107 -55
  134. data/lib/bundler/shared_helpers.rb +3 -3
  135. data/lib/bundler/similarity_detector.rb +1 -1
  136. data/lib/bundler/source/git/git_proxy.rb +82 -80
  137. data/lib/bundler/source/git.rb +24 -22
  138. data/lib/bundler/source/metadata.rb +0 -4
  139. data/lib/bundler/source/path/installer.rb +10 -10
  140. data/lib/bundler/source/path.rb +10 -4
  141. data/lib/bundler/source/rubygems/remote.rb +1 -1
  142. data/lib/bundler/source/rubygems.rb +60 -28
  143. data/lib/bundler/source/rubygems_aggregate.rb +64 -0
  144. data/lib/bundler/source.rb +16 -1
  145. data/lib/bundler/source_list.rb +52 -28
  146. data/lib/bundler/source_map.rb +58 -0
  147. data/lib/bundler/spec_set.rb +29 -17
  148. data/lib/bundler/stub_specification.rb +25 -7
  149. data/lib/bundler/templates/Gemfile +1 -1
  150. data/lib/bundler/templates/gems.rb +1 -1
  151. data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  152. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  153. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  154. data/lib/bundler/templates/newgem/README.md.tt +6 -5
  155. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  156. data/lib/bundler/templates/newgem/bin/console.tt +1 -0
  157. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  158. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  159. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +16 -0
  160. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  161. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  162. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  163. data/lib/bundler/templates/newgem/newgem.gemspec.tt +15 -7
  164. data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  165. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  166. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  167. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  168. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  169. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  170. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  171. data/lib/bundler/ui/shell.rb +5 -5
  172. data/lib/bundler/uri_credentials_filter.rb +3 -1
  173. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
  174. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  175. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
  176. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -2
  177. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +3 -3
  178. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  179. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +12 -1
  180. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +49 -47
  181. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  182. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
  183. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  184. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +4 -2
  185. data/lib/bundler/vendor/thor/lib/thor/actions.rb +1 -1
  186. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  187. data/lib/bundler/vendor/thor/lib/thor/error.rb +1 -1
  188. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +5 -1
  189. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +9 -8
  190. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +5 -2
  191. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +5 -1
  192. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  193. data/lib/bundler/vendor/thor/lib/thor.rb +5 -13
  194. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  195. data/lib/bundler/vendored_persistent.rb +0 -7
  196. data/lib/bundler/vendored_tmpdir.rb +4 -0
  197. data/lib/bundler/version.rb +1 -1
  198. data/lib/bundler/worker.rb +1 -1
  199. data/lib/bundler/yaml_serializer.rb +1 -1
  200. data/lib/bundler.rb +34 -9
  201. metadata +77 -86
  202. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  203. data/man/bundle-add.1.txt +0 -58
  204. data/man/bundle-binstubs.1.txt +0 -48
  205. data/man/bundle-cache.1.txt +0 -78
  206. data/man/bundle-check.1.txt +0 -33
  207. data/man/bundle-clean.1.txt +0 -26
  208. data/man/bundle-config.1.txt +0 -528
  209. data/man/bundle-doctor.1.txt +0 -44
  210. data/man/bundle-exec.1.txt +0 -178
  211. data/man/bundle-gem.1.txt +0 -91
  212. data/man/bundle-info.1.txt +0 -21
  213. data/man/bundle-init.1.txt +0 -34
  214. data/man/bundle-inject.1.txt +0 -32
  215. data/man/bundle-install.1.txt +0 -401
  216. data/man/bundle-list.1.txt +0 -43
  217. data/man/bundle-lock.1.txt +0 -93
  218. data/man/bundle-open.1.txt +0 -29
  219. data/man/bundle-outdated.1.txt +0 -131
  220. data/man/bundle-platform.1.txt +0 -57
  221. data/man/bundle-pristine.1.txt +0 -44
  222. data/man/bundle-remove.1.txt +0 -34
  223. data/man/bundle-show.1.txt +0 -27
  224. data/man/bundle-update.1.txt +0 -390
  225. data/man/bundle-viz.1.txt +0 -39
  226. data/man/bundle.1.txt +0 -116
  227. data/man/gemfile.5.txt +0 -649
data/lib/bundler/dsl.rb CHANGED
@@ -24,6 +24,9 @@ module Bundler
24
24
  def initialize
25
25
  @source = nil
26
26
  @sources = SourceList.new
27
+
28
+ @global_rubygems_sources = []
29
+
27
30
  @git_sources = {}
28
31
  @dependencies = []
29
32
  @groups = []
@@ -45,6 +48,7 @@ module Bundler
45
48
  @gemfiles << expanded_gemfile_path
46
49
  contents ||= Bundler.read_file(@gemfile.to_s)
47
50
  instance_eval(contents.dup.tap{|x| x.untaint if RUBY_VERSION < "2.7" }, gemfile.to_s, 1)
51
+ check_primary_source_safety
48
52
  rescue Exception => e # rubocop:disable Lint/RescueException
49
53
  message = "There was an error " \
50
54
  "#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \
@@ -63,7 +67,7 @@ module Bundler
63
67
  development_group = opts[:development_group] || :development
64
68
  expanded_path = gemfile_root.join(path)
65
69
 
66
- gemspecs = Dir[File.join(expanded_path, "{,*}.gemspec")].map {|g| Bundler.load_gemspec(g) }.compact
70
+ gemspecs = Gem::Util.glob_files_in_dir("{,*}.gemspec", expanded_path).map {|g| Bundler.load_gemspec(g) }.compact
67
71
  gemspecs.reject! {|s| s.name != name } if name
68
72
  Index.sort_specs(gemspecs)
69
73
  specs_by_name_and_version = gemspecs.group_by {|s| [s.name, s.version] }
@@ -75,8 +79,7 @@ module Bundler
75
79
 
76
80
  @gemspecs << spec
77
81
 
78
- gem_platforms = Bundler::Dependency::REVERSE_PLATFORM_MAP[Bundler::GemHelpers.generic_local_platform]
79
- gem spec.name, :name => spec.name, :path => path, :glob => glob, :platforms => gem_platforms
82
+ gem spec.name, :name => spec.name, :path => path, :glob => glob
80
83
 
81
84
  group(development_group) do
82
85
  spec.development_dependencies.each do |dep|
@@ -165,8 +168,7 @@ module Bundler
165
168
  elsif block_given?
166
169
  with_source(@sources.add_rubygems_source("remotes" => source), &blk)
167
170
  else
168
- check_primary_source_safety(@sources)
169
- @sources.global_rubygems_source = source
171
+ @global_rubygems_sources << source
170
172
  end
171
173
  end
172
174
 
@@ -184,24 +186,14 @@ module Bundler
184
186
  end
185
187
 
186
188
  def path(path, options = {}, &blk)
187
- unless block_given?
188
- msg = "You can no longer specify a path source by itself. Instead, \n" \
189
- "either use the :path option on a gem, or specify the gems that \n" \
190
- "bundler should find in the path source by passing a block to \n" \
191
- "the path method, like: \n\n" \
192
- " path 'dir/containing/rails' do\n" \
193
- " gem 'rails'\n" \
194
- " end\n\n"
195
-
196
- raise DeprecatedError, msg if Bundler.feature_flag.disable_multisource?
197
- SharedHelpers.major_deprecation(2, msg.strip)
198
- end
199
-
200
189
  source_options = normalize_hash(options).merge(
201
190
  "path" => Pathname.new(path),
202
191
  "root_path" => gemfile_root,
203
192
  "gemspec" => gemspecs.find {|g| g.name == options["name"] }
204
193
  )
194
+
195
+ source_options["global"] = true unless block_given?
196
+
205
197
  source = @sources.add_path_source(source_options)
206
198
  with_source(source, &blk)
207
199
  end
@@ -223,7 +215,6 @@ module Bundler
223
215
 
224
216
  def github(repo, options = {})
225
217
  raise ArgumentError, "GitHub sources require a block" unless block_given?
226
- raise DeprecatedError, "The #github method has been removed" if Bundler.feature_flag.skip_default_git_sources?
227
218
  github_uri = @git_sources["github"].call(repo)
228
219
  git_options = normalize_hash(options).merge("uri" => github_uri)
229
220
  git_source = @sources.add_git_source(git_options)
@@ -281,11 +272,14 @@ module Bundler
281
272
  raise GemfileError, "Undefined local variable or method `#{name}' for Gemfile"
282
273
  end
283
274
 
284
- private
275
+ def check_primary_source_safety
276
+ check_path_source_safety
277
+ check_rubygems_source_safety
278
+ end
285
279
 
286
- def add_git_sources
287
- return if Bundler.feature_flag.skip_default_git_sources?
280
+ private
288
281
 
282
+ def add_git_sources
289
283
  git_source(:github) do |repo_name|
290
284
  warn_deprecated_git_source(:github, <<-'RUBY'.strip, 'Change any "reponame" :github sources to "username/reponame".')
291
285
  "https://github.com/#{repo_name}.git"
@@ -444,25 +438,38 @@ repo_name ||= user_name
444
438
  end
445
439
  end
446
440
 
447
- def check_primary_source_safety(source_list)
448
- return if source_list.rubygems_primary_remotes.empty? && source_list.global_rubygems_source.nil?
441
+ def check_path_source_safety
442
+ return if @sources.global_path_source.nil?
443
+
444
+ msg = "You can no longer specify a path source by itself. Instead, \n" \
445
+ "either use the :path option on a gem, or specify the gems that \n" \
446
+ "bundler should find in the path source by passing a block to \n" \
447
+ "the path method, like: \n\n" \
448
+ " path 'dir/containing/rails' do\n" \
449
+ " gem 'rails'\n" \
450
+ " end\n\n"
451
+
452
+ SharedHelpers.major_deprecation(2, msg.strip)
453
+ end
454
+
455
+ def check_rubygems_source_safety
456
+ @sources.global_rubygems_source = @global_rubygems_sources.shift
457
+ return if @global_rubygems_sources.empty?
449
458
 
450
- if Bundler.feature_flag.disable_multisource?
459
+ @global_rubygems_sources.each do |source|
460
+ @sources.add_rubygems_remote(source)
461
+ end
462
+
463
+ if Bundler.feature_flag.bundler_3_mode?
451
464
  msg = "This Gemfile contains multiple primary sources. " \
452
465
  "Each source after the first must include a block to indicate which gems " \
453
466
  "should come from that source"
454
- unless Bundler.feature_flag.bundler_2_mode?
455
- msg += ". To downgrade this error to a warning, run " \
456
- "`bundle config unset disable_multisource`"
457
- end
458
467
  raise GemfileEvalError, msg
459
468
  else
460
469
  Bundler::SharedHelpers.major_deprecation 2, "Your Gemfile contains multiple primary sources. " \
461
470
  "Using `source` more than once without a block is a security risk, and " \
462
471
  "may result in installing unexpected gems. To resolve this warning, use " \
463
- "a block to indicate which gems should come from the secondary source. " \
464
- "To upgrade this warning to an error, run `bundle config set " \
465
- "disable_multisource true`."
472
+ "a block to indicate which gems should come from the secondary source."
466
473
  end
467
474
  end
468
475
 
@@ -571,7 +578,7 @@ The :#{name} git source is deprecated, and will be removed in the future.#{addit
571
578
  end
572
579
  end
573
580
 
574
- private
581
+ private
575
582
 
576
583
  def parse_line_number_from_description
577
584
  description = self.description
@@ -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"
data/lib/bundler/env.rb CHANGED
@@ -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
 
@@ -27,23 +27,17 @@ module Bundler
27
27
 
28
28
  (1..10).each {|v| define_method("bundler_#{v}_mode?") { major_version >= v } }
29
29
 
30
- settings_flag(:allow_bundler_dependency_conflicts) { bundler_3_mode? }
31
30
  settings_flag(:allow_offline_install) { bundler_3_mode? }
32
31
  settings_flag(:auto_clean_without_path) { bundler_3_mode? }
33
- settings_flag(:auto_config_jobs) { bundler_3_mode? }
34
32
  settings_flag(:cache_all) { bundler_3_mode? }
35
33
  settings_flag(:default_install_uses_path) { bundler_3_mode? }
36
34
  settings_flag(:deployment_means_frozen) { bundler_3_mode? }
37
- settings_flag(:disable_multisource) { bundler_3_mode? }
38
35
  settings_flag(:forget_cli_options) { bundler_3_mode? }
39
36
  settings_flag(:global_gem_cache) { bundler_3_mode? }
40
- settings_flag(:only_update_to_newer_versions) { bundler_3_mode? }
41
37
  settings_flag(:path_relative_to_cwd) { bundler_3_mode? }
42
38
  settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
43
39
  settings_flag(:print_only_version_number) { bundler_3_mode? }
44
40
  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
41
  settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
48
42
  settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? }
49
43
  settings_flag(:update_requires_all_flag) { bundler_4_mode? }
@@ -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 ||=
@@ -14,8 +14,10 @@ module Bundler
14
14
  def fetch(uri, headers = {}, counter = 0)
15
15
  raise HTTPError, "Too many redirects" if counter >= redirect_limit
16
16
 
17
+ filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)
18
+
17
19
  response = request(uri, headers)
18
- Bundler.ui.debug("HTTP #{response.code} #{response.message} #{uri}")
20
+ Bundler.ui.debug("HTTP #{response.code} #{response.message} #{filtered_uri}")
19
21
 
20
22
  case response
21
23
  when Net::HTTPSuccess, Net::HTTPNotModified
@@ -40,7 +42,7 @@ module Bundler
40
42
  raise BadAuthenticationError, uri.host if uri.userinfo
41
43
  raise AuthenticationRequiredError, uri.host
42
44
  when Net::HTTPNotFound
43
- raise FallbackError, "Net::HTTPNotFound: #{URICredentialsFilter.credential_filtered_uri(uri)}"
45
+ raise FallbackError, "Net::HTTPNotFound: #{filtered_uri}"
44
46
  else
45
47
  raise HTTPError, "#{response.class}#{": #{response.body}" unless response.body.empty?}"
46
48
  end
@@ -49,7 +51,9 @@ module Bundler
49
51
  def request(uri, headers)
50
52
  validate_uri_scheme!(uri)
51
53
 
52
- Bundler.ui.debug "HTTP GET #{uri}"
54
+ filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)
55
+
56
+ Bundler.ui.debug "HTTP GET #{filtered_uri}"
53
57
  req = Net::HTTP::Get.new uri.request_uri, headers
54
58
  if uri.user
55
59
  user = CGI.unescape(uri.user)
@@ -69,12 +73,12 @@ module Bundler
69
73
  raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \
70
74
  "connection and try again."
71
75
  else
72
- raise HTTPError, "Network error while fetching #{URICredentialsFilter.credential_filtered_uri(uri)}" \
76
+ raise HTTPError, "Network error while fetching #{filtered_uri}" \
73
77
  " (#{e})"
74
78
  end
75
79
  end
76
80
 
77
- private
81
+ private
78
82
 
79
83
  def validate_uri_scheme!(uri)
80
84
  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)
@@ -47,7 +47,8 @@ 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`\n" \
51
+ "or by storing the credentials in the `#{Settings.key_for(remote_uri)}` environment variable"
51
52
  end
52
53
  end
53
54
  # This error is raised if HTTP authentication is provided, but incorrect.
@@ -137,7 +138,6 @@ module Bundler
137
138
  end
138
139
 
139
140
  specs.each do |name, version, platform, dependencies, metadata|
140
- next if name == "bundler"
141
141
  spec = if dependencies
142
142
  EndpointSpecification.new(name, version, platform, dependencies, metadata)
143
143
  else
@@ -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
@@ -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&template=bundler-related-issue.md
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
@@ -40,6 +47,11 @@ module Bundler
40
47
  built_gem_path = build_gem
41
48
  end
42
49
 
50
+ desc "Generate SHA512 checksum if #{name}-#{version}.gem into the checksums directory."
51
+ task "build:checksum" => "build" do
52
+ build_checksum(built_gem_path)
53
+ end
54
+
43
55
  desc "Build and install #{name}-#{version}.gem into system gems."
44
56
  task "install" => "build" do
45
57
  install_gem(built_gem_path)
@@ -73,7 +85,7 @@ module Bundler
73
85
 
74
86
  def build_gem
75
87
  file_name = nil
76
- sh("#{gem_command} build -V #{spec_path.shellescape}".shellsplit) do
88
+ sh([*gem_command, "build", "-V", spec_path]) do
77
89
  file_name = File.basename(built_gem_path)
78
90
  SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
79
91
  FileUtils.mv(built_gem_path, "pkg")
@@ -84,36 +96,57 @@ module Bundler
84
96
 
85
97
  def install_gem(built_gem_path = nil, local = false)
86
98
  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)
99
+ cmd = [*gem_command, "install", built_gem_path.to_s]
100
+ cmd << "--local" if local
101
+ _, status = sh_with_status(cmd)
90
102
  unless status.success?
91
103
  raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output"
92
104
  end
93
105
  Bundler.ui.confirm "#{name} (#{version}) installed."
94
106
  end
95
107
 
96
- protected
108
+ def build_checksum(built_gem_path = nil)
109
+ built_gem_path ||= build_gem
110
+ SharedHelpers.filesystem_access(File.join(base, "checksums")) {|p| FileUtils.mkdir_p(p) }
111
+ file_name = "#{File.basename(built_gem_path)}.sha512"
112
+ require "digest/sha2"
113
+ checksum = Digest::SHA512.new.hexdigest(built_gem_path.to_s)
114
+ target = File.join(base, "checksums", file_name)
115
+ File.write(target, checksum)
116
+ Bundler.ui.confirm "#{name} #{version} checksum written to checksums/#{file_name}."
117
+ end
118
+
119
+ protected
97
120
 
98
121
  def rubygem_push(path)
99
- cmd = %W[#{gem_command} push #{path}]
122
+ cmd = [*gem_command, "push", path]
100
123
  cmd << "--key" << gem_key if gem_key
101
124
  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
125
  sh_with_input(cmd)
106
126
  Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}"
107
127
  end
108
128
 
109
129
  def built_gem_path
110
- Dir[File.join(base, "#{name}-*.gem")].sort_by {|f| File.mtime(f) }.last
130
+ Gem::Util.glob_files_in_dir("#{name}-*.gem", base).sort_by {|f| File.mtime(f) }.last
131
+ end
132
+
133
+ def git_push(remote = nil)
134
+ remote ||= default_remote
135
+ perform_git_push "#{remote} refs/heads/#{current_branch}"
136
+ perform_git_push "#{remote} refs/tags/#{version_tag}"
137
+ Bundler.ui.confirm "Pushed git commits and release tag."
138
+ end
139
+
140
+ def default_remote
141
+ remote_for_branch, status = sh_with_status(%W[git config --get branch.#{current_branch}.remote])
142
+ return "origin" unless status.success?
143
+
144
+ remote_for_branch.strip
111
145
  end
112
146
 
113
- def git_push(remote = "")
114
- perform_git_push remote
115
- perform_git_push "#{remote} --tags"
116
- Bundler.ui.confirm "Pushed git commits and tags."
147
+ def current_branch
148
+ # We can replace this with `git branch --show-current` once we drop support for git < 2.22.0
149
+ sh(%w[git rev-parse --abbrev-ref HEAD]).gsub(%r{\Aheads/}, "").strip
117
150
  end
118
151
 
119
152
  def allowed_push_host
@@ -168,7 +201,7 @@ module Bundler
168
201
  end
169
202
 
170
203
  def version_tag
171
- "v#{version}"
204
+ "#{@tag_prefix}v#{version}"
172
205
  end
173
206
 
174
207
  def name
@@ -210,7 +243,7 @@ module Bundler
210
243
  end
211
244
 
212
245
  def gem_command
213
- ENV["GEM_COMMAND"] ? ENV["GEM_COMMAND"] : "gem"
246
+ ENV["GEM_COMMAND"]&.shellsplit || ["gem"]
214
247
  end
215
248
  end
216
249
  end