bundler 2.0.0.pre.1 → 2.1.0.pre.3

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 (230) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +774 -574
  3. data/LICENSE.md +18 -19
  4. data/README.md +9 -8
  5. data/bundler.gemspec +12 -23
  6. data/exe/bundle +19 -3
  7. data/lib/bundler.rb +203 -87
  8. data/lib/bundler/build_metadata.rb +14 -7
  9. data/lib/bundler/capistrano.rb +5 -5
  10. data/lib/bundler/cli.rb +181 -143
  11. data/lib/bundler/cli/add.rb +28 -16
  12. data/lib/bundler/cli/cache.rb +25 -13
  13. data/lib/bundler/cli/common.rb +11 -12
  14. data/lib/bundler/cli/config.rb +161 -86
  15. data/lib/bundler/cli/console.rb +2 -2
  16. data/lib/bundler/cli/doctor.rb +4 -4
  17. data/lib/bundler/cli/exec.rb +4 -16
  18. data/lib/bundler/cli/gem.rb +5 -5
  19. data/lib/bundler/cli/info.rb +17 -5
  20. data/lib/bundler/cli/init.rb +1 -1
  21. data/lib/bundler/cli/install.rb +12 -11
  22. data/lib/bundler/cli/issue.rb +3 -3
  23. data/lib/bundler/cli/open.rb +10 -6
  24. data/lib/bundler/cli/outdated.rb +85 -81
  25. data/lib/bundler/cli/plugin.rb +9 -2
  26. data/lib/bundler/cli/pristine.rb +1 -1
  27. data/lib/bundler/cli/show.rb +1 -1
  28. data/lib/bundler/cli/update.rb +32 -12
  29. data/lib/bundler/compact_index_client.rb +25 -9
  30. data/lib/bundler/compact_index_client/updater.rb +2 -6
  31. data/lib/bundler/current_ruby.rb +9 -7
  32. data/lib/bundler/definition.rb +36 -27
  33. data/lib/bundler/dependency.rb +16 -4
  34. data/lib/bundler/deployment.rb +2 -2
  35. data/lib/bundler/dsl.rb +18 -42
  36. data/lib/bundler/env.rb +8 -13
  37. data/lib/bundler/environment_preserver.rb +0 -1
  38. data/lib/bundler/feature_flag.rb +1 -11
  39. data/lib/bundler/fetcher.rb +14 -11
  40. data/lib/bundler/fetcher/compact_index.rb +26 -12
  41. data/lib/bundler/fetcher/dependency.rb +1 -1
  42. data/lib/bundler/fetcher/downloader.rb +4 -1
  43. data/lib/bundler/fetcher/index.rb +4 -2
  44. data/lib/bundler/friendly_errors.rb +5 -6
  45. data/lib/bundler/gem_helper.rb +38 -25
  46. data/lib/bundler/gem_helpers.rb +2 -4
  47. data/lib/bundler/gem_tasks.rb +1 -1
  48. data/lib/bundler/gem_version_promoter.rb +3 -3
  49. data/lib/bundler/graph.rb +2 -2
  50. data/lib/bundler/injector.rb +10 -8
  51. data/lib/bundler/inline.rb +25 -20
  52. data/lib/bundler/installer.rb +7 -14
  53. data/lib/bundler/installer/gem_installer.rb +5 -1
  54. data/lib/bundler/installer/parallel_installer.rb +4 -8
  55. data/lib/bundler/installer/standalone.rb +1 -2
  56. data/lib/bundler/lazy_specification.rb +2 -2
  57. data/lib/bundler/lockfile_parser.rb +14 -21
  58. data/lib/bundler/match_platform.rb +1 -1
  59. data/lib/bundler/plugin.rb +42 -29
  60. data/lib/bundler/plugin/api.rb +1 -1
  61. data/lib/bundler/plugin/api/source.rb +2 -2
  62. data/lib/bundler/plugin/index.rb +14 -3
  63. data/lib/bundler/plugin/installer.rb +28 -15
  64. data/lib/bundler/psyched_yaml.rb +1 -1
  65. data/lib/bundler/resolver.rb +72 -24
  66. data/lib/bundler/resolver/spec_group.rb +3 -2
  67. data/lib/bundler/retry.rb +2 -2
  68. data/lib/bundler/ruby_version.rb +4 -19
  69. data/lib/bundler/rubygems_ext.rb +11 -67
  70. data/lib/bundler/rubygems_gem_installer.rb +1 -1
  71. data/lib/bundler/rubygems_integration.rb +143 -395
  72. data/lib/bundler/runtime.rb +2 -9
  73. data/lib/bundler/settings.rb +15 -48
  74. data/lib/bundler/setup.rb +7 -13
  75. data/lib/bundler/shared_helpers.rb +57 -73
  76. data/lib/bundler/similarity_detector.rb +2 -2
  77. data/lib/bundler/source.rb +5 -5
  78. data/lib/bundler/source/git.rb +19 -12
  79. data/lib/bundler/source/git/git_proxy.rb +36 -40
  80. data/lib/bundler/source/metadata.rb +9 -5
  81. data/lib/bundler/source/path.rb +13 -8
  82. data/lib/bundler/source/rubygems.rb +11 -5
  83. data/lib/bundler/source/rubygems/remote.rb +1 -2
  84. data/lib/bundler/source_list.rb +9 -12
  85. data/lib/bundler/spec_set.rb +23 -12
  86. data/lib/bundler/stub_specification.rb +18 -30
  87. data/lib/bundler/templates/Executable.bundler +23 -14
  88. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +3 -3
  89. data/lib/bundler/templates/newgem/Gemfile.tt +8 -2
  90. data/lib/bundler/templates/newgem/README.md.tt +4 -3
  91. data/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -27
  92. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +1 -1
  93. data/lib/bundler/templates/newgem/travis.yml.tt +0 -1
  94. data/lib/bundler/ui.rb +3 -3
  95. data/lib/bundler/ui/rg_proxy.rb +1 -1
  96. data/lib/bundler/ui/shell.rb +4 -8
  97. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +161 -0
  98. data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +66 -0
  99. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +176 -0
  100. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  101. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +273 -147
  102. data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +5 -0
  103. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +6 -6
  104. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +2 -2
  105. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -1
  106. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -1
  107. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -1
  108. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -1
  109. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +6 -6
  110. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -1
  111. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -1
  112. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +30 -8
  113. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  114. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +4 -4
  115. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +2 -2
  116. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +248 -279
  117. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +40 -0
  118. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +53 -0
  119. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  120. data/lib/bundler/vendor/thor/lib/thor.rb +12 -4
  121. data/lib/bundler/vendor/thor/lib/thor/actions.rb +22 -11
  122. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -1
  123. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +1 -1
  124. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +7 -17
  125. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +16 -7
  126. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +19 -8
  127. data/lib/bundler/vendor/thor/lib/thor/base.rb +25 -24
  128. data/lib/bundler/vendor/thor/lib/thor/command.rb +21 -14
  129. data/lib/bundler/vendor/thor/lib/thor/error.rb +78 -0
  130. data/lib/bundler/vendor/thor/lib/thor/group.rb +3 -3
  131. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -0
  132. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
  133. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +1 -1
  134. data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +6 -6
  135. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
  136. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +1 -1
  137. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +8 -6
  138. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +20 -5
  139. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +1 -0
  140. data/lib/bundler/vendor/thor/lib/thor/runner.rb +8 -6
  141. data/lib/bundler/vendor/thor/lib/thor/shell.rb +4 -4
  142. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +52 -7
  143. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +6 -2
  144. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +1 -1
  145. data/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
  146. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  147. data/lib/bundler/vendored_fileutils.rb +1 -6
  148. data/lib/bundler/vendored_molinillo.rb +1 -1
  149. data/lib/bundler/vendored_persistent.rb +7 -5
  150. data/lib/bundler/vendored_thor.rb +2 -2
  151. data/lib/bundler/version.rb +1 -20
  152. data/lib/bundler/version_ranges.rb +51 -5
  153. data/lib/bundler/vlad.rb +3 -3
  154. data/lib/bundler/worker.rb +1 -3
  155. data/lib/bundler/yaml_serializer.rb +2 -3
  156. data/man/bundle-add.1 +10 -2
  157. data/man/bundle-add.1.txt +11 -5
  158. data/man/bundle-add.ronn +7 -1
  159. data/man/bundle-binstubs.1 +2 -2
  160. data/man/bundle-binstubs.1.txt +2 -2
  161. data/man/bundle-binstubs.ronn +1 -1
  162. data/man/bundle-cache.1 +55 -0
  163. data/man/bundle-cache.1.txt +78 -0
  164. data/man/{bundle-package.ronn → bundle-cache.ronn} +15 -15
  165. data/man/bundle-check.1 +1 -1
  166. data/man/bundle-check.1.txt +6 -6
  167. data/man/bundle-clean.1 +1 -1
  168. data/man/bundle-clean.1.txt +1 -1
  169. data/man/bundle-config.1 +36 -36
  170. data/man/bundle-config.1.txt +66 -67
  171. data/man/bundle-config.ronn +42 -40
  172. data/man/bundle-doctor.1 +1 -1
  173. data/man/bundle-doctor.1.txt +1 -1
  174. data/man/bundle-exec.1 +2 -2
  175. data/man/bundle-exec.1.txt +2 -2
  176. data/man/bundle-exec.ronn +1 -1
  177. data/man/bundle-gem.1 +1 -1
  178. data/man/bundle-gem.1.txt +3 -3
  179. data/man/bundle-info.1 +1 -1
  180. data/man/bundle-info.1.txt +1 -1
  181. data/man/bundle-init.1 +2 -2
  182. data/man/bundle-init.1.txt +2 -2
  183. data/man/bundle-init.ronn +1 -1
  184. data/man/bundle-inject.1 +1 -1
  185. data/man/bundle-inject.1.txt +1 -1
  186. data/man/bundle-install.1 +8 -5
  187. data/man/bundle-install.1.txt +56 -51
  188. data/man/bundle-install.ronn +9 -4
  189. data/man/bundle-list.1 +1 -1
  190. data/man/bundle-list.1.txt +1 -1
  191. data/man/bundle-lock.1 +1 -1
  192. data/man/bundle-lock.1.txt +16 -16
  193. data/man/bundle-open.1 +1 -1
  194. data/man/bundle-open.1.txt +1 -1
  195. data/man/bundle-outdated.1 +1 -1
  196. data/man/bundle-outdated.1.txt +1 -1
  197. data/man/bundle-platform.1 +1 -1
  198. data/man/bundle-platform.1.txt +1 -1
  199. data/man/bundle-pristine.1 +1 -1
  200. data/man/bundle-pristine.1.txt +1 -1
  201. data/man/bundle-remove.1 +1 -1
  202. data/man/bundle-remove.1.txt +1 -1
  203. data/man/bundle-show.1 +1 -1
  204. data/man/bundle-show.1.txt +1 -1
  205. data/man/bundle-update.1 +4 -4
  206. data/man/bundle-update.1.txt +64 -65
  207. data/man/bundle-update.ronn +3 -3
  208. data/man/bundle-viz.1 +1 -1
  209. data/man/bundle-viz.1.txt +1 -1
  210. data/man/bundle.1 +7 -3
  211. data/man/bundle.1.txt +11 -8
  212. data/man/bundle.ronn +5 -2
  213. data/man/gemfile.5 +17 -20
  214. data/man/gemfile.5.ronn +14 -18
  215. data/man/gemfile.5.txt +108 -112
  216. data/man/index.txt +1 -1
  217. metadata +19 -107
  218. data/exe/bundle_ruby +0 -60
  219. data/lib/bundler/cli/package.rb +0 -49
  220. data/lib/bundler/compatibility_guard.rb +0 -14
  221. data/lib/bundler/ssl_certs/.document +0 -1
  222. data/lib/bundler/ssl_certs/certificate_manager.rb +0 -66
  223. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +0 -21
  224. data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +0 -23
  225. data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +0 -25
  226. data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +0 -27
  227. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +0 -129
  228. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +0 -129
  229. data/man/bundle-package.1 +0 -55
  230. data/man/bundle-package.1.txt +0 -79
@@ -28,7 +28,7 @@ module Bundler
28
28
 
29
29
  protected
30
30
 
31
- # http://www.informit.com/articles/article.aspx?p=683059&seqNum=36
31
+ # https://www.informit.com/articles/article.aspx?p=683059&seqNum=36
32
32
  def levenshtein_distance(this, that, ins = 2, del = 2, sub = 1)
33
33
  # ins, del, sub are weighted costs
34
34
  return nil if this.nil?
@@ -51,7 +51,7 @@ module Bundler
51
51
  dm[i][j] = [
52
52
  dm[i - 1][j - 1] + (this[j - 1] == that[i - 1] ? 0 : sub),
53
53
  dm[i][j - 1] + ins,
54
- dm[i - 1][j] + del
54
+ dm[i - 1][j] + del,
55
55
  ].min
56
56
  end
57
57
  end
@@ -2,11 +2,11 @@
2
2
 
3
3
  module Bundler
4
4
  class Source
5
- autoload :Gemspec, "bundler/source/gemspec"
6
- autoload :Git, "bundler/source/git"
7
- autoload :Metadata, "bundler/source/metadata"
8
- autoload :Path, "bundler/source/path"
9
- autoload :Rubygems, "bundler/source/rubygems"
5
+ autoload :Gemspec, File.expand_path("source/gemspec", __dir__)
6
+ autoload :Git, File.expand_path("source/git", __dir__)
7
+ autoload :Metadata, File.expand_path("source/metadata", __dir__)
8
+ autoload :Path, File.expand_path("source/path", __dir__)
9
+ autoload :Rubygems, File.expand_path("source/rubygems", __dir__)
10
10
 
11
11
  attr_accessor :dependency_names
12
12
 
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/vendored_fileutils"
3
+ require_relative "../vendored_fileutils"
4
4
  require "uri"
5
5
 
6
6
  module Bundler
7
7
  class Source
8
8
  class Git < Path
9
- autoload :GitProxy, "bundler/source/git/git_proxy"
9
+ autoload :GitProxy, File.expand_path("git/git_proxy", __dir__)
10
10
 
11
11
  attr_reader :uri, :ref, :branch, :options, :submodules
12
12
 
@@ -118,18 +118,19 @@ module Bundler
118
118
  def local_override!(path)
119
119
  return false if local?
120
120
 
121
+ original_path = path
121
122
  path = Pathname.new(path)
122
123
  path = path.expand_path(Bundler.root) unless path.relative?
123
124
 
124
125
  unless options["branch"] || Bundler.settings[:disable_local_branch_check]
125
126
  raise GitError, "Cannot use local override for #{name} at #{path} because " \
126
- ":branch is not specified in Gemfile. Specify a branch or use " \
127
- "`bundle config --delete` to remove the local override"
127
+ ":branch is not specified in Gemfile. Specify a branch or run " \
128
+ "`bundle config unset local.#{override_for(original_path)}` to remove the local override"
128
129
  end
129
130
 
130
131
  unless path.exist?
131
132
  raise GitError, "Cannot use local override for #{name} because #{path} " \
132
- "does not exist. Check `bundle config --delete` to remove the local override"
133
+ "does not exist. Run `bundle config unset local.#{override_for(original_path)}` to remove the local override"
133
134
  end
134
135
 
135
136
  set_local!(path)
@@ -260,7 +261,11 @@ module Bundler
260
261
  end
261
262
 
262
263
  def requires_checkout?
263
- allow_git_ops? && !local?
264
+ allow_git_ops? && !local? && !cached_revision_checked_out?
265
+ end
266
+
267
+ def cached_revision_checked_out?
268
+ cached_revision && cached_revision == revision && install_path.exist?
264
269
  end
265
270
 
266
271
  def base_name
@@ -309,12 +314,10 @@ module Bundler
309
314
  # no-op, since we validate when re-serializing the gemspec
310
315
  def validate_spec(_spec); end
311
316
 
312
- if Bundler.rubygems.stubs_provide_full_functionality?
313
- def load_gemspec(file)
314
- stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent)
315
- stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s.untaint
316
- StubSpecification.from_stub(stub)
317
- end
317
+ def load_gemspec(file)
318
+ stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent)
319
+ stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s.tap{|x| x.untaint if RUBY_VERSION < "2.7" }
320
+ StubSpecification.from_stub(stub)
318
321
  end
319
322
 
320
323
  def git_scope
@@ -324,6 +327,10 @@ module Bundler
324
327
  def extension_cache_slug(_)
325
328
  extension_dir_name
326
329
  end
330
+
331
+ def override_for(path)
332
+ Bundler.settings.local_overrides.key(path)
333
+ end
327
334
  end
328
335
  end
329
336
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "open3"
3
4
  require "shellwords"
4
- require "tempfile"
5
+
5
6
  module Bundler
6
7
  class Source
7
8
  class Git
@@ -18,14 +19,18 @@ module Bundler
18
19
  def initialize(command)
19
20
  msg = String.new
20
21
  msg << "Bundler is trying to run a `git #{command}` at runtime. You probably need to run `bundle install`. However, "
21
- msg << "this error message could probably be more useful. Please submit a ticket at http://github.com/bundler/bundler/issues "
22
+ msg << "this error message could probably be more useful. Please submit a ticket at https://github.com/bundler/bundler/issues "
22
23
  msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}"
23
24
  super msg
24
25
  end
25
26
  end
26
27
 
27
28
  class GitCommandError < GitError
29
+ attr_reader :command
30
+
28
31
  def initialize(command, path = nil, extra_info = nil)
32
+ @command = command
33
+
29
34
  msg = String.new
30
35
  msg << "Git error: command `git #{command}` in directory #{SharedHelpers.pwd} has failed."
31
36
  msg << "\n#{extra_info}" if extra_info
@@ -34,10 +39,10 @@ module Bundler
34
39
  end
35
40
  end
36
41
 
37
- class MissingGitRevisionError < GitError
38
- def initialize(ref, repo)
42
+ class MissingGitRevisionError < GitCommandError
43
+ def initialize(command, path, ref, repo)
39
44
  msg = "Revision #{ref} does not exist in the repository #{repo}. Maybe you misspelled it?"
40
- super msg
45
+ super command, path, msg
41
46
  end
42
47
  end
43
48
 
@@ -62,8 +67,8 @@ module Bundler
62
67
 
63
68
  begin
64
69
  @revision ||= find_local_revision
65
- rescue GitCommandError
66
- raise MissingGitRevisionError.new(ref, URICredentialsFilter.credential_filtered_uri(uri))
70
+ rescue GitCommandError => e
71
+ raise MissingGitRevisionError.new(e.command, path, ref, URICredentialsFilter.credential_filtered_uri(uri))
67
72
  end
68
73
 
69
74
  @revision
@@ -77,8 +82,8 @@ module Bundler
77
82
 
78
83
  def contains?(commit)
79
84
  allowed_in_path do
80
- result = git_null("branch --contains #{commit}")
81
- $? == 0 && result =~ /^\* (.*)$/
85
+ result, status = git_null("branch --contains #{commit}")
86
+ status.success? && result =~ /^\* (.*)$/
82
87
  end
83
88
  end
84
89
 
@@ -134,8 +139,8 @@ module Bundler
134
139
 
135
140
  begin
136
141
  git "reset --hard #{@revision}"
137
- rescue GitCommandError
138
- raise MissingGitRevisionError.new(@revision, URICredentialsFilter.credential_filtered_uri(uri))
142
+ rescue GitCommandError => e
143
+ raise MissingGitRevisionError.new(e.command, path, @revision, URICredentialsFilter.credential_filtered_uri(uri))
139
144
  end
140
145
 
141
146
  if submodules
@@ -148,13 +153,15 @@ module Bundler
148
153
 
149
154
  private
150
155
 
151
- # TODO: Do not rely on /dev/null.
152
- # Given that open3 is not cross platform until Ruby 1.9.3,
153
- # the best solution is to pipe to /dev/null if it exists.
154
- # If it doesn't, everything will work fine, but the user
155
- # will get the $stderr messages as well.
156
156
  def git_null(command)
157
- git("#{command} 2>#{Bundler::NULL}", false)
157
+ command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri)
158
+ raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
159
+
160
+ out, status = SharedHelpers.with_clean_git_env do
161
+ capture_and_ignore_stderr("git #{command}")
162
+ end
163
+
164
+ [URICredentialsFilter.credential_filtered_string(out, uri), status]
158
165
  end
159
166
 
160
167
  def git_retry(command)
@@ -167,12 +174,12 @@ module Bundler
167
174
  command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri)
168
175
  raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
169
176
 
170
- out = SharedHelpers.with_clean_git_env do
171
- capture_and_filter_stderr(uri) { `git #{command}` }
177
+ out, status = SharedHelpers.with_clean_git_env do
178
+ capture_and_filter_stderr(uri, "git #{command}")
172
179
  end
173
180
 
174
181
  stdout_with_no_credentials = URICredentialsFilter.credential_filtered_string(out, uri)
175
- raise GitCommandError.new(command_with_no_credentials, path, error_msg) if check_errors && !$?.success?
182
+ raise GitCommandError.new(command_with_no_credentials, path, error_msg) if check_errors && !status.success?
176
183
  stdout_with_no_credentials
177
184
  end
178
185
 
@@ -235,26 +242,15 @@ module Bundler
235
242
  raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application"
236
243
  end
237
244
 
238
- # TODO: Replace this with Open3 when upgrading to bundler 2
239
- # Similar to #git_null, as Open3 is not cross-platform,
240
- # a temporary way is to use Tempfile to capture the stderr.
241
- # When replacing this using Open3, make sure git_null is
242
- # also replaced by Open3, so stdout and stderr all got handled properly.
243
- def capture_and_filter_stderr(uri)
244
- return_value, captured_err = ""
245
- backup_stderr = STDERR.dup
246
- begin
247
- Tempfile.open("captured_stderr") do |f|
248
- STDERR.reopen(f)
249
- return_value = yield
250
- f.rewind
251
- captured_err = f.read
252
- end
253
- ensure
254
- STDERR.reopen backup_stderr
255
- end
256
- $stderr.puts URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty?
257
- return_value
245
+ def capture_and_filter_stderr(uri, cmd)
246
+ return_value, captured_err, status = Open3.capture3(cmd)
247
+ Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty?
248
+ [return_value, status]
249
+ end
250
+
251
+ def capture_and_ignore_stderr(cmd)
252
+ return_value, _, status = Open3.capture3(cmd)
253
+ [return_value, status]
258
254
  end
259
255
  end
260
256
  end
@@ -5,23 +5,27 @@ module Bundler
5
5
  class Metadata < Source
6
6
  def specs
7
7
  @specs ||= Index.build do |idx|
8
- idx << Gem::Specification.new("ruby\0", RubyVersion.system.to_gem_version_with_patchlevel)
9
- idx << Gem::Specification.new("rubygems\0", Gem::VERSION)
8
+ idx << Gem::Specification.new("Ruby\0", RubyVersion.system.to_gem_version_with_patchlevel)
9
+ idx << Gem::Specification.new("RubyGems\0", Gem::VERSION) do |s|
10
+ s.required_rubygems_version = Gem::Requirement.default
11
+ end
10
12
 
11
13
  idx << Gem::Specification.new do |s|
12
14
  s.name = "bundler"
13
15
  s.version = VERSION
16
+ s.license = "MIT"
14
17
  s.platform = Gem::Platform::RUBY
15
18
  s.source = self
16
19
  s.authors = ["bundler team"]
17
20
  s.bindir = "exe"
21
+ s.homepage = "https://bundler.io"
22
+ s.summary = "The best way to manage your application's dependencies"
18
23
  s.executables = %w[bundle]
19
24
  # can't point to the actual gemspec or else the require paths will be wrong
20
25
  s.loaded_from = File.expand_path("..", __FILE__)
21
26
  end
22
- if loaded_spec = Bundler.rubygems.loaded_specs("bundler")
23
- idx << loaded_spec # this has to come after the fake gemspec, to override it
24
- elsif local_spec = Bundler.rubygems.find_name("bundler").find {|s| s.version.to_s == VERSION }
27
+
28
+ if local_spec = Bundler.rubygems.find_name("bundler").find {|s| s.version.to_s == VERSION }
25
29
  idx << local_spec
26
30
  end
27
31
 
@@ -3,7 +3,7 @@
3
3
  module Bundler
4
4
  class Source
5
5
  class Path < Source
6
- autoload :Installer, "bundler/source/path/installer"
6
+ autoload :Installer, File.expand_path("path/installer", __dir__)
7
7
 
8
8
  attr_reader :path, :options, :root_path, :original_path
9
9
  attr_writer :name
@@ -20,11 +20,16 @@ module Bundler
20
20
  @allow_cached = false
21
21
  @allow_remote = false
22
22
 
23
- @root_path = options["root_path"] || Bundler.root
23
+ @root_path = options["root_path"] || root
24
24
 
25
25
  if options["path"]
26
26
  @path = Pathname.new(options["path"])
27
- @path = expand(@path) unless @path.relative?
27
+ expanded_path = expand(@path)
28
+ @path = if @path.relative?
29
+ expanded_path.relative_path_from(root_path.expand_path)
30
+ else
31
+ expanded_path
32
+ end
28
33
  end
29
34
 
30
35
  @name = options["name"]
@@ -136,7 +141,7 @@ module Bundler
136
141
 
137
142
  def lockfile_path
138
143
  return relative_path(original_path) if original_path.absolute?
139
- expand(original_path).relative_path_from(Bundler.root)
144
+ expand(original_path).relative_path_from(root)
140
145
  end
141
146
 
142
147
  def app_cache_path(custom_path = nil)
@@ -191,10 +196,10 @@ module Bundler
191
196
  else
192
197
  message = String.new("The path `#{expanded_path}` ")
193
198
  message << if File.exist?(expanded_path)
194
- "is not a directory."
195
- else
196
- "does not exist."
197
- end
199
+ "is not a directory."
200
+ else
201
+ "does not exist."
202
+ end
198
203
  raise PathError, message
199
204
  end
200
205
 
@@ -6,7 +6,7 @@ require "rubygems/user_interaction"
6
6
  module Bundler
7
7
  class Source
8
8
  class Rubygems < Source
9
- autoload :Remote, "bundler/source/rubygems/remote"
9
+ autoload :Remote, File.expand_path("rubygems/remote", __dir__)
10
10
 
11
11
  # Use the API when installing less than X gems
12
12
  API_REQUEST_LIMIT = 500
@@ -51,7 +51,7 @@ module Bundler
51
51
  end
52
52
 
53
53
  def can_lock?(spec)
54
- return super if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
54
+ return super if Bundler.feature_flag.disable_multisource?
55
55
  spec.source.is_a?(Rubygems)
56
56
  end
57
57
 
@@ -106,7 +106,7 @@ module Bundler
106
106
  end
107
107
  end
108
108
 
109
- if installed?(spec) && !force
109
+ if (installed?(spec) || Plugin.installed?(spec.name)) && !force
110
110
  print_using_message "Using #{version_message(spec)}"
111
111
  return nil # no post-install message
112
112
  end
@@ -120,8 +120,14 @@ module Bundler
120
120
  uris.uniq!
121
121
  Installer.ambiguous_gems << [spec.name, *uris] if uris.length > 1
122
122
 
123
- s = Bundler.rubygems.spec_from_gem(fetch_gem(spec), Bundler.settings["trust-policy"])
124
- spec.__swap__(s)
123
+ path = fetch_gem(spec)
124
+ begin
125
+ s = Bundler.rubygems.spec_from_gem(path, Bundler.settings["trust-policy"])
126
+ spec.__swap__(s)
127
+ rescue StandardError
128
+ Bundler.rm_rf(path)
129
+ raise
130
+ end
125
131
  end
126
132
 
127
133
  unless Bundler.settings[:no_install]
@@ -25,8 +25,7 @@ module Bundler
25
25
 
26
26
  cache_uri = original_uri || uri
27
27
 
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
28
+ host = cache_uri.to_s.start_with?("file://") ? nil : cache_uri.host
30
29
 
31
30
  uri_parts = [host, cache_uri.user, cache_uri.port, cache_uri.path]
32
31
  uri_digest = SharedHelpers.digest(:MD5).hexdigest(uri_parts.compact.join("."))
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "set"
4
+
3
5
  module Bundler
4
6
  class SourceList
5
7
  attr_reader :path_sources,
@@ -41,17 +43,14 @@ module Bundler
41
43
  end
42
44
 
43
45
  def global_rubygems_source=(uri)
44
- if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
46
+ if Bundler.feature_flag.disable_multisource?
45
47
  @global_rubygems_source ||= rubygems_aggregate_class.new("remotes" => uri)
46
48
  end
47
49
  add_rubygems_remote(uri)
48
50
  end
49
51
 
50
52
  def add_rubygems_remote(uri)
51
- if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
52
- return if Bundler.feature_flag.disable_multisource?
53
- raise InvalidOption, "`lockfile_uses_separate_rubygems_sources` cannot be set without `disable_multisource` being set"
54
- end
53
+ return if Bundler.feature_flag.disable_multisource?
55
54
  @rubygems_aggregate.add_remote(uri)
56
55
  @rubygems_aggregate
57
56
  end
@@ -77,12 +76,10 @@ module Bundler
77
76
  end
78
77
 
79
78
  def lock_sources
80
- if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
81
- [[default_source], @rubygems_sources, git_sources, path_sources, plugin_sources].map do |sources|
82
- sources.sort_by(&:to_s)
83
- end.flatten(1)
79
+ lock_sources = (path_sources + git_sources + plugin_sources).sort_by(&:to_s)
80
+ if Bundler.feature_flag.disable_multisource?
81
+ lock_sources + rubygems_sources.sort_by(&:to_s)
84
82
  else
85
- lock_sources = (path_sources + git_sources + plugin_sources).sort_by(&:to_s)
86
83
  lock_sources << combine_rubygems_sources
87
84
  end
88
85
  end
@@ -97,7 +94,7 @@ module Bundler
97
94
  end
98
95
  end
99
96
 
100
- replacement_rubygems = !Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? &&
97
+ replacement_rubygems = !Bundler.feature_flag.disable_multisource? &&
101
98
  replacement_sources.detect {|s| s.is_a?(Source::Rubygems) }
102
99
  @rubygems_aggregate = replacement_rubygems if replacement_rubygems
103
100
 
@@ -150,7 +147,7 @@ module Bundler
150
147
  if source.uri =~ /^git\:/
151
148
  Bundler.ui.warn "The git source `#{source.uri}` uses the `git` protocol, " \
152
149
  "which transmits data without encryption. Disable this warning with " \
153
- "`bundle config git.allow_insecure true`, or switch to the `https` " \
150
+ "`bundle config set git.allow_insecure true`, or switch to the `https` " \
154
151
  "protocol to keep your data secure."
155
152
  end
156
153
  end