bundler 2.1.4 → 2.2.6

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 (210) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1624 -1426
  3. data/README.md +6 -8
  4. data/bundler.gemspec +4 -4
  5. data/exe/bundle +3 -0
  6. data/lib/bundler.rb +32 -8
  7. data/lib/bundler/build_metadata.rb +3 -11
  8. data/lib/bundler/cli.rb +55 -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 +86 -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 +3 -1
  30. data/lib/bundler/compact_index_client.rb +1 -1
  31. data/lib/bundler/compact_index_client/cache.rb +6 -14
  32. data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  33. data/lib/bundler/compact_index_client/updater.rb +5 -13
  34. data/lib/bundler/definition.rb +66 -82
  35. data/lib/bundler/dep_proxy.rb +16 -9
  36. data/lib/bundler/dependency.rb +3 -10
  37. data/lib/bundler/dsl.rb +5 -9
  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 -3
  43. data/lib/bundler/fetcher.rb +4 -3
  44. data/lib/bundler/fetcher/base.rb +1 -1
  45. data/lib/bundler/fetcher/compact_index.rb +1 -1
  46. data/lib/bundler/fetcher/downloader.rb +1 -1
  47. data/lib/bundler/fetcher/index.rb +3 -4
  48. data/lib/bundler/friendly_errors.rb +22 -13
  49. data/lib/bundler/gem_helper.rb +32 -17
  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 +6 -2
  54. data/lib/bundler/injector.rb +22 -4
  55. data/lib/bundler/inline.rb +1 -1
  56. data/lib/bundler/installer.rb +35 -32
  57. data/lib/bundler/installer/gem_installer.rb +3 -3
  58. data/lib/bundler/installer/parallel_installer.rb +10 -10
  59. data/lib/bundler/installer/standalone.rb +2 -2
  60. data/lib/bundler/lazy_specification.rb +35 -11
  61. data/lib/bundler/lockfile_generator.rb +1 -1
  62. data/lib/bundler/lockfile_parser.rb +1 -1
  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 +16 -25
  75. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +19 -30
  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.rb +30 -5
  117. data/lib/bundler/plugin/api/source.rb +1 -1
  118. data/lib/bundler/plugin/dsl.rb +1 -1
  119. data/lib/bundler/plugin/index.rb +10 -1
  120. data/lib/bundler/plugin/installer.rb +1 -1
  121. data/lib/bundler/plugin/installer/rubygems.rb +1 -1
  122. data/lib/bundler/plugin/source_list.rb +1 -1
  123. data/lib/bundler/psyched_yaml.rb +0 -15
  124. data/lib/bundler/remote_specification.rb +5 -2
  125. data/lib/bundler/resolver.rb +43 -19
  126. data/lib/bundler/resolver/spec_group.rb +39 -24
  127. data/lib/bundler/retry.rb +1 -1
  128. data/lib/bundler/ruby_version.rb +1 -1
  129. data/lib/bundler/rubygems_ext.rb +69 -9
  130. data/lib/bundler/rubygems_gem_installer.rb +3 -9
  131. data/lib/bundler/rubygems_integration.rb +25 -60
  132. data/lib/bundler/runtime.rb +4 -14
  133. data/lib/bundler/settings.rb +49 -46
  134. data/lib/bundler/shared_helpers.rb +2 -2
  135. data/lib/bundler/similarity_detector.rb +1 -1
  136. data/lib/bundler/source.rb +1 -1
  137. data/lib/bundler/source/git.rb +23 -21
  138. data/lib/bundler/source/git/git_proxy.rb +82 -80
  139. data/lib/bundler/source/path.rb +7 -3
  140. data/lib/bundler/source/path/installer.rb +10 -10
  141. data/lib/bundler/source/rubygems.rb +23 -17
  142. data/lib/bundler/source/rubygems/remote.rb +1 -1
  143. data/lib/bundler/source_list.rb +2 -2
  144. data/lib/bundler/spec_set.rb +8 -10
  145. data/lib/bundler/stub_specification.rb +17 -7
  146. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  147. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  148. data/lib/bundler/templates/newgem/README.md.tt +1 -2
  149. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  150. data/lib/bundler/templates/newgem/bin/console.tt +1 -0
  151. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  152. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  153. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  154. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  155. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  156. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  157. data/lib/bundler/templates/newgem/newgem.gemspec.tt +15 -7
  158. data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  159. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  160. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  161. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  162. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  163. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  164. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  165. data/lib/bundler/ui/shell.rb +5 -5
  166. data/lib/bundler/uri_credentials_filter.rb +3 -1
  167. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +48 -46
  173. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
  174. data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  175. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  176. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  177. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  178. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  179. data/lib/bundler/vendored_persistent.rb +0 -7
  180. data/lib/bundler/vendored_tmpdir.rb +4 -0
  181. data/lib/bundler/version.rb +1 -1
  182. data/lib/bundler/worker.rb +1 -1
  183. data/lib/bundler/yaml_serializer.rb +1 -1
  184. metadata +70 -85
  185. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  186. data/man/bundle-add.1.txt +0 -58
  187. data/man/bundle-binstubs.1.txt +0 -48
  188. data/man/bundle-cache.1.txt +0 -78
  189. data/man/bundle-check.1.txt +0 -33
  190. data/man/bundle-clean.1.txt +0 -26
  191. data/man/bundle-config.1.txt +0 -528
  192. data/man/bundle-doctor.1.txt +0 -44
  193. data/man/bundle-exec.1.txt +0 -178
  194. data/man/bundle-gem.1.txt +0 -91
  195. data/man/bundle-info.1.txt +0 -21
  196. data/man/bundle-init.1.txt +0 -34
  197. data/man/bundle-inject.1.txt +0 -32
  198. data/man/bundle-install.1.txt +0 -401
  199. data/man/bundle-list.1.txt +0 -43
  200. data/man/bundle-lock.1.txt +0 -93
  201. data/man/bundle-open.1.txt +0 -29
  202. data/man/bundle-outdated.1.txt +0 -131
  203. data/man/bundle-platform.1.txt +0 -57
  204. data/man/bundle-pristine.1.txt +0 -44
  205. data/man/bundle-remove.1.txt +0 -34
  206. data/man/bundle-show.1.txt +0 -27
  207. data/man/bundle-update.1.txt +0 -390
  208. data/man/bundle-viz.1.txt +0 -39
  209. data/man/bundle.1.txt +0 -116
  210. data/man/gemfile.5.txt +0 -649
@@ -23,6 +23,16 @@ module Bundler
23
23
  Bundler::Plugin.install(plugins, options)
24
24
  end
25
25
 
26
+ desc "uninstall PLUGINS", "Uninstall the plugins"
27
+ long_desc <<-D
28
+ Uninstall given list of plugins. To uninstall all the plugins, use -all option.
29
+ D
30
+ method_option "all", :type => :boolean, :default => nil, :banner =>
31
+ "Uninstall all the installed plugins. If no plugin is installed, then it does nothing."
32
+ def uninstall(*plugins)
33
+ Bundler::Plugin.uninstall(plugins, options)
34
+ end
35
+
26
36
  desc "list", "List the installed plugins and available commands"
27
37
  def list
28
38
  Bundler::Plugin.list
@@ -29,6 +29,11 @@ module Bundler
29
29
 
30
30
  FileUtils.rm_rf spec.full_gem_path
31
31
  when Source::Git
32
+ if source.local?
33
+ Bundler.ui.warn("Cannot pristine #{gem_name}. Gem is locally overridden.")
34
+ next
35
+ end
36
+
32
37
  source.remote!
33
38
  if extension_cache_path = source.extension_cache_path(spec)
34
39
  FileUtils.rm_rf extension_cache_path
@@ -53,7 +53,7 @@ module Bundler
53
53
  end
54
54
  end
55
55
 
56
- private
56
+ private
57
57
 
58
58
  def fetch_latest_specs
59
59
  definition = Bundler.definition(true)
@@ -82,7 +82,7 @@ module Bundler
82
82
  locked_spec = locked_info[:spec]
83
83
  new_spec = Bundler.definition.specs[name].first
84
84
  unless new_spec
85
- if Bundler.rubygems.platforms.none? {|p| locked_spec.match_platform(p) }
85
+ unless locked_spec.match_platform(Bundler.local_platform)
86
86
  Bundler.ui.warn "Bundler attempted to update #{name} but it was not considered because it is for a different platform from the current one"
87
87
  end
88
88
 
@@ -106,6 +106,8 @@ module Bundler
106
106
  Bundler.ui.confirm "Bundle updated!"
107
107
  Bundler::CLI::Common.output_without_groups_message(:update)
108
108
  Bundler::CLI::Common.output_post_install_messages installer.post_install_messages
109
+
110
+ Bundler::CLI::Common.output_fund_metadata_summary
109
111
  end
110
112
  end
111
113
  end
@@ -87,7 +87,7 @@ module Bundler
87
87
  @parsed_checksums = true
88
88
  end
89
89
 
90
- private
90
+ private
91
91
 
92
92
  def update(local_path, remote_path)
93
93
  Bundler::CompactIndexClient.debug { "update(#{local_path}, #{remote_path})" }
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "gem_parser"
4
+
3
5
  module Bundler
4
6
  class CompactIndexClient
5
7
  class Cache
@@ -83,7 +85,7 @@ module Bundler
83
85
  gem_line ? parse_gem(gem_line) : nil
84
86
  end
85
87
 
86
- private
88
+ private
87
89
 
88
90
  def lines(path)
89
91
  return [] unless path.file?
@@ -92,19 +94,9 @@ module Bundler
92
94
  header ? lines[header + 1..-1] : lines
93
95
  end
94
96
 
95
- def parse_gem(string)
96
- version_and_platform, rest = string.split(" ", 2)
97
- version, platform = version_and_platform.split("-", 2)
98
- dependencies, requirements = rest.split("|", 2).map {|s| s.split(",") } if rest
99
- dependencies = dependencies ? dependencies.map {|d| parse_dependency(d) } : []
100
- requirements = requirements ? requirements.map {|r| parse_dependency(r) } : []
101
- [version, platform, dependencies, requirements]
102
- end
103
-
104
- def parse_dependency(string)
105
- dependency = string.split(":")
106
- dependency[-1] = dependency[-1].split("&") if dependency.size > 1
107
- dependency
97
+ def parse_gem(line)
98
+ @dependency_parser ||= GemParser.new
99
+ @dependency_parser.parse(line)
108
100
  end
109
101
 
110
102
  def info_roots
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CompactIndexClient
5
+ if defined?(Gem::Resolver::APISet::GemParser)
6
+ GemParser = Gem::Resolver::APISet::GemParser
7
+ else
8
+ class GemParser
9
+ def parse(line)
10
+ version_and_platform, rest = line.split(" ", 2)
11
+ version, platform = version_and_platform.split("-", 2)
12
+ dependencies, requirements = rest.split("|", 2).map {|s| s.split(",") } if rest
13
+ dependencies = dependencies ? dependencies.map {|d| parse_dependency(d) } : []
14
+ requirements = requirements ? requirements.map {|d| parse_dependency(d) } : []
15
+ [version, platform, dependencies, requirements]
16
+ end
17
+
18
+ private
19
+
20
+ def parse_dependency(string)
21
+ dependency = string.split(":")
22
+ dependency[-1] = dependency[-1].split("&") if dependency.size > 1
23
+ dependency
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "../vendored_fileutils"
4
- require "stringio"
5
- require "zlib"
6
4
 
7
5
  module Bundler
8
6
  class CompactIndexClient
@@ -22,13 +20,13 @@ module Bundler
22
20
 
23
21
  def initialize(fetcher)
24
22
  @fetcher = fetcher
25
- require "tmpdir"
23
+ require_relative "../vendored_tmpdir"
26
24
  end
27
25
 
28
26
  def update(local_path, remote_path, retrying = nil)
29
27
  headers = {}
30
28
 
31
- Dir.mktmpdir("bundler-compact-index-") do |local_temp_dir|
29
+ Bundler::Dir.mktmpdir("bundler-compact-index-") do |local_temp_dir|
32
30
  local_temp_path = Pathname.new(local_temp_dir).join(local_path.basename)
33
31
 
34
32
  # first try to fetch any new bytes on the existing file
@@ -45,18 +43,12 @@ module Bundler
45
43
  else
46
44
  "bytes=#{local_temp_path.size}-"
47
45
  end
48
- else
49
- # Fastly ignores Range when Accept-Encoding: gzip is set
50
- headers["Accept-Encoding"] = "gzip"
51
46
  end
52
47
 
53
48
  response = @fetcher.call(remote_path, headers)
54
49
  return nil if response.is_a?(Net::HTTPNotModified)
55
50
 
56
51
  content = response.body
57
- if response["Content-Encoding"] == "gzip"
58
- content = Zlib::GzipReader.new(StringIO.new(content)).read
59
- end
60
52
 
61
53
  SharedHelpers.filesystem_access(local_temp_path) do
62
54
  if response.is_a?(Net::HTTPPartialContent) && local_temp_path.size.nonzero?
@@ -66,8 +58,8 @@ module Bundler
66
58
  end
67
59
  end
68
60
 
69
- response_etag = (response["ETag"] || "").gsub(%r{\AW/}, "")
70
- if etag_for(local_temp_path) == response_etag
61
+ etag = (response["ETag"] || "").gsub(%r{\AW/}, "")
62
+ if etag.length.zero? || etag_for(local_temp_path) == etag
71
63
  SharedHelpers.filesystem_access(local_path) do
72
64
  FileUtils.mv(local_temp_path, local_path)
73
65
  end
@@ -75,7 +67,7 @@ module Bundler
75
67
  end
76
68
 
77
69
  if retrying
78
- raise MisMatchedChecksumError.new(remote_path, response_etag, etag_for(local_temp_path))
70
+ raise MisMatchedChecksumError.new(remote_path, etag, etag_for(local_temp_path))
79
71
  end
80
72
 
81
73
  update(local_path, remote_path, :retrying)
@@ -77,12 +77,17 @@ module Bundler
77
77
  @locked_bundler_version = nil
78
78
  @locked_ruby_version = nil
79
79
  @locked_specs_incomplete_for_platform = false
80
+ @new_platform = nil
80
81
 
81
82
  if lockfile && File.exist?(lockfile)
82
83
  @lockfile_contents = Bundler.read_file(lockfile)
83
84
  @locked_gems = LockfileParser.new(@lockfile_contents)
84
85
  @locked_platforms = @locked_gems.platforms
85
- @platforms = @locked_platforms.dup
86
+ if Bundler.settings[:force_ruby_platform]
87
+ @platforms = [Gem::Platform::RUBY]
88
+ else
89
+ @platforms = @locked_platforms.dup
90
+ end
86
91
  @locked_bundler_version = @locked_gems.bundler_version
87
92
  @locked_ruby_version = @locked_gems.ruby_version
88
93
 
@@ -113,7 +118,7 @@ module Bundler
113
118
  end
114
119
  @unlocking ||= @unlock[:ruby] ||= (!@locked_ruby_version ^ !@ruby_version)
115
120
 
116
- add_current_platform unless Bundler.frozen_bundle?
121
+ add_current_platform unless current_ruby_platform_locked? || Bundler.frozen_bundle?
117
122
 
118
123
  converge_path_sources_to_gemspec_sources
119
124
  @path_changes = converge_paths
@@ -152,7 +157,7 @@ module Bundler
152
157
  end
153
158
 
154
159
  def resolve_remotely!
155
- raise "Specs already loaded" if @specs
160
+ return if @specs
156
161
  @remote = true
157
162
  sources.remote!
158
163
  specs
@@ -194,10 +199,6 @@ module Bundler
194
199
  @locked_specs - specs
195
200
  end
196
201
 
197
- def new_platform?
198
- @new_platform
199
- end
200
-
201
202
  def missing_specs
202
203
  missing = []
203
204
  resolve.materialize(requested_dependencies, missing)
@@ -227,16 +228,29 @@ module Bundler
227
228
  end
228
229
  end
229
230
 
231
+ def requested_dependencies
232
+ groups = requested_groups
233
+ groups.map!(&:to_sym)
234
+ dependencies_for(groups)
235
+ end
236
+
230
237
  def current_dependencies
231
- dependencies.select(&:should_include?)
238
+ dependencies.select do |d|
239
+ d.should_include? && !d.gem_platforms(@platforms).empty?
240
+ end
232
241
  end
233
242
 
234
243
  def specs_for(groups)
235
- deps = dependencies.select {|d| (d.groups & groups).any? }
236
- deps.delete_if {|d| !d.should_include? }
244
+ deps = dependencies_for(groups)
237
245
  specs.for(expand_dependencies(deps))
238
246
  end
239
247
 
248
+ def dependencies_for(groups)
249
+ current_dependencies.reject do |d|
250
+ (d.groups & groups).empty?
251
+ end
252
+ end
253
+
240
254
  # Resolve all the dependencies specified in Gemfile. It ensures that
241
255
  # dependencies that have been already resolved via locked file and are fresh
242
256
  # are reused when resolving dependencies
@@ -255,6 +269,7 @@ module Bundler
255
269
  else
256
270
  # Run a resolve against the locally available gems
257
271
  Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
272
+ expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, @remote)
258
273
  last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
259
274
  end
260
275
 
@@ -312,10 +327,6 @@ module Bundler
312
327
  sources.rubygems_sources.any? {|s| s.remotes.any? }
313
328
  end
314
329
 
315
- def has_local_dependencies?
316
- !sources.path_sources.empty? || !sources.git_sources.empty?
317
- end
318
-
319
330
  def spec_git_paths
320
331
  sources.git_sources.map {|s| File.realpath(s.path) if File.exist?(s.path) }.compact
321
332
  end
@@ -396,12 +407,10 @@ module Bundler
396
407
  "updated #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} to version control."
397
408
 
398
409
  unless explicit_flag
399
- suggested_command = if Bundler.settings.locations("frozen")[:global]
410
+ suggested_command = if Bundler.settings.locations("frozen").keys.&([:global, :local]).any?
400
411
  "bundle config unset frozen"
401
412
  elsif Bundler.settings.locations("deployment").keys.&([:global, :local]).any?
402
413
  "bundle config unset deployment"
403
- else
404
- "bundle install --no-deployment"
405
414
  end
406
415
  msg << "\n\nIf this is a development machine, remove the #{Bundler.default_gemfile} " \
407
416
  "freeze \nby running `#{suggested_command}`."
@@ -450,9 +459,9 @@ module Bundler
450
459
  @locked_deps.each {|name, d| both_sources[name][1] = d.source }
451
460
 
452
461
  both_sources.each do |name, (dep, lock_source)|
453
- next unless (dep.nil? && !lock_source.nil?) || (!dep.nil? && !lock_source.nil? && !lock_source.can_lock?(dep))
462
+ next if lock_source.nil? || (dep && lock_source.can_lock?(dep))
454
463
  gemfile_source_name = (dep && dep.source) || "no specified source"
455
- lockfile_source_name = lock_source || "no specified source"
464
+ lockfile_source_name = lock_source
456
465
  changed << "* #{name} from `#{gemfile_source_name}` to `#{lockfile_source_name}`"
457
466
  end
458
467
 
@@ -497,15 +506,11 @@ module Bundler
497
506
  end
498
507
 
499
508
  def validate_platforms!
500
- return if @platforms.any? do |bundle_platform|
501
- Bundler.rubygems.platforms.any? do |local_platform|
502
- MatchPlatform.platforms_match?(bundle_platform, local_platform)
503
- end
504
- end
509
+ return if current_platform_locked?
505
510
 
506
511
  raise ProductionError, "Your bundle only supports platforms #{@platforms.map(&:to_s)} " \
507
- "but your local platforms are #{Bundler.rubygems.platforms.map(&:to_s)}, and " \
508
- "there's no compatible match between those two lists."
512
+ "but your local platform is #{Bundler.local_platform}. " \
513
+ "Add the current platform to the lockfile with `bundle lock --add-platform #{Bundler.local_platform}` and try again."
509
514
  end
510
515
 
511
516
  def add_platform(platform)
@@ -518,8 +523,10 @@ module Bundler
518
523
  raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}"
519
524
  end
520
525
 
521
- def add_current_platform
522
- current_platforms.each {|platform| add_platform(platform) }
526
+ def most_specific_locked_platform
527
+ @platforms.min_by do |bundle_platform|
528
+ platform_specificity_match(bundle_platform, local_platform)
529
+ end
523
530
  end
524
531
 
525
532
  def find_resolved_spec(current_spec)
@@ -541,16 +548,24 @@ module Bundler
541
548
  @unlocking
542
549
  end
543
550
 
544
- private
551
+ private
552
+
553
+ def current_ruby_platform_locked?
554
+ return false unless generic_local_platform == Gem::Platform::RUBY
545
555
 
546
- def current_platforms
547
- current_platform = Bundler.local_platform
548
- [].tap do |platforms|
549
- platforms << current_platform if Bundler.feature_flag.specific_platform?
550
- platforms << generic(current_platform)
556
+ current_platform_locked?
557
+ end
558
+
559
+ def current_platform_locked?
560
+ @platforms.any? do |bundle_platform|
561
+ MatchPlatform.platforms_match?(bundle_platform, Bundler.local_platform)
551
562
  end
552
563
  end
553
564
 
565
+ def add_current_platform
566
+ add_platform(local_platform)
567
+ end
568
+
554
569
  def change_reason
555
570
  if unlocking?
556
571
  unlock_reason = @unlock.reject {|_k, v| Array(v).empty? }.map do |k, v|
@@ -706,9 +721,6 @@ module Bundler
706
721
  elsif dep.source
707
722
  dep.source = sources.get(dep.source)
708
723
  end
709
- if dep.source.is_a?(Source::Gemspec)
710
- dep.platforms.concat(@platforms.map {|p| Dependency::REVERSE_PLATFORM_MAP[p] }.flatten(1)).uniq!
711
- end
712
724
  end
713
725
 
714
726
  changes = false
@@ -806,11 +818,6 @@ module Bundler
806
818
  # commonly happens if the version changed in the gemspec
807
819
  next unless new_spec
808
820
 
809
- new_runtime_deps = new_spec.dependencies.select {|d| d.type != :development }
810
- old_runtime_deps = s.dependencies.select {|d| d.type != :development }
811
- # If the dependencies of the path source have changed and locked spec can't satisfy new dependencies, unlock it
812
- next unless new_runtime_deps.sort == old_runtime_deps.sort || new_runtime_deps.all? {|d| satisfies_locked_spec?(d) }
813
-
814
821
  s.dependencies.replace(new_spec.dependencies)
815
822
  end
816
823
 
@@ -818,7 +825,7 @@ module Bundler
818
825
  end
819
826
 
820
827
  resolve = SpecSet.new(converged)
821
- @locked_specs_incomplete_for_platform = !resolve.for(expand_dependencies(deps), @unlock[:gems], true, true)
828
+ @locked_specs_incomplete_for_platform = !resolve.for(expand_dependencies(requested_dependencies & deps), @unlock[:gems], true, true)
822
829
  resolve = resolve.for(expand_dependencies(deps, true), @unlock[:gems], false, false, false)
823
830
  diff = nil
824
831
 
@@ -846,21 +853,9 @@ module Bundler
846
853
  @locked_specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) }
847
854
  end
848
855
 
849
- # This list of dependencies is only used in #resolve, so it's OK to add
850
- # the metadata dependencies here
851
- def expanded_dependencies
852
- @expanded_dependencies ||= begin
853
- expand_dependencies(dependencies + metadata_dependencies, @remote)
854
- end
855
- end
856
-
857
856
  def metadata_dependencies
858
857
  @metadata_dependencies ||= begin
859
- ruby_versions = concat_ruby_version_requirements(@ruby_version)
860
- if ruby_versions.empty? || !@ruby_version.exact?
861
- concat_ruby_version_requirements(RubyVersion.system)
862
- concat_ruby_version_requirements(locked_ruby_version_object) unless @unlock[:ruby]
863
- end
858
+ ruby_versions = ruby_version_requirements(@ruby_version)
864
859
  [
865
860
  Dependency.new("Ruby\0", ruby_versions),
866
861
  Dependency.new("RubyGems\0", Gem::VERSION),
@@ -868,49 +863,37 @@ module Bundler
868
863
  end
869
864
  end
870
865
 
871
- def concat_ruby_version_requirements(ruby_version, ruby_versions = [])
872
- return ruby_versions unless ruby_version
866
+ def ruby_version_requirements(ruby_version)
867
+ return [] unless ruby_version
873
868
  if ruby_version.patchlevel
874
- ruby_versions << ruby_version.to_gem_version_with_patchlevel
869
+ [ruby_version.to_gem_version_with_patchlevel]
875
870
  else
876
- ruby_versions.concat(ruby_version.versions.map do |version|
871
+ ruby_version.versions.map do |version|
877
872
  requirement = Gem::Requirement.new(version)
878
873
  if requirement.exact?
879
874
  "~> #{version}.0"
880
875
  else
881
876
  requirement
882
877
  end
883
- end)
878
+ end
884
879
  end
885
880
  end
886
881
 
887
882
  def expand_dependencies(dependencies, remote = false)
888
- sorted_platforms = Resolver.sort_platforms(@platforms)
889
883
  deps = []
890
884
  dependencies.each do |dep|
891
885
  dep = Dependency.new(dep, ">= 0") unless dep.respond_to?(:name)
892
- next if !remote && !dep.current_platform?
893
- platforms = dep.gem_platforms(sorted_platforms)
894
- if platforms.empty? && !Bundler.settings[:disable_platform_warnings]
895
- mapped_platforms = dep.expanded_platforms
896
- Bundler.ui.warn \
897
- "The dependency #{dep} will be unused by any of the platforms Bundler is installing for. " \
898
- "Bundler is installing for #{@platforms.join ", "} but the dependency " \
899
- "is only for #{mapped_platforms.join ", "}. " \
900
- "To add those platforms to the bundle, " \
901
- "run `bundle lock --add-platform #{mapped_platforms.join " "}`."
902
- end
903
- platforms.each do |p|
904
- deps << DepProxy.new(dep, p) if remote || p == generic_local_platform
905
- end
886
+ next unless remote || dep.current_platform?
887
+ target_platforms = dep.gem_platforms(remote ? Resolver.sort_platforms(@platforms) : [generic_local_platform])
888
+ deps += expand_dependency_with_platforms(dep, target_platforms)
906
889
  end
907
890
  deps
908
891
  end
909
892
 
910
- def requested_dependencies
911
- groups = requested_groups
912
- groups.map!(&:to_sym)
913
- dependencies.reject {|d| !d.should_include? || (d.groups & groups).empty? }
893
+ def expand_dependency_with_platforms(dep, platforms)
894
+ platforms.map do |p|
895
+ DepProxy.get_proxy(dep, p)
896
+ end
914
897
  end
915
898
 
916
899
  def source_requirements
@@ -985,10 +968,11 @@ module Bundler
985
968
  @locked_gems.specs.reduce({}) do |requirements, locked_spec|
986
969
  name = locked_spec.name
987
970
  dependency = dependencies_by_name[name]
971
+ next requirements unless dependency
988
972
  next requirements if @locked_gems.dependencies[name] != dependency
989
- next requirements if dependency && dependency.source.is_a?(Source::Path)
973
+ next requirements if dependency.source.is_a?(Source::Path)
990
974
  dep = Gem::Dependency.new(name, ">= #{locked_spec.version}")
991
- requirements[name] = DepProxy.new(dep, locked_spec.platform)
975
+ requirements[name] = DepProxy.get_proxy(dep, locked_spec.platform)
992
976
  requirements
993
977
  end.values
994
978
  end