bundler 1.15.1 → 1.17.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 (294) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +320 -0
  3. data/README.md +17 -8
  4. data/bundler.gemspec +25 -9
  5. data/exe/bundle +1 -6
  6. data/exe/bundle_ruby +4 -3
  7. data/lib/bundler/build_metadata.rb +53 -0
  8. data/lib/bundler/capistrano.rb +5 -0
  9. data/lib/bundler/cli/add.rb +15 -6
  10. data/lib/bundler/cli/binstubs.rb +17 -9
  11. data/lib/bundler/cli/cache.rb +5 -4
  12. data/lib/bundler/cli/check.rb +3 -5
  13. data/lib/bundler/cli/clean.rb +5 -6
  14. data/lib/bundler/cli/common.rb +11 -2
  15. data/lib/bundler/cli/config.rb +2 -1
  16. data/lib/bundler/cli/console.rb +2 -1
  17. data/lib/bundler/cli/doctor.rb +48 -1
  18. data/lib/bundler/cli/exec.rb +6 -5
  19. data/lib/bundler/cli/gem.rb +13 -8
  20. data/lib/bundler/cli/info.rb +0 -1
  21. data/lib/bundler/cli/init.rb +18 -6
  22. data/lib/bundler/cli/inject.rb +1 -0
  23. data/lib/bundler/cli/install.rb +64 -77
  24. data/lib/bundler/cli/issue.rb +1 -1
  25. data/lib/bundler/cli/list.rb +58 -0
  26. data/lib/bundler/cli/lock.rb +0 -1
  27. data/lib/bundler/cli/open.rb +2 -2
  28. data/lib/bundler/cli/outdated.rb +20 -9
  29. data/lib/bundler/cli/package.rb +9 -6
  30. data/lib/bundler/cli/platform.rb +1 -0
  31. data/lib/bundler/cli/plugin.rb +1 -0
  32. data/lib/bundler/cli/pristine.rb +20 -6
  33. data/lib/bundler/cli/remove.rb +18 -0
  34. data/lib/bundler/cli/show.rb +0 -1
  35. data/lib/bundler/cli/update.rb +35 -7
  36. data/lib/bundler/cli/viz.rb +4 -0
  37. data/lib/bundler/cli.rb +234 -90
  38. data/lib/bundler/compact_index_client/cache.rb +1 -2
  39. data/lib/bundler/compact_index_client/updater.rb +35 -7
  40. data/lib/bundler/compact_index_client.rb +1 -0
  41. data/lib/bundler/compatibility_guard.rb +14 -0
  42. data/lib/bundler/constants.rb +1 -0
  43. data/lib/bundler/current_ruby.rb +13 -5
  44. data/lib/bundler/definition.rb +192 -139
  45. data/lib/bundler/dep_proxy.rb +3 -1
  46. data/lib/bundler/dependency.rb +9 -9
  47. data/lib/bundler/deployment.rb +1 -1
  48. data/lib/bundler/deprecate.rb +15 -3
  49. data/lib/bundler/dsl.rb +115 -64
  50. data/lib/bundler/endpoint_specification.rb +10 -1
  51. data/lib/bundler/env.rb +90 -29
  52. data/lib/bundler/environment_preserver.rb +27 -6
  53. data/lib/bundler/errors.rb +1 -0
  54. data/lib/bundler/feature_flag.rb +46 -4
  55. data/lib/bundler/fetcher/base.rb +1 -0
  56. data/lib/bundler/fetcher/compact_index.rb +2 -11
  57. data/lib/bundler/fetcher/dependency.rb +2 -1
  58. data/lib/bundler/fetcher/downloader.rb +11 -5
  59. data/lib/bundler/fetcher/index.rb +3 -2
  60. data/lib/bundler/fetcher.rb +18 -11
  61. data/lib/bundler/friendly_errors.rb +6 -1
  62. data/lib/bundler/gem_helper.rb +19 -10
  63. data/lib/bundler/gem_helpers.rb +1 -0
  64. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  65. data/lib/bundler/gem_tasks.rb +1 -0
  66. data/lib/bundler/gem_version_promoter.rb +17 -2
  67. data/lib/bundler/gemdeps.rb +1 -0
  68. data/lib/bundler/graph.rb +1 -0
  69. data/lib/bundler/index.rb +8 -8
  70. data/lib/bundler/injector.rb +192 -30
  71. data/lib/bundler/inline.rb +10 -10
  72. data/lib/bundler/installer/gem_installer.rb +12 -2
  73. data/lib/bundler/installer/parallel_installer.rb +78 -42
  74. data/lib/bundler/installer/standalone.rb +1 -0
  75. data/lib/bundler/installer.rb +138 -53
  76. data/lib/bundler/lazy_specification.rb +3 -2
  77. data/lib/bundler/lockfile_generator.rb +95 -0
  78. data/lib/bundler/lockfile_parser.rb +10 -4
  79. data/lib/bundler/match_platform.rb +1 -0
  80. data/lib/bundler/mirror.rb +8 -5
  81. data/lib/bundler/plugin/api/source.rb +9 -2
  82. data/lib/bundler/plugin/events.rb +61 -0
  83. data/lib/bundler/plugin/index.rb +7 -2
  84. data/lib/bundler/plugin/installer.rb +7 -6
  85. data/lib/bundler/plugin/source_list.rb +7 -8
  86. data/lib/bundler/plugin.rb +13 -5
  87. data/lib/bundler/process_lock.rb +24 -0
  88. data/lib/bundler/psyched_yaml.rb +10 -0
  89. data/lib/bundler/remote_specification.rb +10 -1
  90. data/lib/bundler/resolver/spec_group.rb +106 -0
  91. data/lib/bundler/resolver.rb +158 -195
  92. data/lib/bundler/retry.rb +1 -0
  93. data/lib/bundler/ruby_dsl.rb +1 -0
  94. data/lib/bundler/ruby_version.rb +2 -1
  95. data/lib/bundler/rubygems_ext.rb +5 -4
  96. data/lib/bundler/rubygems_gem_installer.rb +31 -1
  97. data/lib/bundler/rubygems_integration.rb +71 -32
  98. data/lib/bundler/runtime.rb +11 -9
  99. data/lib/bundler/settings/validator.rb +102 -0
  100. data/lib/bundler/settings.rb +213 -86
  101. data/lib/bundler/setup.rb +4 -7
  102. data/lib/bundler/shared_helpers.rb +131 -26
  103. data/lib/bundler/similarity_detector.rb +1 -0
  104. data/lib/bundler/source/gemspec.rb +1 -0
  105. data/lib/bundler/source/git/git_proxy.rb +21 -11
  106. data/lib/bundler/source/git.rb +24 -19
  107. data/lib/bundler/source/metadata.rb +62 -0
  108. data/lib/bundler/source/path/installer.rb +2 -0
  109. data/lib/bundler/source/path.rb +11 -7
  110. data/lib/bundler/source/rubygems/remote.rb +8 -2
  111. data/lib/bundler/source/rubygems.rb +161 -84
  112. data/lib/bundler/source.rb +36 -0
  113. data/lib/bundler/source_list.rb +75 -15
  114. data/lib/bundler/spec_set.rb +12 -6
  115. data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  116. data/lib/bundler/stub_specification.rb +1 -0
  117. data/lib/bundler/templates/.document +1 -0
  118. data/lib/bundler/templates/Executable +12 -0
  119. data/lib/bundler/templates/Executable.bundler +105 -0
  120. data/lib/bundler/templates/Gemfile +3 -0
  121. data/lib/bundler/templates/gems.rb +8 -0
  122. data/lib/bundler/templates/newgem/Gemfile.tt +2 -0
  123. data/lib/bundler/templates/newgem/README.md.tt +1 -1
  124. data/lib/bundler/templates/newgem/gitignore.tt +0 -1
  125. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
  126. data/lib/bundler/templates/newgem/newgem.gemspec.tt +12 -3
  127. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  128. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +0 -2
  129. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  130. data/lib/bundler/ui/rg_proxy.rb +1 -0
  131. data/lib/bundler/ui/shell.rb +17 -4
  132. data/lib/bundler/ui/silent.rb +1 -0
  133. data/lib/bundler/ui.rb +1 -0
  134. data/lib/bundler/uri_credentials_filter.rb +1 -0
  135. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  136. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  137. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  138. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  139. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  140. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -0
  141. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -0
  142. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -0
  143. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -0
  144. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -0
  145. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -0
  146. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -0
  147. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +15 -4
  148. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -2
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
  150. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  151. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  152. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  153. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +491 -148
  154. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  155. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  156. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  157. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +3 -1
  158. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -0
  159. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +1 -0
  160. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +9 -1
  161. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +45 -8
  162. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +9 -3
  163. data/lib/bundler/vendor/thor/lib/thor/actions.rb +6 -3
  164. data/lib/bundler/vendor/thor/lib/thor/base.rb +27 -4
  165. data/lib/bundler/vendor/thor/lib/thor/command.rb +9 -7
  166. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +12 -0
  167. data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  168. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  169. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +5 -5
  170. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +6 -5
  171. data/lib/bundler/vendor/thor/lib/thor/runner.rb +6 -4
  172. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +10 -9
  173. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  174. data/lib/bundler/vendor/thor/lib/thor.rb +25 -8
  175. data/lib/bundler/vendored_fileutils.rb +9 -0
  176. data/lib/bundler/vendored_molinillo.rb +1 -0
  177. data/lib/bundler/vendored_persistent.rb +35 -0
  178. data/lib/bundler/vendored_thor.rb +1 -0
  179. data/lib/bundler/version.rb +6 -2
  180. data/lib/bundler/version_ranges.rb +1 -0
  181. data/lib/bundler/vlad.rb +5 -0
  182. data/lib/bundler/worker.rb +1 -0
  183. data/lib/bundler/yaml_serializer.rb +3 -3
  184. data/lib/bundler.rb +86 -52
  185. data/man/bundle-add.1 +18 -3
  186. data/man/bundle-add.1.txt +26 -14
  187. data/man/bundle-add.ronn +13 -2
  188. data/man/bundle-binstubs.1 +11 -1
  189. data/man/bundle-binstubs.1.txt +33 -18
  190. data/man/bundle-binstubs.ronn +15 -1
  191. data/man/bundle-check.1 +4 -4
  192. data/man/bundle-check.1.txt +15 -14
  193. data/man/bundle-check.ronn +3 -3
  194. data/man/bundle-clean.1 +1 -1
  195. data/man/bundle-clean.1.txt +10 -10
  196. data/man/bundle-config.1 +129 -29
  197. data/man/bundle-config.1.txt +285 -174
  198. data/man/bundle-config.ronn +167 -88
  199. data/man/bundle-doctor.1 +44 -0
  200. data/man/bundle-doctor.1.txt +44 -0
  201. data/man/bundle-doctor.ronn +33 -0
  202. data/man/bundle-exec.1 +6 -3
  203. data/man/bundle-exec.1.txt +78 -71
  204. data/man/bundle-exec.ronn +10 -3
  205. data/man/bundle-gem.1 +4 -4
  206. data/man/bundle-gem.1.txt +41 -40
  207. data/man/bundle-gem.ronn +3 -2
  208. data/man/bundle-info.1 +1 -1
  209. data/man/bundle-info.1.txt +8 -8
  210. data/man/bundle-init.1 +9 -4
  211. data/man/bundle-init.1.txt +23 -13
  212. data/man/bundle-init.ronn +15 -4
  213. data/man/bundle-inject.1 +4 -4
  214. data/man/bundle-inject.1.txt +10 -10
  215. data/man/bundle-inject.ronn +3 -3
  216. data/man/bundle-install.1 +31 -28
  217. data/man/bundle-install.1.txt +205 -194
  218. data/man/bundle-install.ronn +44 -35
  219. data/man/bundle-list.1 +50 -0
  220. data/man/bundle-list.1.txt +43 -0
  221. data/man/bundle-list.ronn +33 -0
  222. data/man/bundle-lock.1 +1 -1
  223. data/man/bundle-lock.1.txt +47 -47
  224. data/man/bundle-lock.ronn +1 -1
  225. data/man/bundle-open.1 +1 -1
  226. data/man/bundle-open.1.txt +7 -7
  227. data/man/bundle-outdated.1 +7 -3
  228. data/man/bundle-outdated.1.txt +40 -36
  229. data/man/bundle-outdated.ronn +6 -2
  230. data/man/bundle-package.1 +6 -3
  231. data/man/bundle-package.1.txt +44 -39
  232. data/man/bundle-package.ronn +7 -2
  233. data/man/bundle-platform.1 +1 -1
  234. data/man/bundle-platform.1.txt +13 -13
  235. data/man/bundle-pristine.1 +21 -3
  236. data/man/bundle-pristine.1.txt +33 -10
  237. data/man/bundle-pristine.ronn +24 -3
  238. data/man/bundle-remove.1 +31 -0
  239. data/man/bundle-remove.1.txt +34 -0
  240. data/man/bundle-remove.ronn +23 -0
  241. data/man/bundle-show.1 +3 -3
  242. data/man/bundle-show.1.txt +14 -12
  243. data/man/bundle-show.ronn +3 -2
  244. data/man/bundle-update.1 +13 -9
  245. data/man/bundle-update.1.txt +133 -130
  246. data/man/bundle-update.ronn +21 -17
  247. data/man/bundle-viz.1 +7 -7
  248. data/man/bundle-viz.1.txt +17 -15
  249. data/man/bundle-viz.ronn +6 -6
  250. data/man/bundle.1 +31 -32
  251. data/man/bundle.1.txt +63 -75
  252. data/man/bundle.ronn +35 -47
  253. data/man/gemfile.5 +44 -8
  254. data/man/gemfile.5.ronn +54 -8
  255. data/man/gemfile.5.txt +218 -165
  256. data/man/index.txt +25 -15
  257. metadata +36 -44
  258. data/.codeclimate.yml +0 -25
  259. data/.gitignore +0 -18
  260. data/.rspec +0 -3
  261. data/.rubocop.yml +0 -131
  262. data/.rubocop_todo.yml +0 -418
  263. data/.travis.yml +0 -122
  264. data/CODE_OF_CONDUCT.md +0 -42
  265. data/CONTRIBUTING.md +0 -17
  266. data/Rakefile +0 -346
  267. data/bin/rake +0 -19
  268. data/bin/rspec +0 -15
  269. data/bin/rubocop +0 -17
  270. data/bin/with_rubygems +0 -39
  271. data/doc/README.md +0 -30
  272. data/doc/TROUBLESHOOTING.md +0 -64
  273. data/doc/contributing/BUG_TRIAGE.md +0 -36
  274. data/doc/contributing/COMMUNITY.md +0 -13
  275. data/doc/contributing/GETTING_HELP.md +0 -11
  276. data/doc/contributing/HOW_YOU_CAN_HELP.md +0 -27
  277. data/doc/contributing/ISSUES.md +0 -51
  278. data/doc/contributing/README.md +0 -38
  279. data/doc/development/NEW_FEATURES.md +0 -10
  280. data/doc/development/PULL_REQUESTS.md +0 -40
  281. data/doc/development/README.md +0 -19
  282. data/doc/development/RELEASING.md +0 -9
  283. data/doc/development/SETUP.md +0 -29
  284. data/doc/documentation/README.md +0 -29
  285. data/doc/documentation/VISION.md +0 -26
  286. data/doc/documentation/WRITING.md +0 -54
  287. data/lib/bundler/postit_trampoline.rb +0 -73
  288. data/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
  289. data/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
  290. data/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
  291. data/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
  292. data/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
  293. data/lib/bundler/vendor/postit/lib/postit.rb +0 -15
  294. data/task/release.rake +0 -116
data/lib/bundler/retry.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  # General purpose class for retrying code that may fail
4
5
  class Retry
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  module RubyDsl
4
5
  def ruby(*ruby_version)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class RubyVersion
4
5
  attr_reader :versions,
@@ -117,7 +118,7 @@ module Bundler
117
118
  when "jruby"
118
119
  JRUBY_VERSION.dup
119
120
  else
120
- raise BundlerError, "RUBY_ENGINE value #{RUBY_ENGINE} is not recognized"
121
+ RUBY_ENGINE_VERSION.dup
121
122
  end
122
123
  patchlevel = RUBY_PATCHLEVEL.to_s
123
124
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "pathname"
3
4
 
4
5
  if defined?(Gem::QuickLoader)
@@ -14,7 +15,7 @@ begin
14
15
  # shouldn't be deferred.
15
16
  require "rubygems/source"
16
17
  rescue LoadError
17
- # Not available before Rubygems 2.0.0, ignore
18
+ # Not available before RubyGems 2.0.0, ignore
18
19
  nil
19
20
  end
20
21
 
@@ -135,7 +136,7 @@ module Gem
135
136
  end
136
137
 
137
138
  class Dependency
138
- attr_accessor :source, :groups
139
+ attr_accessor :source, :groups, :all_sources
139
140
 
140
141
  alias_method :eql?, :==
141
142
 
@@ -146,7 +147,7 @@ module Gem
146
147
  end
147
148
 
148
149
  def to_yaml_properties
149
- instance_variables.reject {|p| ["@source", "@groups"].include?(p.to_s) }
150
+ instance_variables.reject {|p| ["@source", "@groups", "@all_sources"].include?(p.to_s) }
150
151
  end
151
152
 
152
153
  def to_lock
@@ -158,7 +159,7 @@ module Gem
158
159
  out
159
160
  end
160
161
 
161
- # Backport of performance enhancement added to Rubygems 1.4
162
+ # Backport of performance enhancement added to RubyGems 1.4
162
163
  def matches_spec?(spec)
163
164
  # name can be a Regexp, so use ===
164
165
  return false unless name === spec.name
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "rubygems/installer"
3
4
 
4
5
  module Bundler
@@ -9,6 +10,13 @@ module Bundler
9
10
  end
10
11
  end
11
12
 
13
+ attr_reader :options
14
+
15
+ def initialize(gem, options = {})
16
+ @options = {}
17
+ super
18
+ end
19
+
12
20
  def check_executable_overwrite(filename)
13
21
  # Bundler needs to install gems regardless of binstub overwriting
14
22
  end
@@ -17,6 +25,28 @@ module Bundler
17
25
  super && validate_bundler_checksum(options[:bundler_expected_checksum])
18
26
  end
19
27
 
28
+ def build_extensions
29
+ extension_cache_path = options[:bundler_extension_cache_path]
30
+ return super unless extension_cache_path && extension_dir = Bundler.rubygems.spec_extension_dir(spec)
31
+
32
+ extension_dir = Pathname.new(extension_dir)
33
+ build_complete = SharedHelpers.filesystem_access(extension_cache_path.join("gem.build_complete"), :read, &:file?)
34
+ if build_complete && !options[:force]
35
+ SharedHelpers.filesystem_access(extension_dir.parent, &:mkpath)
36
+ SharedHelpers.filesystem_access(extension_cache_path) do
37
+ FileUtils.cp_r extension_cache_path, spec.extension_dir
38
+ end
39
+ else
40
+ super
41
+ if extension_dir.directory? # not made for gems without extensions
42
+ SharedHelpers.filesystem_access(extension_cache_path.parent, &:mkpath)
43
+ SharedHelpers.filesystem_access(extension_cache_path) do
44
+ FileUtils.cp_r extension_dir, extension_cache_path
45
+ end
46
+ end
47
+ end
48
+ end
49
+
20
50
  private
21
51
 
22
52
  def validate_bundler_checksum(checksum)
@@ -25,7 +55,7 @@ module Bundler
25
55
  return true unless source = @package.instance_variable_get(:@gem)
26
56
  return true unless source.respond_to?(:with_read_io)
27
57
  digest = source.with_read_io do |io|
28
- digest = Digest::SHA256.new
58
+ digest = SharedHelpers.digest(:SHA256).new
29
59
  digest << io.read(16_384) until io.eof?
30
60
  io.rewind
31
61
  send(checksum_type(checksum), digest)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "monitor"
3
4
  require "rubygems"
4
5
  require "rubygems/config_file"
@@ -84,6 +85,19 @@ module Bundler
84
85
  spec.respond_to?(:default_gem?) && spec.default_gem?
85
86
  end
86
87
 
88
+ def spec_matches_for_glob(spec, glob)
89
+ return spec.matches_for_glob(glob) if spec.respond_to?(:matches_for_glob)
90
+
91
+ spec.load_paths.map do |lp|
92
+ Dir["#{lp}/#{glob}#{suffix_pattern}"]
93
+ end.flatten(1)
94
+ end
95
+
96
+ def spec_extension_dir(spec)
97
+ return unless spec.respond_to?(:extension_dir)
98
+ spec.extension_dir
99
+ end
100
+
87
101
  def stub_set_spec(stub, spec)
88
102
  stub.instance_variable_set(:@spec, spec)
89
103
  end
@@ -118,7 +132,11 @@ module Bundler
118
132
  end
119
133
 
120
134
  def inflate(obj)
121
- Gem.inflate(obj)
135
+ if defined?(Gem::Util)
136
+ Gem::Util.inflate(obj)
137
+ else
138
+ Gem.inflate(obj)
139
+ end
122
140
  end
123
141
 
124
142
  def sources=(val)
@@ -158,6 +176,10 @@ module Bundler
158
176
  Gem.post_reset_hooks
159
177
  end
160
178
 
179
+ def suffix_pattern
180
+ Gem.suffix_pattern
181
+ end
182
+
161
183
  def gem_cache
162
184
  gem_path.map {|p| File.expand_path("cache", p) }
163
185
  end
@@ -165,7 +187,7 @@ module Bundler
165
187
  def spec_cache_dirs
166
188
  @spec_cache_dirs ||= begin
167
189
  dirs = gem_path.map {|dir| File.join(dir, "specifications") }
168
- dirs << Gem.spec_cache_dir if Gem.respond_to?(:spec_cache_dir) # Not in Rubygems 2.0.3 or earlier
190
+ dirs << Gem.spec_cache_dir if Gem.respond_to?(:spec_cache_dir) # Not in RubyGems 2.0.3 or earlier
169
191
  dirs.uniq.select {|dir| File.directory? dir }
170
192
  end
171
193
  end
@@ -179,7 +201,7 @@ module Bundler
179
201
  end
180
202
 
181
203
  def repository_subdirectories
182
- %w(cache doc gems specifications)
204
+ %w[cache doc gems specifications]
183
205
  end
184
206
 
185
207
  def clear_paths
@@ -190,8 +212,12 @@ module Bundler
190
212
  Gem.bin_path(gem, bin, ver)
191
213
  end
192
214
 
215
+ def path_separator
216
+ File::PATH_SEPARATOR
217
+ end
218
+
193
219
  def preserve_paths
194
- # this is a no-op outside of Rubygems 1.8
220
+ # this is a no-op outside of RubyGems 1.8
195
221
  yield
196
222
  end
197
223
 
@@ -212,6 +238,10 @@ module Bundler
212
238
  Gem.load_plugins if Gem.respond_to?(:load_plugins)
213
239
  end
214
240
 
241
+ def load_plugin_files(files)
242
+ Gem.load_plugin_files(files) if Gem.respond_to?(:load_plugin_files)
243
+ end
244
+
215
245
  def ui=(obj)
216
246
  Gem::DefaultUserInteraction.ui = obj
217
247
  end
@@ -233,9 +263,9 @@ module Bundler
233
263
  {} # if we can't download them, there aren't any
234
264
  end
235
265
 
236
- # TODO: This is for older versions of Rubygems... should we support the
266
+ # TODO: This is for older versions of RubyGems... should we support the
237
267
  # X-Gemfile-Source header on these old versions?
238
- # Maybe the newer implementation will work on older Rubygems?
268
+ # Maybe the newer implementation will work on older RubyGems?
239
269
  # It seems difficult to keep this implementation and still send the header.
240
270
  def fetch_all_remote_specs(remote)
241
271
  old_sources = Bundler.rubygems.sources
@@ -273,6 +303,7 @@ module Bundler
273
303
 
274
304
  def spec_from_gem(path, policy = nil)
275
305
  require "rubygems/security"
306
+ require "bundler/psyched_yaml"
276
307
  gem_from_path(path, security_policies[policy]).spec
277
308
  rescue Gem::Package::FormatError
278
309
  raise GemspecError, "Could not read gem at #{path}. It may be corrupted."
@@ -300,13 +331,13 @@ module Bundler
300
331
  def download_gem(spec, uri, path)
301
332
  uri = Bundler.settings.mirror_for(uri)
302
333
  fetcher = Gem::RemoteFetcher.new(configuration[:http_proxy])
303
- Bundler::Retry.new("download gem #{uri}", Gem::RemoteFetcher::FetchError).attempts do
334
+ Bundler::Retry.new("download gem from #{uri}").attempts do
304
335
  fetcher.download(spec, uri, path)
305
336
  end
306
337
  end
307
338
 
308
339
  def security_policy_keys
309
- %w(High Medium Low AlmostNo No).map {|level| "#{level}Security" }
340
+ %w[High Medium Low AlmostNo No].map {|level| "#{level}Security" }
310
341
  end
311
342
 
312
343
  def security_policies
@@ -377,9 +408,8 @@ module Bundler
377
408
  raise e
378
409
  end
379
410
 
380
- # TODO: delete this in 2.0, it's a backwards compatibility shim
381
- # see https://github.com/bundler/bundler/issues/5102
382
- kernel_class.send(:public, :gem)
411
+ # backwards compatibility shim, see https://github.com/bundler/bundler/issues/5102
412
+ kernel_class.send(:public, :gem) if Bundler.feature_flag.setup_makes_kernel_gem_public?
383
413
  end
384
414
  end
385
415
 
@@ -434,9 +464,9 @@ module Bundler
434
464
 
435
465
  raise Gem::Exception, "no default executable for #{spec.full_name}" unless exec_name ||= spec.default_executable
436
466
 
437
- unless spec.name == name
438
- Bundler::SharedHelpers.major_deprecation \
439
- "Bundler is using a binstub that was created for a different gem.\n" \
467
+ unless spec.name == gem_name
468
+ Bundler::SharedHelpers.major_deprecation 2,
469
+ "Bundler is using a binstub that was created for a different gem (#{spec.name}).\n" \
440
470
  "You should run `bundle binstub #{gem_name}` " \
441
471
  "to work around a system/bundle conflict."
442
472
  end
@@ -476,7 +506,7 @@ module Bundler
476
506
  redefine_method(gem_class, :refresh) {}
477
507
  end
478
508
 
479
- # Replace or hook into Rubygems to provide a bundlerized view
509
+ # Replace or hook into RubyGems to provide a bundlerized view
480
510
  # of the world.
481
511
  def replace_entrypoints(specs)
482
512
  specs_by_name = specs.reduce({}) do |h, s|
@@ -492,8 +522,8 @@ module Bundler
492
522
  Gem.clear_paths
493
523
  end
494
524
 
495
- # This backports the correct segment generation code from Rubygems 1.4+
496
- # by monkeypatching it into the method in Rubygems 1.3.6 and 1.3.7.
525
+ # This backports the correct segment generation code from RubyGems 1.4+
526
+ # by monkeypatching it into the method in RubyGems 1.3.6 and 1.3.7.
497
527
  def backport_segment_generation
498
528
  redefine_method(Gem::Version, :segments) do
499
529
  @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map do |s|
@@ -512,7 +542,7 @@ module Bundler
512
542
  end
513
543
 
514
544
  # This backports base_dir which replaces installation path
515
- # Rubygems 1.8+
545
+ # RubyGems 1.8+
516
546
  def backport_base_dir
517
547
  redefine_method(Gem::Specification, :base_dir) do
518
548
  return Gem.dir unless loaded_from
@@ -544,8 +574,10 @@ module Bundler
544
574
  @replaced_methods.each do |(sym, klass), method|
545
575
  redefine_method(klass, sym, method)
546
576
  end
547
- post_reset_hooks.reject! do |proc|
548
- proc.binding.eval("__FILE__") == __FILE__
577
+ if Binding.public_method_defined?(:source_location)
578
+ post_reset_hooks.reject! {|proc| proc.binding.source_location[0] == __FILE__ }
579
+ else
580
+ post_reset_hooks.reject! {|proc| proc.binding.eval("__FILE__") == __FILE__ }
549
581
  end
550
582
  @replaced_methods.clear
551
583
  end
@@ -581,7 +613,7 @@ module Bundler
581
613
  end
582
614
  end
583
615
 
584
- # Rubygems 1.4 through 1.6
616
+ # RubyGems 1.4 through 1.6
585
617
  class Legacy < RubygemsIntegration
586
618
  def initialize
587
619
  super
@@ -592,7 +624,7 @@ module Bundler
592
624
  end
593
625
 
594
626
  def stub_rubygems(specs)
595
- # Rubygems versions lower than 1.7 use SourceIndex#from_gems_in
627
+ # RubyGems versions lower than 1.7 use SourceIndex#from_gems_in
596
628
  source_index_class = (class << Gem::SourceIndex; self; end)
597
629
  redefine_method(source_index_class, :from_gems_in) do |*args|
598
630
  Gem::SourceIndex.new.tap do |source_index|
@@ -624,7 +656,7 @@ module Bundler
624
656
  end
625
657
  end
626
658
 
627
- # Rubygems versions 1.3.6 and 1.3.7
659
+ # RubyGems versions 1.3.6 and 1.3.7
628
660
  class Ancient < Legacy
629
661
  def initialize
630
662
  super
@@ -632,7 +664,7 @@ module Bundler
632
664
  end
633
665
  end
634
666
 
635
- # Rubygems 1.7
667
+ # RubyGems 1.7
636
668
  class Transitional < Legacy
637
669
  def stub_rubygems(specs)
638
670
  stub_source_index(specs)
@@ -646,7 +678,7 @@ module Bundler
646
678
  end
647
679
  end
648
680
 
649
- # Rubygems 1.8.5-1.8.19
681
+ # RubyGems 1.8.5-1.8.19
650
682
  class Modern < RubygemsIntegration
651
683
  def stub_rubygems(specs)
652
684
  Gem::Specification.all = specs
@@ -667,9 +699,9 @@ module Bundler
667
699
  end
668
700
  end
669
701
 
670
- # Rubygems 1.8.0 to 1.8.4
702
+ # RubyGems 1.8.0 to 1.8.4
671
703
  class AlmostModern < Modern
672
- # Rubygems [>= 1.8.0, < 1.8.5] has a bug that changes Gem.dir whenever
704
+ # RubyGems [>= 1.8.0, < 1.8.5] has a bug that changes Gem.dir whenever
673
705
  # you call Gem::Installer#install with an :install_dir set. We have to
674
706
  # change it back for our sudo mode to work.
675
707
  def preserve_paths
@@ -680,9 +712,9 @@ module Bundler
680
712
  end
681
713
  end
682
714
 
683
- # Rubygems 1.8.20+
715
+ # RubyGems 1.8.20+
684
716
  class MoreModern < Modern
685
- # Rubygems 1.8.20 and adds the skip_validation parameter, so that's
717
+ # RubyGems 1.8.20 and adds the skip_validation parameter, so that's
686
718
  # when we start passing it through.
687
719
  def build(spec, skip_validation = false)
688
720
  require "rubygems/builder"
@@ -690,7 +722,7 @@ module Bundler
690
722
  end
691
723
  end
692
724
 
693
- # Rubygems 2.0
725
+ # RubyGems 2.0
694
726
  class Future < RubygemsIntegration
695
727
  def stub_rubygems(specs)
696
728
  Gem::Specification.all = specs
@@ -736,7 +768,9 @@ module Bundler
736
768
  uri = Bundler.settings.mirror_for(uri)
737
769
  fetcher = gem_remote_fetcher
738
770
  fetcher.headers = { "X-Gemfile-Source" => spec.remote.original_uri.to_s } if spec.remote.original_uri
739
- fetcher.download(spec, uri, path)
771
+ Bundler::Retry.new("download gem from #{uri}").attempts do
772
+ fetcher.download(spec, uri, path)
773
+ end
740
774
  end
741
775
 
742
776
  def gem_remote_fetcher
@@ -765,6 +799,10 @@ module Bundler
765
799
  def install_with_build_args(args)
766
800
  yield
767
801
  end
802
+
803
+ def path_separator
804
+ Gem.path_separator
805
+ end
768
806
  end
769
807
 
770
808
  # RubyGems 2.1.0
@@ -814,6 +852,7 @@ module Bundler
814
852
 
815
853
  def use_gemdeps(gemfile)
816
854
  ENV["BUNDLE_GEMFILE"] ||= File.expand_path(gemfile)
855
+ require "bundler/gemdeps"
817
856
  runtime = Bundler.setup
818
857
  Bundler.ui = nil
819
858
  activated_spec_names = runtime.requested_specs.map(&:to_spec).sort_by(&:name)
@@ -852,7 +891,7 @@ module Bundler
852
891
  RubygemsIntegration::Transitional.new
853
892
  elsif RubygemsIntegration.provides?(">= 1.4.0")
854
893
  RubygemsIntegration::Legacy.new
855
- else # Rubygems 1.3.6 and 1.3.7
894
+ else # RubyGems 1.3.6 and 1.3.7
856
895
  RubygemsIntegration::Ancient.new
857
896
  end
858
897
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- require "digest/sha1"
3
2
 
4
3
  module Bundler
5
4
  class Runtime
@@ -11,7 +10,7 @@ module Bundler
11
10
  end
12
11
 
13
12
  def setup(*groups)
14
- @definition.ensure_equivalent_gemfile_and_lockfile if Bundler.settings[:frozen]
13
+ @definition.ensure_equivalent_gemfile_and_lockfile if Bundler.frozen_bundle?
15
14
 
16
15
  groups.map!(&:to_sym)
17
16
 
@@ -80,7 +79,7 @@ module Bundler
80
79
  required_file = file
81
80
  begin
82
81
  Kernel.require file
83
- rescue => e
82
+ rescue RuntimeError => e
84
83
  raise e if e.is_a?(LoadError) # we handle this a little later
85
84
  raise Bundler::GemRequireError.new e,
86
85
  "There was an error while trying to load the gem '#{file}'."
@@ -164,6 +163,7 @@ module Bundler
164
163
  gem_dirs = Dir["#{Gem.dir}/gems/*"]
165
164
  gem_files = Dir["#{Gem.dir}/cache/*.gem"]
166
165
  gemspec_files = Dir["#{Gem.dir}/specifications/*.gemspec"]
166
+ extension_dirs = Dir["#{Gem.dir}/extensions/*/*/*"]
167
167
  spec_gem_paths = []
168
168
  # need to keep git sources around
169
169
  spec_git_paths = @definition.spec_git_paths
@@ -171,6 +171,7 @@ module Bundler
171
171
  spec_gem_executables = []
172
172
  spec_cache_paths = []
173
173
  spec_gemspec_paths = []
174
+ spec_extension_paths = []
174
175
  specs.each do |spec|
175
176
  spec_gem_paths << spec.full_gem_path
176
177
  # need to check here in case gems are nested like for the rails git repo
@@ -182,6 +183,7 @@ module Bundler
182
183
  end
183
184
  spec_cache_paths << spec.cache_file
184
185
  spec_gemspec_paths << spec.spec_file
186
+ spec_extension_paths << spec.extension_dir if spec.respond_to?(:extension_dir)
185
187
  spec_git_cache_dirs << spec.source.cache_path.to_s if spec.source.is_a?(Bundler::Source::Git)
186
188
  end
187
189
  spec_gem_paths.uniq!
@@ -193,6 +195,7 @@ module Bundler
193
195
  stale_gem_dirs = gem_dirs - spec_gem_paths
194
196
  stale_gem_files = gem_files - spec_cache_paths
195
197
  stale_gemspec_files = gemspec_files - spec_gemspec_paths
198
+ stale_extension_dirs = extension_dirs - spec_extension_paths
196
199
 
197
200
  removed_stale_gem_dirs = stale_gem_dirs.collect {|dir| remove_dir(dir, dry_run) }
198
201
  removed_stale_git_dirs = stale_git_dirs.collect {|dir| remove_dir(dir, dry_run) }
@@ -205,8 +208,10 @@ module Bundler
205
208
  FileUtils.rm(file) if File.exist?(file)
206
209
  end
207
210
  end
208
- stale_git_cache_dirs.each do |cache_dir|
209
- SharedHelpers.filesystem_access(cache_dir) do |dir|
211
+
212
+ stale_dirs = stale_git_cache_dirs + stale_extension_dirs
213
+ stale_dirs.each do |stale_dir|
214
+ SharedHelpers.filesystem_access(stale_dir) do |dir|
210
215
  FileUtils.rm_rf(dir) if File.exist?(dir)
211
216
  end
212
217
  end
@@ -262,9 +267,6 @@ module Bundler
262
267
  end
263
268
 
264
269
  def setup_manpath
265
- # Store original MANPATH for restoration later in with_clean_env()
266
- ENV["BUNDLER_ORIG_MANPATH"] = ENV["MANPATH"]
267
-
268
270
  # Add man/ subdirectories from activated bundles to MANPATH for man(1)
269
271
  manuals = $LOAD_PATH.map do |path|
270
272
  man_subdir = path.sub(/lib$/, "man")
@@ -272,7 +274,7 @@ module Bundler
272
274
  end.compact
273
275
 
274
276
  return if manuals.empty?
275
- ENV["MANPATH"] = manuals.concat(
277
+ Bundler::SharedHelpers.set_env "MANPATH", manuals.concat(
276
278
  ENV["MANPATH"].to_s.split(File::PATH_SEPARATOR)
277
279
  ).uniq.join(File::PATH_SEPARATOR)
278
280
  end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Settings
5
+ class Validator
6
+ class Rule
7
+ attr_reader :description
8
+
9
+ def initialize(keys, description, &validate)
10
+ @keys = keys
11
+ @description = description
12
+ @validate = validate
13
+ end
14
+
15
+ def validate!(key, value, settings)
16
+ instance_exec(key, value, settings, &@validate)
17
+ end
18
+
19
+ def fail!(key, value, *reasons)
20
+ reasons.unshift @description
21
+ raise InvalidOption, "Setting `#{key}` to #{value.inspect} failed:\n#{reasons.map {|r| " - #{r}" }.join("\n")}"
22
+ end
23
+
24
+ def set(settings, key, value, *reasons)
25
+ hash_key = k(key)
26
+ return if settings[hash_key] == value
27
+ reasons.unshift @description
28
+ Bundler.ui.info "Setting `#{key}` to #{value.inspect}, since #{reasons.join(", ")}"
29
+ if value.nil?
30
+ settings.delete(hash_key)
31
+ else
32
+ settings[hash_key] = value
33
+ end
34
+ end
35
+
36
+ def k(key)
37
+ Bundler.settings.key_for(key)
38
+ end
39
+ end
40
+
41
+ def self.rules
42
+ @rules ||= Hash.new {|h, k| h[k] = [] }
43
+ end
44
+ private_class_method :rules
45
+
46
+ def self.rule(keys, description, &blk)
47
+ rule = Rule.new(keys, description, &blk)
48
+ keys.each {|k| rules[k] << rule }
49
+ end
50
+ private_class_method :rule
51
+
52
+ def self.validate!(key, value, settings)
53
+ rules_to_validate = rules[key]
54
+ rules_to_validate.each {|rule| rule.validate!(key, value, settings) }
55
+ end
56
+
57
+ rule %w[path path.system], "path and path.system are mutually exclusive" do |key, value, settings|
58
+ if key == "path" && value
59
+ set(settings, "path.system", nil)
60
+ elsif key == "path.system" && value
61
+ set(settings, :path, nil)
62
+ end
63
+ end
64
+
65
+ rule %w[with without], "a group cannot be in both `with` & `without` simultaneously" do |key, value, settings|
66
+ with = settings.fetch(k(:with), "").split(":").map(&:to_sym)
67
+ without = settings.fetch(k(:without), "").split(":").map(&:to_sym)
68
+
69
+ other_key = key == "with" ? :without : :with
70
+ other_setting = key == "with" ? without : with
71
+
72
+ conflicting = with & without
73
+ if conflicting.any?
74
+ fail!(key, value, "`#{other_key}` is current set to #{other_setting.inspect}", "the `#{conflicting.join("`, `")}` groups conflict")
75
+ end
76
+ end
77
+
78
+ rule %w[path], "relative paths are expanded relative to the current working directory" do |key, value, settings|
79
+ next if value.nil?
80
+
81
+ path = Pathname.new(value)
82
+ next if !path.relative? || !Bundler.feature_flag.path_relative_to_cwd?
83
+
84
+ path = path.expand_path
85
+
86
+ root = begin
87
+ Bundler.root
88
+ rescue GemfileNotFound
89
+ Pathname.pwd.expand_path
90
+ end
91
+
92
+ path = begin
93
+ path.relative_path_from(root)
94
+ rescue ArgumentError
95
+ path
96
+ end
97
+
98
+ set(settings, key, path.to_s)
99
+ end
100
+ end
101
+ end
102
+ end