bundler 2.0.2

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 (303) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3111 -0
  3. data/LICENSE.md +23 -0
  4. data/README.md +63 -0
  5. data/bundler.gemspec +65 -0
  6. data/exe/bundle +31 -0
  7. data/exe/bundle_ruby +60 -0
  8. data/exe/bundler +4 -0
  9. data/lib/bundler.rb +567 -0
  10. data/lib/bundler/build_metadata.rb +53 -0
  11. data/lib/bundler/capistrano.rb +22 -0
  12. data/lib/bundler/cli.rb +792 -0
  13. data/lib/bundler/cli/add.rb +35 -0
  14. data/lib/bundler/cli/binstubs.rb +49 -0
  15. data/lib/bundler/cli/cache.rb +36 -0
  16. data/lib/bundler/cli/check.rb +38 -0
  17. data/lib/bundler/cli/clean.rb +25 -0
  18. data/lib/bundler/cli/common.rb +102 -0
  19. data/lib/bundler/cli/config.rb +119 -0
  20. data/lib/bundler/cli/console.rb +43 -0
  21. data/lib/bundler/cli/doctor.rb +140 -0
  22. data/lib/bundler/cli/exec.rb +105 -0
  23. data/lib/bundler/cli/gem.rb +252 -0
  24. data/lib/bundler/cli/info.rb +50 -0
  25. data/lib/bundler/cli/init.rb +47 -0
  26. data/lib/bundler/cli/inject.rb +60 -0
  27. data/lib/bundler/cli/install.rb +218 -0
  28. data/lib/bundler/cli/issue.rb +40 -0
  29. data/lib/bundler/cli/list.rb +58 -0
  30. data/lib/bundler/cli/lock.rb +63 -0
  31. data/lib/bundler/cli/open.rb +26 -0
  32. data/lib/bundler/cli/outdated.rb +266 -0
  33. data/lib/bundler/cli/package.rb +49 -0
  34. data/lib/bundler/cli/platform.rb +46 -0
  35. data/lib/bundler/cli/plugin.rb +24 -0
  36. data/lib/bundler/cli/pristine.rb +47 -0
  37. data/lib/bundler/cli/remove.rb +18 -0
  38. data/lib/bundler/cli/show.rb +75 -0
  39. data/lib/bundler/cli/update.rb +91 -0
  40. data/lib/bundler/cli/viz.rb +31 -0
  41. data/lib/bundler/compact_index_client.rb +109 -0
  42. data/lib/bundler/compact_index_client/cache.rb +118 -0
  43. data/lib/bundler/compact_index_client/updater.rb +116 -0
  44. data/lib/bundler/compatibility_guard.rb +13 -0
  45. data/lib/bundler/constants.rb +7 -0
  46. data/lib/bundler/current_ruby.rb +94 -0
  47. data/lib/bundler/definition.rb +995 -0
  48. data/lib/bundler/dep_proxy.rb +48 -0
  49. data/lib/bundler/dependency.rb +139 -0
  50. data/lib/bundler/deployment.rb +69 -0
  51. data/lib/bundler/deprecate.rb +44 -0
  52. data/lib/bundler/dsl.rb +615 -0
  53. data/lib/bundler/endpoint_specification.rb +141 -0
  54. data/lib/bundler/env.rb +149 -0
  55. data/lib/bundler/environment_preserver.rb +59 -0
  56. data/lib/bundler/errors.rb +158 -0
  57. data/lib/bundler/feature_flag.rb +75 -0
  58. data/lib/bundler/fetcher.rb +312 -0
  59. data/lib/bundler/fetcher/base.rb +52 -0
  60. data/lib/bundler/fetcher/compact_index.rb +126 -0
  61. data/lib/bundler/fetcher/dependency.rb +82 -0
  62. data/lib/bundler/fetcher/downloader.rb +84 -0
  63. data/lib/bundler/fetcher/index.rb +52 -0
  64. data/lib/bundler/friendly_errors.rb +131 -0
  65. data/lib/bundler/gem_helper.rb +217 -0
  66. data/lib/bundler/gem_helpers.rb +101 -0
  67. data/lib/bundler/gem_remote_fetcher.rb +43 -0
  68. data/lib/bundler/gem_tasks.rb +7 -0
  69. data/lib/bundler/gem_version_promoter.rb +190 -0
  70. data/lib/bundler/gemdeps.rb +29 -0
  71. data/lib/bundler/graph.rb +152 -0
  72. data/lib/bundler/index.rb +213 -0
  73. data/lib/bundler/injector.rb +253 -0
  74. data/lib/bundler/inline.rb +74 -0
  75. data/lib/bundler/installer.rb +318 -0
  76. data/lib/bundler/installer/gem_installer.rb +85 -0
  77. data/lib/bundler/installer/parallel_installer.rb +229 -0
  78. data/lib/bundler/installer/standalone.rb +53 -0
  79. data/lib/bundler/lazy_specification.rb +123 -0
  80. data/lib/bundler/lockfile_generator.rb +95 -0
  81. data/lib/bundler/lockfile_parser.rb +256 -0
  82. data/lib/bundler/match_platform.rb +24 -0
  83. data/lib/bundler/mirror.rb +223 -0
  84. data/lib/bundler/plugin.rb +294 -0
  85. data/lib/bundler/plugin/api.rb +81 -0
  86. data/lib/bundler/plugin/api/source.rb +306 -0
  87. data/lib/bundler/plugin/dsl.rb +53 -0
  88. data/lib/bundler/plugin/events.rb +61 -0
  89. data/lib/bundler/plugin/index.rb +165 -0
  90. data/lib/bundler/plugin/installer.rb +96 -0
  91. data/lib/bundler/plugin/installer/git.rb +38 -0
  92. data/lib/bundler/plugin/installer/rubygems.rb +27 -0
  93. data/lib/bundler/plugin/source_list.rb +27 -0
  94. data/lib/bundler/process_lock.rb +24 -0
  95. data/lib/bundler/psyched_yaml.rb +37 -0
  96. data/lib/bundler/remote_specification.rb +114 -0
  97. data/lib/bundler/resolver.rb +373 -0
  98. data/lib/bundler/resolver/spec_group.rb +106 -0
  99. data/lib/bundler/retry.rb +66 -0
  100. data/lib/bundler/ruby_dsl.rb +18 -0
  101. data/lib/bundler/ruby_version.rb +152 -0
  102. data/lib/bundler/rubygems_ext.rb +209 -0
  103. data/lib/bundler/rubygems_gem_installer.rb +99 -0
  104. data/lib/bundler/rubygems_integration.rb +915 -0
  105. data/lib/bundler/runtime.rb +322 -0
  106. data/lib/bundler/settings.rb +464 -0
  107. data/lib/bundler/settings/validator.rb +102 -0
  108. data/lib/bundler/setup.rb +28 -0
  109. data/lib/bundler/shared_helpers.rb +386 -0
  110. data/lib/bundler/similarity_detector.rb +63 -0
  111. data/lib/bundler/source.rb +94 -0
  112. data/lib/bundler/source/gemspec.rb +18 -0
  113. data/lib/bundler/source/git.rb +329 -0
  114. data/lib/bundler/source/git/git_proxy.rb +262 -0
  115. data/lib/bundler/source/metadata.rb +62 -0
  116. data/lib/bundler/source/path.rb +249 -0
  117. data/lib/bundler/source/path/installer.rb +74 -0
  118. data/lib/bundler/source/rubygems.rb +539 -0
  119. data/lib/bundler/source/rubygems/remote.rb +69 -0
  120. data/lib/bundler/source_list.rb +186 -0
  121. data/lib/bundler/spec_set.rb +208 -0
  122. data/lib/bundler/ssl_certs/.document +1 -0
  123. data/lib/bundler/ssl_certs/certificate_manager.rb +66 -0
  124. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +21 -0
  125. data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +23 -0
  126. data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +25 -0
  127. data/lib/bundler/stub_specification.rb +108 -0
  128. data/lib/bundler/templates/.document +1 -0
  129. data/lib/bundler/templates/Executable +29 -0
  130. data/lib/bundler/templates/Executable.bundler +105 -0
  131. data/lib/bundler/templates/Executable.standalone +14 -0
  132. data/lib/bundler/templates/Gemfile +7 -0
  133. data/lib/bundler/templates/gems.rb +8 -0
  134. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +74 -0
  135. data/lib/bundler/templates/newgem/Gemfile.tt +4 -0
  136. data/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
  137. data/lib/bundler/templates/newgem/README.md.tt +47 -0
  138. data/lib/bundler/templates/newgem/Rakefile.tt +29 -0
  139. data/lib/bundler/templates/newgem/bin/console.tt +14 -0
  140. data/lib/bundler/templates/newgem/bin/setup.tt +8 -0
  141. data/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
  142. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +3 -0
  143. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
  144. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
  145. data/lib/bundler/templates/newgem/gitignore.tt +20 -0
  146. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +13 -0
  147. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +7 -0
  148. data/lib/bundler/templates/newgem/newgem.gemspec.tt +50 -0
  149. data/lib/bundler/templates/newgem/rspec.tt +3 -0
  150. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +9 -0
  151. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +14 -0
  152. data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +11 -0
  153. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +8 -0
  154. data/lib/bundler/templates/newgem/travis.yml.tt +7 -0
  155. data/lib/bundler/ui.rb +9 -0
  156. data/lib/bundler/ui/rg_proxy.rb +19 -0
  157. data/lib/bundler/ui/shell.rb +146 -0
  158. data/lib/bundler/ui/silent.rb +69 -0
  159. data/lib/bundler/uri_credentials_filter.rb +37 -0
  160. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1741 -0
  161. data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +5 -0
  162. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +12 -0
  163. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  164. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +223 -0
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
  173. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
  174. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
  175. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +136 -0
  176. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +143 -0
  177. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  178. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +101 -0
  179. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +67 -0
  180. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +837 -0
  181. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +46 -0
  182. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +58 -0
  183. data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +27 -0
  184. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1233 -0
  185. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +129 -0
  186. data/lib/bundler/vendor/thor/lib/thor.rb +509 -0
  187. data/lib/bundler/vendor/thor/lib/thor/actions.rb +331 -0
  188. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +104 -0
  189. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +60 -0
  190. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +118 -0
  191. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
  192. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +373 -0
  193. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +109 -0
  194. data/lib/bundler/vendor/thor/lib/thor/base.rb +678 -0
  195. data/lib/bundler/vendor/thor/lib/thor/command.rb +135 -0
  196. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +97 -0
  197. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
  198. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +129 -0
  199. data/lib/bundler/vendor/thor/lib/thor/error.rb +114 -0
  200. data/lib/bundler/vendor/thor/lib/thor/group.rb +281 -0
  201. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +177 -0
  202. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
  203. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
  204. data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
  205. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
  206. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +70 -0
  207. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +175 -0
  208. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +146 -0
  209. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +226 -0
  210. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +71 -0
  211. data/lib/bundler/vendor/thor/lib/thor/runner.rb +324 -0
  212. data/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
  213. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +482 -0
  214. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +149 -0
  215. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +126 -0
  216. data/lib/bundler/vendor/thor/lib/thor/util.rb +268 -0
  217. data/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
  218. data/lib/bundler/vendored_fileutils.rb +9 -0
  219. data/lib/bundler/vendored_molinillo.rb +4 -0
  220. data/lib/bundler/vendored_persistent.rb +52 -0
  221. data/lib/bundler/vendored_thor.rb +8 -0
  222. data/lib/bundler/version.rb +28 -0
  223. data/lib/bundler/version_ranges.rb +76 -0
  224. data/lib/bundler/vlad.rb +17 -0
  225. data/lib/bundler/worker.rb +106 -0
  226. data/lib/bundler/yaml_serializer.rb +90 -0
  227. data/man/bundle-add.1 +58 -0
  228. data/man/bundle-add.1.txt +52 -0
  229. data/man/bundle-add.ronn +40 -0
  230. data/man/bundle-binstubs.1 +40 -0
  231. data/man/bundle-binstubs.1.txt +48 -0
  232. data/man/bundle-binstubs.ronn +43 -0
  233. data/man/bundle-check.1 +31 -0
  234. data/man/bundle-check.1.txt +33 -0
  235. data/man/bundle-check.ronn +26 -0
  236. data/man/bundle-clean.1 +24 -0
  237. data/man/bundle-clean.1.txt +26 -0
  238. data/man/bundle-clean.ronn +18 -0
  239. data/man/bundle-config.1 +497 -0
  240. data/man/bundle-config.1.txt +529 -0
  241. data/man/bundle-config.ronn +397 -0
  242. data/man/bundle-doctor.1 +44 -0
  243. data/man/bundle-doctor.1.txt +44 -0
  244. data/man/bundle-doctor.ronn +33 -0
  245. data/man/bundle-exec.1 +165 -0
  246. data/man/bundle-exec.1.txt +178 -0
  247. data/man/bundle-exec.ronn +152 -0
  248. data/man/bundle-gem.1 +80 -0
  249. data/man/bundle-gem.1.txt +91 -0
  250. data/man/bundle-gem.ronn +78 -0
  251. data/man/bundle-info.1 +20 -0
  252. data/man/bundle-info.1.txt +21 -0
  253. data/man/bundle-info.ronn +17 -0
  254. data/man/bundle-init.1 +25 -0
  255. data/man/bundle-init.1.txt +34 -0
  256. data/man/bundle-init.ronn +29 -0
  257. data/man/bundle-inject.1 +33 -0
  258. data/man/bundle-inject.1.txt +32 -0
  259. data/man/bundle-inject.ronn +22 -0
  260. data/man/bundle-install.1 +308 -0
  261. data/man/bundle-install.1.txt +396 -0
  262. data/man/bundle-install.ronn +378 -0
  263. data/man/bundle-list.1 +50 -0
  264. data/man/bundle-list.1.txt +43 -0
  265. data/man/bundle-list.ronn +33 -0
  266. data/man/bundle-lock.1 +84 -0
  267. data/man/bundle-lock.1.txt +93 -0
  268. data/man/bundle-lock.ronn +94 -0
  269. data/man/bundle-open.1 +32 -0
  270. data/man/bundle-open.1.txt +29 -0
  271. data/man/bundle-open.ronn +19 -0
  272. data/man/bundle-outdated.1 +155 -0
  273. data/man/bundle-outdated.1.txt +131 -0
  274. data/man/bundle-outdated.ronn +111 -0
  275. data/man/bundle-package.1 +55 -0
  276. data/man/bundle-package.1.txt +79 -0
  277. data/man/bundle-package.ronn +72 -0
  278. data/man/bundle-platform.1 +61 -0
  279. data/man/bundle-platform.1.txt +57 -0
  280. data/man/bundle-platform.ronn +42 -0
  281. data/man/bundle-pristine.1 +34 -0
  282. data/man/bundle-pristine.1.txt +44 -0
  283. data/man/bundle-pristine.ronn +34 -0
  284. data/man/bundle-remove.1 +31 -0
  285. data/man/bundle-remove.1.txt +34 -0
  286. data/man/bundle-remove.ronn +23 -0
  287. data/man/bundle-show.1 +23 -0
  288. data/man/bundle-show.1.txt +27 -0
  289. data/man/bundle-show.ronn +21 -0
  290. data/man/bundle-update.1 +394 -0
  291. data/man/bundle-update.1.txt +391 -0
  292. data/man/bundle-update.ronn +350 -0
  293. data/man/bundle-viz.1 +39 -0
  294. data/man/bundle-viz.1.txt +39 -0
  295. data/man/bundle-viz.ronn +30 -0
  296. data/man/bundle.1 +136 -0
  297. data/man/bundle.1.txt +116 -0
  298. data/man/bundle.ronn +111 -0
  299. data/man/gemfile.5 +689 -0
  300. data/man/gemfile.5.ronn +521 -0
  301. data/man/gemfile.5.txt +653 -0
  302. data/man/index.txt +25 -0
  303. metadata +463 -0
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Source
5
+ class Rubygems
6
+ class Remote
7
+ attr_reader :uri, :anonymized_uri, :original_uri
8
+
9
+ def initialize(uri)
10
+ orig_uri = uri
11
+ uri = Bundler.settings.mirror_for(uri)
12
+ @original_uri = orig_uri if orig_uri != uri
13
+ fallback_auth = Bundler.settings.credentials_for(uri)
14
+
15
+ @uri = apply_auth(uri, fallback_auth).freeze
16
+ @anonymized_uri = remove_auth(@uri).freeze
17
+ end
18
+
19
+ # @return [String] A slug suitable for use as a cache key for this
20
+ # remote.
21
+ #
22
+ def cache_slug
23
+ @cache_slug ||= begin
24
+ return nil unless SharedHelpers.md5_available?
25
+
26
+ cache_uri = original_uri || uri
27
+
28
+ # URI::File of Ruby 2.6 returns empty string when given "file://".
29
+ host = defined?(URI::File) && cache_uri.is_a?(URI::File) ? nil : cache_uri.host
30
+
31
+ uri_parts = [host, cache_uri.user, cache_uri.port, cache_uri.path]
32
+ uri_digest = SharedHelpers.digest(:MD5).hexdigest(uri_parts.compact.join("."))
33
+
34
+ uri_parts[-1] = uri_digest
35
+ uri_parts.compact.join(".")
36
+ end
37
+ end
38
+
39
+ def to_s
40
+ "rubygems remote at #{anonymized_uri}"
41
+ end
42
+
43
+ private
44
+
45
+ def apply_auth(uri, auth)
46
+ if auth && uri.userinfo.nil?
47
+ uri = uri.dup
48
+ uri.userinfo = auth
49
+ end
50
+
51
+ uri
52
+ rescue URI::InvalidComponentError
53
+ error_message = "Please CGI escape your usernames and passwords before " \
54
+ "setting them for authentication."
55
+ raise HTTPError.new(error_message)
56
+ end
57
+
58
+ def remove_auth(uri)
59
+ if uri.userinfo
60
+ uri = uri.dup
61
+ uri.user = uri.password = nil
62
+ end
63
+
64
+ uri
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,186 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class SourceList
5
+ attr_reader :path_sources,
6
+ :git_sources,
7
+ :plugin_sources,
8
+ :global_rubygems_source,
9
+ :metadata_source
10
+
11
+ def initialize
12
+ @path_sources = []
13
+ @git_sources = []
14
+ @plugin_sources = []
15
+ @global_rubygems_source = nil
16
+ @rubygems_aggregate = rubygems_aggregate_class.new
17
+ @rubygems_sources = []
18
+ @metadata_source = Source::Metadata.new
19
+ end
20
+
21
+ def add_path_source(options = {})
22
+ if options["gemspec"]
23
+ add_source_to_list Source::Gemspec.new(options), path_sources
24
+ else
25
+ add_source_to_list Source::Path.new(options), path_sources
26
+ end
27
+ end
28
+
29
+ def add_git_source(options = {})
30
+ add_source_to_list(Source::Git.new(options), git_sources).tap do |source|
31
+ warn_on_git_protocol(source)
32
+ end
33
+ end
34
+
35
+ def add_rubygems_source(options = {})
36
+ add_source_to_list Source::Rubygems.new(options), @rubygems_sources
37
+ end
38
+
39
+ def add_plugin_source(source, options = {})
40
+ add_source_to_list Plugin.source(source).new(options), @plugin_sources
41
+ end
42
+
43
+ def global_rubygems_source=(uri)
44
+ if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
45
+ @global_rubygems_source ||= rubygems_aggregate_class.new("remotes" => uri)
46
+ end
47
+ add_rubygems_remote(uri)
48
+ end
49
+
50
+ def add_rubygems_remote(uri)
51
+ if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
52
+ return if Bundler.feature_flag.disable_multisource?
53
+ raise InvalidOption, "`lockfile_uses_separate_rubygems_sources` cannot be set without `disable_multisource` being set"
54
+ end
55
+ @rubygems_aggregate.add_remote(uri)
56
+ @rubygems_aggregate
57
+ end
58
+
59
+ def default_source
60
+ global_rubygems_source || @rubygems_aggregate
61
+ end
62
+
63
+ def rubygems_sources
64
+ @rubygems_sources + [default_source]
65
+ end
66
+
67
+ def rubygems_remotes
68
+ rubygems_sources.map(&:remotes).flatten.uniq
69
+ end
70
+
71
+ def all_sources
72
+ path_sources + git_sources + plugin_sources + rubygems_sources + [metadata_source]
73
+ end
74
+
75
+ def get(source)
76
+ source_list_for(source).find {|s| equal_source?(source, s) || equivalent_source?(source, s) }
77
+ end
78
+
79
+ def lock_sources
80
+ if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
81
+ [[default_source], @rubygems_sources, git_sources, path_sources, plugin_sources].map do |sources|
82
+ sources.sort_by(&:to_s)
83
+ end.flatten(1)
84
+ else
85
+ lock_sources = (path_sources + git_sources + plugin_sources).sort_by(&:to_s)
86
+ lock_sources << combine_rubygems_sources
87
+ end
88
+ end
89
+
90
+ # Returns true if there are changes
91
+ def replace_sources!(replacement_sources)
92
+ return true if replacement_sources.empty?
93
+
94
+ [path_sources, git_sources, plugin_sources].each do |source_list|
95
+ source_list.map! do |source|
96
+ replacement_sources.find {|s| s == source } || source
97
+ end
98
+ end
99
+
100
+ replacement_rubygems = !Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? &&
101
+ replacement_sources.detect {|s| s.is_a?(Source::Rubygems) }
102
+ @rubygems_aggregate = replacement_rubygems if replacement_rubygems
103
+
104
+ return true if !equal_sources?(lock_sources, replacement_sources) && !equivalent_sources?(lock_sources, replacement_sources)
105
+ return true if replacement_rubygems && rubygems_remotes.to_set != replacement_rubygems.remotes.to_set
106
+
107
+ false
108
+ end
109
+
110
+ def cached!
111
+ all_sources.each(&:cached!)
112
+ end
113
+
114
+ def remote!
115
+ all_sources.each(&:remote!)
116
+ end
117
+
118
+ def rubygems_primary_remotes
119
+ @rubygems_aggregate.remotes
120
+ end
121
+
122
+ private
123
+
124
+ def rubygems_aggregate_class
125
+ Source::Rubygems
126
+ end
127
+
128
+ def add_source_to_list(source, list)
129
+ list.unshift(source).uniq!
130
+ source
131
+ end
132
+
133
+ def source_list_for(source)
134
+ case source
135
+ when Source::Git then git_sources
136
+ when Source::Path then path_sources
137
+ when Source::Rubygems then rubygems_sources
138
+ when Plugin::API::Source then plugin_sources
139
+ else raise ArgumentError, "Invalid source: #{source.inspect}"
140
+ end
141
+ end
142
+
143
+ def combine_rubygems_sources
144
+ Source::Rubygems.new("remotes" => rubygems_remotes)
145
+ end
146
+
147
+ def warn_on_git_protocol(source)
148
+ return if Bundler.settings["git.allow_insecure"]
149
+
150
+ if source.uri =~ /^git\:/
151
+ Bundler.ui.warn "The git source `#{source.uri}` uses the `git` protocol, " \
152
+ "which transmits data without encryption. Disable this warning with " \
153
+ "`bundle config git.allow_insecure true`, or switch to the `https` " \
154
+ "protocol to keep your data secure."
155
+ end
156
+ end
157
+
158
+ def equal_sources?(lock_sources, replacement_sources)
159
+ lock_sources.to_set == replacement_sources.to_set
160
+ end
161
+
162
+ def equal_source?(source, other_source)
163
+ source == other_source
164
+ end
165
+
166
+ def equivalent_source?(source, other_source)
167
+ return false unless Bundler.settings[:allow_deployment_source_credential_changes] && source.is_a?(Source::Rubygems)
168
+
169
+ equivalent_rubygems_sources?([source], [other_source])
170
+ end
171
+
172
+ def equivalent_sources?(lock_sources, replacement_sources)
173
+ return false unless Bundler.settings[:allow_deployment_source_credential_changes]
174
+
175
+ lock_rubygems_sources, lock_other_sources = lock_sources.partition {|s| s.is_a?(Source::Rubygems) }
176
+ replacement_rubygems_sources, replacement_other_sources = replacement_sources.partition {|s| s.is_a?(Source::Rubygems) }
177
+
178
+ equivalent_rubygems_sources?(lock_rubygems_sources, replacement_rubygems_sources) && equal_sources?(lock_other_sources, replacement_other_sources)
179
+ end
180
+
181
+ def equivalent_rubygems_sources?(lock_sources, replacement_sources)
182
+ actual_remotes = replacement_sources.map(&:remotes).flatten.uniq
183
+ lock_sources.all? {|s| s.equivalent_remotes?(actual_remotes) }
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,208 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tsort"
4
+ require "set"
5
+
6
+ module Bundler
7
+ class SpecSet
8
+ include Enumerable
9
+ include TSort
10
+
11
+ def initialize(specs)
12
+ @specs = specs
13
+ end
14
+
15
+ def for(dependencies, skip = [], check = false, match_current_platform = false, raise_on_missing = true)
16
+ handled = Set.new
17
+ deps = dependencies.dup
18
+ specs = []
19
+ skip += ["bundler"]
20
+
21
+ loop do
22
+ break unless dep = deps.shift
23
+ next if !handled.add?(dep) || skip.include?(dep.name)
24
+
25
+ if spec = spec_for_dependency(dep, match_current_platform)
26
+ specs << spec
27
+
28
+ spec.dependencies.each do |d|
29
+ next if d.type == :development
30
+ d = DepProxy.new(d, dep.__platform) unless match_current_platform
31
+ deps << d
32
+ end
33
+ elsif check
34
+ return false
35
+ elsif raise_on_missing
36
+ others = lookup[dep.name] if match_current_platform
37
+ message = "Unable to find a spec satisfying #{dep} in the set. Perhaps the lockfile is corrupted?"
38
+ message += " Found #{others.join(", ")} that did not match the current platform." if others && !others.empty?
39
+ raise GemNotFound, message
40
+ end
41
+ end
42
+
43
+ if spec = lookup["bundler"].first
44
+ specs << spec
45
+ end
46
+
47
+ check ? true : SpecSet.new(specs)
48
+ end
49
+
50
+ def valid_for?(deps)
51
+ self.for(deps, [], true)
52
+ end
53
+
54
+ def [](key)
55
+ key = key.name if key.respond_to?(:name)
56
+ lookup[key].reverse
57
+ end
58
+
59
+ def []=(key, value)
60
+ @specs << value
61
+ @lookup = nil
62
+ @sorted = nil
63
+ value
64
+ end
65
+
66
+ def sort!
67
+ self
68
+ end
69
+
70
+ def to_a
71
+ sorted.dup
72
+ end
73
+
74
+ def to_hash
75
+ lookup.dup
76
+ end
77
+
78
+ def materialize(deps, missing_specs = nil)
79
+ materialized = self.for(deps, [], false, true, !missing_specs).to_a
80
+ deps = materialized.map(&:name).uniq
81
+ materialized.map! do |s|
82
+ next s unless s.is_a?(LazySpecification)
83
+ s.source.dependency_names = deps if s.source.respond_to?(:dependency_names=)
84
+ spec = s.__materialize__
85
+ unless spec
86
+ unless missing_specs
87
+ raise GemNotFound, "Could not find #{s.full_name} in any of the sources"
88
+ end
89
+ missing_specs << s
90
+ end
91
+ spec
92
+ end
93
+ SpecSet.new(missing_specs ? materialized.compact : materialized)
94
+ end
95
+
96
+ # Materialize for all the specs in the spec set, regardless of what platform they're for
97
+ # This is in contrast to how for does platform filtering (and specifically different from how `materialize` calls `for` only for the current platform)
98
+ # @return [Array<Gem::Specification>]
99
+ def materialized_for_all_platforms
100
+ names = @specs.map(&:name).uniq
101
+ @specs.map do |s|
102
+ next s unless s.is_a?(LazySpecification)
103
+ s.source.dependency_names = names if s.source.respond_to?(:dependency_names=)
104
+ spec = s.__materialize__
105
+ raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
106
+ spec
107
+ end
108
+ end
109
+
110
+ def merge(set)
111
+ arr = sorted.dup
112
+ set.each do |set_spec|
113
+ full_name = set_spec.full_name
114
+ next if arr.any? {|spec| spec.full_name == full_name }
115
+ arr << set_spec
116
+ end
117
+ SpecSet.new(arr)
118
+ end
119
+
120
+ def find_by_name_and_platform(name, platform)
121
+ @specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
122
+ end
123
+
124
+ def what_required(spec)
125
+ unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } }
126
+ return [spec]
127
+ end
128
+ what_required(req) << spec
129
+ end
130
+
131
+ def <<(spec)
132
+ @specs << spec
133
+ end
134
+
135
+ def length
136
+ @specs.length
137
+ end
138
+
139
+ def size
140
+ @specs.size
141
+ end
142
+
143
+ def empty?
144
+ @specs.empty?
145
+ end
146
+
147
+ def each(&b)
148
+ sorted.each(&b)
149
+ end
150
+
151
+ private
152
+
153
+ def sorted
154
+ rake = @specs.find {|s| s.name == "rake" }
155
+ begin
156
+ @sorted ||= ([rake] + tsort).compact.uniq
157
+ rescue TSort::Cyclic => error
158
+ cgems = extract_circular_gems(error)
159
+ raise CyclicDependencyError, "Your bundle requires gems that depend" \
160
+ " on each other, creating an infinite loop. Please remove either" \
161
+ " gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again."
162
+ end
163
+ end
164
+
165
+ def extract_circular_gems(error)
166
+ if Bundler.current_ruby.mri? && Bundler.current_ruby.on_19?
167
+ error.message.scan(/(\w+) \([^)]/).flatten
168
+ else
169
+ error.message.scan(/@name="(.*?)"/).flatten
170
+ end
171
+ end
172
+
173
+ def lookup
174
+ @lookup ||= begin
175
+ lookup = Hash.new {|h, k| h[k] = [] }
176
+ Index.sort_specs(@specs).reverse_each do |s|
177
+ lookup[s.name] << s
178
+ end
179
+ lookup
180
+ end
181
+ end
182
+
183
+ def tsort_each_node
184
+ # MUST sort by name for backwards compatibility
185
+ @specs.sort_by(&:name).each {|s| yield s }
186
+ end
187
+
188
+ def spec_for_dependency(dep, match_current_platform)
189
+ specs_for_platforms = lookup[dep.name]
190
+ if match_current_platform
191
+ Bundler.rubygems.platforms.reverse_each do |pl|
192
+ match = GemHelpers.select_best_platform_match(specs_for_platforms, pl)
193
+ return match if match
194
+ end
195
+ nil
196
+ else
197
+ GemHelpers.select_best_platform_match(specs_for_platforms, dep.__platform)
198
+ end
199
+ end
200
+
201
+ def tsort_each_child(s)
202
+ s.dependencies.sort_by(&:name).each do |d|
203
+ next if d.type == :development
204
+ lookup[d.name].each {|s2| yield s2 }
205
+ end
206
+ end
207
+ end
208
+ end