bundler 2.1.4 → 2.2.17

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 (225) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1774 -1430
  3. data/README.md +6 -8
  4. data/bundler.gemspec +4 -4
  5. data/exe/bundle +3 -0
  6. data/lib/bundler.rb +33 -9
  7. data/lib/bundler/build_metadata.rb +3 -11
  8. data/lib/bundler/cli.rb +59 -23
  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 +2 -7
  12. data/lib/bundler/cli/clean.rb +1 -1
  13. data/lib/bundler/cli/common.rb +29 -2
  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 +129 -28
  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 +88 -67
  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 +13 -17
  34. data/lib/bundler/current_ruby.rb +1 -0
  35. data/lib/bundler/definition.rb +121 -131
  36. data/lib/bundler/dep_proxy.rb +16 -9
  37. data/lib/bundler/dependency.rb +3 -10
  38. data/lib/bundler/dsl.rb +40 -33
  39. data/lib/bundler/endpoint_specification.rb +1 -1
  40. data/lib/bundler/env.rb +1 -1
  41. data/lib/bundler/environment_preserver.rb +26 -2
  42. data/lib/bundler/errors.rb +1 -0
  43. data/lib/bundler/feature_flag.rb +0 -5
  44. data/lib/bundler/fetcher.rb +5 -4
  45. data/lib/bundler/fetcher/base.rb +1 -1
  46. data/lib/bundler/fetcher/compact_index.rb +1 -1
  47. data/lib/bundler/fetcher/downloader.rb +9 -5
  48. data/lib/bundler/fetcher/index.rb +3 -4
  49. data/lib/bundler/friendly_errors.rb +22 -13
  50. data/lib/bundler/gem_helper.rb +51 -18
  51. data/lib/bundler/gem_helpers.rb +36 -25
  52. data/lib/bundler/gem_version_promoter.rb +4 -4
  53. data/lib/bundler/graph.rb +1 -1
  54. data/lib/bundler/index.rb +12 -7
  55. data/lib/bundler/injector.rb +23 -5
  56. data/lib/bundler/inline.rb +3 -2
  57. data/lib/bundler/installer.rb +37 -49
  58. data/lib/bundler/installer/gem_installer.rb +3 -3
  59. data/lib/bundler/installer/parallel_installer.rb +46 -25
  60. data/lib/bundler/installer/standalone.rb +17 -2
  61. data/lib/bundler/lazy_specification.rb +45 -25
  62. data/lib/bundler/lockfile_generator.rb +1 -1
  63. data/lib/bundler/lockfile_parser.rb +4 -14
  64. data/lib/bundler/man/.document +1 -0
  65. data/{man → lib/bundler/man}/bundle-add.1 +1 -1
  66. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
  67. data/{man → lib/bundler/man}/bundle-binstubs.1 +5 -3
  68. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
  69. data/{man → lib/bundler/man}/bundle-cache.1 +1 -1
  70. data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
  71. data/{man → lib/bundler/man}/bundle-check.1 +1 -1
  72. data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  73. data/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  74. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  75. data/{man → lib/bundler/man}/bundle-config.1 +42 -34
  76. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +51 -43
  77. data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  78. data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  79. data/{man → lib/bundler/man}/bundle-exec.1 +1 -1
  80. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
  81. data/{man → lib/bundler/man}/bundle-gem.1 +25 -3
  82. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
  83. data/{man → lib/bundler/man}/bundle-info.1 +1 -1
  84. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  85. data/{man → lib/bundler/man}/bundle-init.1 +1 -1
  86. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
  87. data/{man → lib/bundler/man}/bundle-inject.1 +1 -1
  88. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
  89. data/{man → lib/bundler/man}/bundle-install.1 +30 -3
  90. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
  91. data/{man → lib/bundler/man}/bundle-list.1 +7 -7
  92. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  93. data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  94. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  95. data/{man → lib/bundler/man}/bundle-open.1 +1 -1
  96. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  97. data/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
  98. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
  99. data/{man → lib/bundler/man}/bundle-platform.1 +1 -1
  100. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
  101. data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  102. data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  103. data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  104. data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  105. data/{man → lib/bundler/man}/bundle-show.1 +1 -1
  106. data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
  107. data/{man → lib/bundler/man}/bundle-update.1 +1 -1
  108. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
  109. data/{man → lib/bundler/man}/bundle-viz.1 +1 -1
  110. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
  111. data/{man → lib/bundler/man}/bundle.1 +1 -1
  112. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
  113. data/{man → lib/bundler/man}/gemfile.5 +4 -4
  114. data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
  115. data/{man → lib/bundler/man}/index.txt +0 -0
  116. data/lib/bundler/mirror.rb +2 -2
  117. data/lib/bundler/plugin.rb +33 -7
  118. data/lib/bundler/plugin/api/source.rb +8 -1
  119. data/lib/bundler/plugin/dsl.rb +1 -1
  120. data/lib/bundler/plugin/index.rb +10 -1
  121. data/lib/bundler/plugin/installer.rb +9 -11
  122. data/lib/bundler/plugin/installer/rubygems.rb +1 -1
  123. data/lib/bundler/plugin/source_list.rb +5 -1
  124. data/lib/bundler/psyched_yaml.rb +0 -15
  125. data/lib/bundler/remote_specification.rb +5 -2
  126. data/lib/bundler/resolver.rb +133 -77
  127. data/lib/bundler/resolver/spec_group.rb +75 -48
  128. data/lib/bundler/retry.rb +2 -2
  129. data/lib/bundler/ruby_version.rb +1 -1
  130. data/lib/bundler/rubygems_ext.rb +69 -9
  131. data/lib/bundler/rubygems_gem_installer.rb +50 -9
  132. data/lib/bundler/rubygems_integration.rb +25 -60
  133. data/lib/bundler/runtime.rb +4 -14
  134. data/lib/bundler/settings.rb +107 -54
  135. data/lib/bundler/shared_helpers.rb +3 -3
  136. data/lib/bundler/similarity_detector.rb +1 -1
  137. data/lib/bundler/source.rb +7 -1
  138. data/lib/bundler/source/git.rb +24 -22
  139. data/lib/bundler/source/git/git_proxy.rb +82 -80
  140. data/lib/bundler/source/metadata.rb +0 -4
  141. data/lib/bundler/source/path.rb +10 -4
  142. data/lib/bundler/source/path/installer.rb +10 -10
  143. data/lib/bundler/source/rubygems.rb +45 -24
  144. data/lib/bundler/source/rubygems/remote.rb +1 -1
  145. data/lib/bundler/source_list.rb +31 -26
  146. data/lib/bundler/spec_set.rb +29 -17
  147. data/lib/bundler/stub_specification.rb +25 -7
  148. data/lib/bundler/templates/Gemfile +1 -1
  149. data/lib/bundler/templates/gems.rb +1 -1
  150. data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
  151. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  152. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  153. data/lib/bundler/templates/newgem/README.md.tt +6 -5
  154. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  155. data/lib/bundler/templates/newgem/bin/console.tt +1 -0
  156. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  157. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  158. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +16 -0
  159. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  160. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  161. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  162. data/lib/bundler/templates/newgem/newgem.gemspec.tt +15 -7
  163. data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  164. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  165. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  166. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  167. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  168. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  169. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  170. data/lib/bundler/ui/shell.rb +5 -5
  171. data/lib/bundler/uri_credentials_filter.rb +3 -1
  172. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -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.rb +34 -2
  175. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  176. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
  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/net-http-persistent/lib/net/http/persistent.rb +82 -189
  182. data/lib/bundler/vendor/thor/lib/thor.rb +5 -13
  183. data/lib/bundler/vendor/thor/lib/thor/actions.rb +1 -1
  184. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  185. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +4 -2
  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/tmpdir/lib/tmpdir.rb +154 -0
  194. data/lib/bundler/vendored_persistent.rb +0 -7
  195. data/lib/bundler/vendored_tmpdir.rb +4 -0
  196. data/lib/bundler/version.rb +1 -1
  197. data/lib/bundler/worker.rb +1 -1
  198. data/lib/bundler/yaml_serializer.rb +1 -1
  199. metadata +71 -85
  200. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  201. data/man/bundle-add.1.txt +0 -58
  202. data/man/bundle-binstubs.1.txt +0 -48
  203. data/man/bundle-cache.1.txt +0 -78
  204. data/man/bundle-check.1.txt +0 -33
  205. data/man/bundle-clean.1.txt +0 -26
  206. data/man/bundle-config.1.txt +0 -528
  207. data/man/bundle-doctor.1.txt +0 -44
  208. data/man/bundle-exec.1.txt +0 -178
  209. data/man/bundle-gem.1.txt +0 -91
  210. data/man/bundle-info.1.txt +0 -21
  211. data/man/bundle-init.1.txt +0 -34
  212. data/man/bundle-inject.1.txt +0 -32
  213. data/man/bundle-install.1.txt +0 -401
  214. data/man/bundle-list.1.txt +0 -43
  215. data/man/bundle-lock.1.txt +0 -93
  216. data/man/bundle-open.1.txt +0 -29
  217. data/man/bundle-outdated.1.txt +0 -131
  218. data/man/bundle-platform.1.txt +0 -57
  219. data/man/bundle-pristine.1.txt +0 -44
  220. data/man/bundle-remove.1.txt +0 -34
  221. data/man/bundle-show.1.txt +0 -27
  222. data/man/bundle-update.1.txt +0 -390
  223. data/man/bundle-viz.1.txt +0 -39
  224. data/man/bundle.1.txt +0 -116
  225. data/man/gemfile.5.txt +0 -649
@@ -3,61 +3,74 @@
3
3
  module Bundler
4
4
  class Resolver
5
5
  class SpecGroup
6
- include GemHelpers
7
-
8
6
  attr_accessor :name, :version, :source
9
- attr_accessor :ignores_bundler_dependencies
7
+ attr_accessor :activated_platforms
8
+
9
+ def self.create_for(specs, all_platforms, specific_platform)
10
+ specific_platform_specs = specs[specific_platform]
11
+ return unless specific_platform_specs.any?
12
+
13
+ platforms = all_platforms.select {|p| specs[p].any? }
10
14
 
11
- def initialize(all_specs)
12
- raise ArgumentError, "cannot initialize with an empty value" unless exemplary_spec = all_specs.first
15
+ new(specific_platform_specs.first, specs, platforms)
16
+ end
17
+
18
+ def initialize(exemplary_spec, specs, relevant_platforms)
19
+ @exemplary_spec = exemplary_spec
13
20
  @name = exemplary_spec.name
14
21
  @version = exemplary_spec.version
15
22
  @source = exemplary_spec.source
16
23
 
17
- @activated_platforms = []
18
- @dependencies = nil
19
- @specs = Hash.new do |specs, platform|
20
- specs[platform] = select_best_platform_match(all_specs, platform)
24
+ @all_platforms = relevant_platforms
25
+ @activated_platforms = relevant_platforms
26
+ @dependencies = Hash.new do |dependencies, platforms|
27
+ dependencies[platforms] = dependencies_for(platforms)
28
+ end
29
+ @partitioned_dependency_names = Hash.new do |partitioned_dependency_names, platforms|
30
+ partitioned_dependency_names[platforms] = partitioned_dependency_names_for(platforms)
21
31
  end
22
- @ignores_bundler_dependencies = true
32
+ @specs = specs
23
33
  end
24
34
 
25
35
  def to_specs
26
- @activated_platforms.map do |p|
27
- next unless s = @specs[p]
28
- lazy_spec = LazySpecification.new(name, version, s.platform, source)
29
- lazy_spec.dependencies.replace s.dependencies
30
- lazy_spec
31
- end.compact
36
+ activated_platforms.map do |p|
37
+ specs = @specs[p]
38
+ next unless specs.any?
39
+
40
+ specs.map do |s|
41
+ lazy_spec = LazySpecification.new(name, version, s.platform, source)
42
+ lazy_spec.dependencies.replace s.dependencies
43
+ lazy_spec
44
+ end
45
+ end.flatten.compact.uniq
32
46
  end
33
47
 
34
48
  def activate_platform!(platform)
35
- return unless for?(platform)
36
- return if @activated_platforms.include?(platform)
37
- @activated_platforms << platform
49
+ self.activated_platforms = [platform]
38
50
  end
39
51
 
40
- def for?(platform)
41
- spec = @specs[platform]
42
- !spec.nil?
52
+ def activate_all_platforms!
53
+ self.activated_platforms = @all_platforms
43
54
  end
44
55
 
45
56
  def to_s
46
- @to_s ||= "#{name} (#{version})"
57
+ activated_platforms_string = sorted_activated_platforms.join(", ")
58
+ "#{name} (#{version}) (#{activated_platforms_string})"
47
59
  end
48
60
 
49
61
  def dependencies_for_activated_platforms
50
- dependencies = @activated_platforms.map {|p| __dependencies[p] }
51
- metadata_dependencies = @activated_platforms.map do |platform|
52
- metadata_dependencies(@specs[platform], platform)
53
- end
54
- dependencies.concat(metadata_dependencies).flatten
62
+ @dependencies[activated_platforms]
63
+ end
64
+
65
+ def partitioned_dependency_names_for_activated_platforms
66
+ @partitioned_dependency_names[activated_platforms]
55
67
  end
56
68
 
57
69
  def ==(other)
58
70
  return unless other.is_a?(SpecGroup)
59
71
  name == other.name &&
60
72
  version == other.version &&
73
+ sorted_activated_platforms == other.sorted_activated_platforms &&
61
74
  source == other.source
62
75
  end
63
76
 
@@ -65,40 +78,54 @@ module Bundler
65
78
  return unless other.is_a?(SpecGroup)
66
79
  name.eql?(other.name) &&
67
80
  version.eql?(other.version) &&
81
+ sorted_activated_platforms.eql?(other.sorted_activated_platforms) &&
68
82
  source.eql?(other.source)
69
83
  end
70
84
 
71
85
  def hash
72
- to_s.hash ^ source.hash
86
+ name.hash ^ version.hash ^ sorted_activated_platforms.hash ^ source.hash
73
87
  end
74
88
 
75
- private
89
+ protected
76
90
 
77
- def __dependencies
78
- @dependencies = Hash.new do |dependencies, platform|
79
- dependencies[platform] = []
80
- if spec = @specs[platform]
81
- spec.dependencies.each do |dep|
82
- next if dep.type == :development
83
- next if @ignores_bundler_dependencies && dep.name == "bundler".freeze
84
- dependencies[platform] << DepProxy.new(dep, platform)
85
- end
86
- end
87
- dependencies[platform]
91
+ def sorted_activated_platforms
92
+ activated_platforms.sort_by(&:to_s)
93
+ end
94
+
95
+ private
96
+
97
+ def dependencies_for(platforms)
98
+ platforms.map do |platform|
99
+ __dependencies(platform) + metadata_dependencies(platform)
100
+ end.flatten
101
+ end
102
+
103
+ def partitioned_dependency_names_for(platforms)
104
+ return @dependencies[platforms].map(&:name), [] if platforms.size == 1
105
+
106
+ @dependencies[platforms].partition do |dep_proxy|
107
+ @dependencies[platforms].count {|dp| dp.dep == dep_proxy.dep } == platforms.size
108
+ end.map {|deps| deps.map(&:name) }
109
+ end
110
+
111
+ def __dependencies(platform)
112
+ dependencies = []
113
+ @specs[platform].first.dependencies.each do |dep|
114
+ next if dep.type == :development
115
+ dependencies << DepProxy.get_proxy(dep, platform)
88
116
  end
117
+ dependencies
89
118
  end
90
119
 
91
- def metadata_dependencies(spec, platform)
92
- return [] unless spec
93
- # Only allow endpoint specifications since they won't hit the network to
94
- # fetch the full gemspec when calling required_ruby_version
95
- return [] if !spec.is_a?(EndpointSpecification) && !spec.is_a?(Gem::Specification)
120
+ def metadata_dependencies(platform)
121
+ spec = @specs[platform].first
122
+ return [] unless spec.is_a?(Gem::Specification)
96
123
  dependencies = []
97
124
  if !spec.required_ruby_version.nil? && !spec.required_ruby_version.none?
98
- dependencies << DepProxy.new(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform)
125
+ dependencies << DepProxy.get_proxy(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform)
99
126
  end
100
127
  if !spec.required_rubygems_version.nil? && !spec.required_rubygems_version.none?
101
- dependencies << DepProxy.new(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
128
+ dependencies << DepProxy.get_proxy(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform)
102
129
  end
103
130
  dependencies
104
131
  end
data/lib/bundler/retry.rb CHANGED
@@ -32,7 +32,7 @@ module Bundler
32
32
  end
33
33
  alias_method :attempts, :attempt
34
34
 
35
- private
35
+ private
36
36
 
37
37
  def run(&block)
38
38
  @failed = false
@@ -49,7 +49,7 @@ module Bundler
49
49
  raise e
50
50
  end
51
51
  return true unless name
52
- Bundler.ui.info "" unless Bundler.ui.debug? # Add new line incase dots preceded this
52
+ Bundler.ui.info "" unless Bundler.ui.debug? # Add new line in case dots preceded this
53
53
  Bundler.ui.warn "Retrying #{name} due to error (#{current_run.next}/#{total_runs}): #{e.class} #{e.message}", Bundler.ui.debug?
54
54
  end
55
55
 
@@ -123,7 +123,7 @@ module Bundler
123
123
  @exact = versions.all? {|v| Gem::Requirement.create(v).exact? }
124
124
  end
125
125
 
126
- private
126
+ private
127
127
 
128
128
  def matches?(requirements, version)
129
129
  # Handles RUBY_PATCHLEVEL of -1 for instances like ruby-head
@@ -47,14 +47,13 @@ module Gem
47
47
  full_require_paths
48
48
  end
49
49
 
50
- if method_defined?(:extension_dir)
51
- alias_method :rg_extension_dir, :extension_dir
52
- def extension_dir
53
- @bundler_extension_dir ||= if source.respond_to?(:extension_dir_name)
54
- File.expand_path(File.join(extensions_dir, source.extension_dir_name))
55
- else
56
- rg_extension_dir
57
- end
50
+ alias_method :rg_extension_dir, :extension_dir
51
+ def extension_dir
52
+ @bundler_extension_dir ||= if source.respond_to?(:extension_dir_name)
53
+ unique_extension_dir = [source.extension_dir_name, File.basename(full_gem_path)].uniq.join("-")
54
+ File.expand_path(File.join(extensions_dir, unique_extension_dir))
55
+ else
56
+ rg_extension_dir
58
57
  end
59
58
  end
60
59
 
@@ -86,7 +85,7 @@ module Gem
86
85
  dependencies - development_dependencies
87
86
  end
88
87
 
89
- private
88
+ private
90
89
 
91
90
  def dependencies_to_gemfile(dependencies, group = nil)
92
91
  gemfile = String.new
@@ -130,6 +129,51 @@ module Gem
130
129
  end
131
130
  end
132
131
 
132
+ # comparison is done order independently since rubygems 3.2.0.rc.2
133
+ unless Gem::Requirement.new("> 1", "< 2") == Gem::Requirement.new("< 2", "> 1")
134
+ class Requirement
135
+ module OrderIndependentComparison
136
+ def ==(other)
137
+ if _requirements_sorted? && other._requirements_sorted?
138
+ super
139
+ else
140
+ _with_sorted_requirements == other._with_sorted_requirements
141
+ end
142
+ end
143
+
144
+ protected
145
+
146
+ def _requirements_sorted?
147
+ return @_are_requirements_sorted if defined?(@_are_requirements_sorted)
148
+ strings = as_list
149
+ @_are_requirements_sorted = strings == strings.sort
150
+ end
151
+
152
+ def _with_sorted_requirements
153
+ @_with_sorted_requirements ||= _requirements_sorted? ? self : self.class.new(as_list.sort)
154
+ end
155
+ end
156
+
157
+ prepend OrderIndependentComparison
158
+ end
159
+ end
160
+
161
+ if Gem::Requirement.new("~> 2.0").hash == Gem::Requirement.new("~> 2.0.0").hash
162
+ class Requirement
163
+ module CorrectHashForLambdaOperator
164
+ def hash
165
+ if requirements.any? {|r| r.first == "~>" }
166
+ requirements.map {|r| r.first == "~>" ? [r[0], r[1].to_s] : r }.sort.hash
167
+ else
168
+ super
169
+ end
170
+ end
171
+ end
172
+
173
+ prepend CorrectHashForLambdaOperator
174
+ end
175
+ end
176
+
133
177
  class Platform
134
178
  JAVA = Gem::Platform.new("java") unless defined?(JAVA)
135
179
  MSWIN = Gem::Platform.new("mswin32") unless defined?(MSWIN)
@@ -145,6 +189,22 @@ module Gem
145
189
  undef_method :eql? if method_defined? :eql?
146
190
  alias_method :eql?, :==
147
191
  end
192
+
193
+ require "rubygems/util"
194
+
195
+ Util.singleton_class.module_eval do
196
+ if Util.singleton_methods.include?(:glob_files_in_dir) # since 3.0.0.beta.2
197
+ remove_method :glob_files_in_dir
198
+ end
199
+
200
+ def glob_files_in_dir(glob, base_path)
201
+ if RUBY_VERSION >= "2.5"
202
+ Dir.glob(glob, :base => base_path).map! {|f| File.expand_path(f, base_path) }
203
+ else
204
+ Dir.glob(File.join(base_path.to_s.gsub(/[\[\]]/, '\\\\\\&'), glob)).map! {|f| File.expand_path(f) }
205
+ end
206
+ end
207
+ end
148
208
  end
149
209
 
150
210
  module Gem
@@ -4,23 +4,64 @@ require "rubygems/installer"
4
4
 
5
5
  module Bundler
6
6
  class RubyGemsGemInstaller < Gem::Installer
7
- unless respond_to?(:at)
8
- def self.at(*args)
9
- new(*args)
10
- end
11
- end
12
-
13
7
  def check_executable_overwrite(filename)
14
8
  # Bundler needs to install gems regardless of binstub overwriting
15
9
  end
16
10
 
11
+ def install
12
+ pre_install_checks
13
+
14
+ run_pre_install_hooks
15
+
16
+ spec.loaded_from = spec_file
17
+
18
+ # Completely remove any previous gem files
19
+ FileUtils.rm_rf gem_dir
20
+ FileUtils.rm_rf spec.extension_dir
21
+
22
+ FileUtils.mkdir_p gem_dir, :mode => 0o755
23
+
24
+ extract_files
25
+
26
+ build_extensions
27
+ write_build_info_file
28
+ run_post_build_hooks
29
+
30
+ generate_bin
31
+ generate_plugins
32
+
33
+ write_spec
34
+ write_cache_file
35
+
36
+ say spec.post_install_message unless spec.post_install_message.nil?
37
+
38
+ run_post_install_hooks
39
+
40
+ spec
41
+ end
42
+
43
+ def generate_plugins
44
+ return unless Gem::Installer.instance_methods(false).include?(:generate_plugins)
45
+
46
+ latest = Gem::Specification.stubs_for(spec.name).first
47
+ return if latest && latest.version > spec.version
48
+
49
+ ensure_writable_dir @plugins_dir
50
+
51
+ if spec.plugins.empty?
52
+ remove_plugins_for(spec, @plugins_dir)
53
+ else
54
+ regenerate_plugins_for(spec, @plugins_dir)
55
+ end
56
+ end
57
+
17
58
  def pre_install_checks
18
59
  super && validate_bundler_checksum(options[:bundler_expected_checksum])
19
60
  end
20
61
 
21
62
  def build_extensions
22
63
  extension_cache_path = options[:bundler_extension_cache_path]
23
- return super unless extension_cache_path && extension_dir = Bundler.rubygems.spec_extension_dir(spec)
64
+ return super unless extension_cache_path && extension_dir = spec.extension_dir
24
65
 
25
66
  extension_dir = Pathname.new(extension_dir)
26
67
  build_complete = SharedHelpers.filesystem_access(extension_cache_path.join("gem.build_complete"), :read, &:file?)
@@ -40,7 +81,7 @@ module Bundler
40
81
  end
41
82
  end
42
83
 
43
- private
84
+ private
44
85
 
45
86
  def validate_bundler_checksum(checksum)
46
87
  return true if Bundler.settings[:disable_checksum_validation]
@@ -66,7 +107,7 @@ module Bundler
66
107
 
67
108
  If you wish to continue installing the downloaded gem, and are certain it does not pose a \
68
109
  security issue despite the mismatching checksum, do the following:
69
- 1. run `bundle config set disable_checksum_validation true` to turn off checksum verification
110
+ 1. run `bundle config set --local disable_checksum_validation true` to turn off checksum verification
70
111
  2. run `bundle install`
71
112
 
72
113
  (More info: The expected SHA256 checksum was #{checksum.inspect}, but the \
@@ -102,11 +102,6 @@ module Bundler
102
102
  end.flatten(1)
103
103
  end
104
104
 
105
- def spec_extension_dir(spec)
106
- return unless spec.respond_to?(:extension_dir)
107
- spec.extension_dir
108
- end
109
-
110
105
  def stub_set_spec(stub, spec)
111
106
  stub.instance_variable_set(:@spec, spec)
112
107
  end
@@ -115,11 +110,6 @@ module Bundler
115
110
  obj.to_s
116
111
  end
117
112
 
118
- def platforms
119
- return [Gem::Platform::RUBY] if Bundler.settings[:force_ruby_platform]
120
- Gem.platforms
121
- end
122
-
123
113
  def configuration
124
114
  require_relative "psyched_yaml"
125
115
  Gem.configuration
@@ -141,14 +131,10 @@ module Bundler
141
131
  end
142
132
 
143
133
  def inflate(obj)
144
- require "rubygems/util"
145
-
146
134
  Gem::Util.inflate(obj)
147
135
  end
148
136
 
149
137
  def correct_for_windows_path(path)
150
- require "rubygems/util"
151
-
152
138
  if Gem::Util.respond_to?(:correct_for_windows_path)
153
139
  Gem::Util.correct_for_windows_path(path)
154
140
  elsif path[0].chr == "/" && path[1].chr =~ /[a-z]/i && path[2].chr == ":"
@@ -223,11 +209,6 @@ module Bundler
223
209
  Gem.bin_path(gem, bin, ver)
224
210
  end
225
211
 
226
- def preserve_paths
227
- # this is a no-op outside of RubyGems 1.8
228
- yield
229
- end
230
-
231
212
  def loaded_gem_paths
232
213
  loaded_gem_paths = Gem.loaded_specs.map {|_, s| s.full_require_paths }
233
214
  loaded_gem_paths.flatten
@@ -241,6 +222,10 @@ module Bundler
241
222
  Gem.load_plugin_files(files) if Gem.respond_to?(:load_plugin_files)
242
223
  end
243
224
 
225
+ def load_env_plugins
226
+ Gem.load_env_plugins if Gem.respond_to?(:load_env_plugins)
227
+ end
228
+
244
229
  def ui=(obj)
245
230
  Gem::DefaultUserInteraction.ui = obj
246
231
  end
@@ -265,8 +250,6 @@ module Bundler
265
250
  require "rubygems/security"
266
251
  require_relative "psyched_yaml"
267
252
  gem_from_path(path, security_policies[policy]).spec
268
- rescue Gem::Package::FormatError
269
- raise GemspecError, "Could not read gem at #{path}. It may be corrupted."
270
253
  rescue Exception, Gem::Exception, Gem::Security::Exception => e # rubocop:disable Lint/RescueException
271
254
  if e.is_a?(Gem::Security::Exception) ||
272
255
  e.message =~ /unknown trust policy|unsigned gem/i ||
@@ -329,8 +312,13 @@ module Bundler
329
312
  end
330
313
 
331
314
  message = if spec.nil?
315
+ target_file = begin
316
+ Bundler.default_gemfile.basename
317
+ rescue GemfileNotFound
318
+ "inline Gemfile"
319
+ end
332
320
  "#{dep.name} is not part of the bundle." \
333
- " Add it to your #{Bundler.default_gemfile.basename}."
321
+ " Add it to your #{target_file}."
334
322
  else
335
323
  "can't activate #{dep}, already activated #{spec.full_name}. " \
336
324
  "Make sure all dependencies are added to Gemfile."
@@ -346,7 +334,7 @@ module Bundler
346
334
  raise e
347
335
  end
348
336
 
349
- # backwards compatibility shim, see https://github.com/bundler/bundler/issues/5102
337
+ # backwards compatibility shim, see https://github.com/rubygems/bundler/issues/5102
350
338
  kernel_class.send(:public, :gem) if Bundler.feature_flag.setup_makes_kernel_gem_public?
351
339
  end
352
340
  end
@@ -422,6 +410,17 @@ module Bundler
422
410
  # Replace or hook into RubyGems to provide a bundlerized view
423
411
  # of the world.
424
412
  def replace_entrypoints(specs)
413
+ specs_by_name = add_default_gems_to(specs)
414
+
415
+ replace_gem(specs, specs_by_name)
416
+ stub_rubygems(specs)
417
+ replace_bin_path(specs_by_name)
418
+
419
+ Gem.clear_paths
420
+ end
421
+
422
+ # Add default gems not already present in specs, and return them as a hash.
423
+ def add_default_gems_to(specs)
425
424
  specs_by_name = specs.reduce({}) do |h, s|
426
425
  h[s.name] = s
427
426
  h
@@ -436,40 +435,7 @@ module Bundler
436
435
  specs_by_name[default_spec_name] = default_spec
437
436
  end
438
437
 
439
- replace_gem(specs, specs_by_name)
440
- stub_rubygems(specs)
441
- replace_bin_path(specs_by_name)
442
-
443
- Gem.clear_paths
444
- end
445
-
446
- # This backports base_dir which replaces installation path
447
- # RubyGems 1.8+
448
- def backport_base_dir
449
- redefine_method(Gem::Specification, :base_dir) do
450
- return Gem.dir unless loaded_from
451
- File.dirname File.dirname loaded_from
452
- end
453
- end
454
-
455
- def backport_cache_file
456
- redefine_method(Gem::Specification, :cache_dir) do
457
- @cache_dir ||= File.join base_dir, "cache"
458
- end
459
-
460
- redefine_method(Gem::Specification, :cache_file) do
461
- @cache_file ||= File.join cache_dir, "#{full_name}.gem"
462
- end
463
- end
464
-
465
- def backport_spec_file
466
- redefine_method(Gem::Specification, :spec_dir) do
467
- @spec_dir ||= File.join base_dir, "specifications"
468
- end
469
-
470
- redefine_method(Gem::Specification, :spec_file) do
471
- @spec_file ||= File.join spec_dir, "#{full_name}.gemspec"
472
- end
438
+ specs_by_name
473
439
  end
474
440
 
475
441
  def undo_replacements
@@ -594,7 +560,6 @@ module Bundler
594
560
  end
595
561
 
596
562
  def all_specs
597
- require_relative "remote_specification"
598
563
  Gem::Specification.stubs.map do |stub|
599
564
  StubSpecification.from_stub(stub)
600
565
  end
@@ -602,10 +567,10 @@ module Bundler
602
567
 
603
568
  def backport_ext_builder_monitor
604
569
  # So we can avoid requiring "rubygems/ext" in its entirety
605
- Gem.module_eval <<-RB, __FILE__, __LINE__ + 1
570
+ Gem.module_eval <<-RUBY, __FILE__, __LINE__ + 1
606
571
  module Ext
607
572
  end
608
- RB
573
+ RUBY
609
574
 
610
575
  require "rubygems/ext/builder"
611
576