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,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ module GemHelpers
5
+ GENERIC_CACHE = {} # rubocop:disable MutableConstant
6
+ GENERICS = [
7
+ [Gem::Platform.new("java"), Gem::Platform.new("java")],
8
+ [Gem::Platform.new("mswin32"), Gem::Platform.new("mswin32")],
9
+ [Gem::Platform.new("mswin64"), Gem::Platform.new("mswin64")],
10
+ [Gem::Platform.new("universal-mingw32"), Gem::Platform.new("universal-mingw32")],
11
+ [Gem::Platform.new("x64-mingw32"), Gem::Platform.new("x64-mingw32")],
12
+ [Gem::Platform.new("x86_64-mingw32"), Gem::Platform.new("x64-mingw32")],
13
+ [Gem::Platform.new("mingw32"), Gem::Platform.new("x86-mingw32")]
14
+ ].freeze
15
+
16
+ def generic(p)
17
+ return p if p == Gem::Platform::RUBY
18
+
19
+ GENERIC_CACHE[p] ||= begin
20
+ _, found = GENERICS.find do |match, _generic|
21
+ p.os == match.os && (!match.cpu || p.cpu == match.cpu)
22
+ end
23
+ found || Gem::Platform::RUBY
24
+ end
25
+ end
26
+ module_function :generic
27
+
28
+ def generic_local_platform
29
+ generic(Bundler.local_platform)
30
+ end
31
+ module_function :generic_local_platform
32
+
33
+ def platform_specificity_match(spec_platform, user_platform)
34
+ spec_platform = Gem::Platform.new(spec_platform)
35
+ return PlatformMatch::EXACT_MATCH if spec_platform == user_platform
36
+ return PlatformMatch::WORST_MATCH if spec_platform.nil? || spec_platform == Gem::Platform::RUBY || user_platform == Gem::Platform::RUBY
37
+
38
+ PlatformMatch.new(
39
+ PlatformMatch.os_match(spec_platform, user_platform),
40
+ PlatformMatch.cpu_match(spec_platform, user_platform),
41
+ PlatformMatch.platform_version_match(spec_platform, user_platform)
42
+ )
43
+ end
44
+ module_function :platform_specificity_match
45
+
46
+ def select_best_platform_match(specs, platform)
47
+ specs.select {|spec| spec.match_platform(platform) }.
48
+ min_by {|spec| platform_specificity_match(spec.platform, platform) }
49
+ end
50
+ module_function :select_best_platform_match
51
+
52
+ PlatformMatch = Struct.new(:os_match, :cpu_match, :platform_version_match)
53
+ class PlatformMatch
54
+ def <=>(other)
55
+ return nil unless other.is_a?(PlatformMatch)
56
+
57
+ m = os_match <=> other.os_match
58
+ return m unless m.zero?
59
+
60
+ m = cpu_match <=> other.cpu_match
61
+ return m unless m.zero?
62
+
63
+ m = platform_version_match <=> other.platform_version_match
64
+ m
65
+ end
66
+
67
+ EXACT_MATCH = new(-1, -1, -1).freeze
68
+ WORST_MATCH = new(1_000_000, 1_000_000, 1_000_000).freeze
69
+
70
+ def self.os_match(spec_platform, user_platform)
71
+ if spec_platform.os == user_platform.os
72
+ 0
73
+ else
74
+ 1
75
+ end
76
+ end
77
+
78
+ def self.cpu_match(spec_platform, user_platform)
79
+ if spec_platform.cpu == user_platform.cpu
80
+ 0
81
+ elsif spec_platform.cpu == "arm" && user_platform.cpu.to_s.start_with?("arm")
82
+ 0
83
+ elsif spec_platform.cpu.nil? || spec_platform.cpu == "universal"
84
+ 1
85
+ else
86
+ 2
87
+ end
88
+ end
89
+
90
+ def self.platform_version_match(spec_platform, user_platform)
91
+ if spec_platform.version == user_platform.version
92
+ 0
93
+ elsif spec_platform.version.nil?
94
+ 1
95
+ else
96
+ 2
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rubygems/remote_fetcher"
4
+
5
+ module Bundler
6
+ # Adds support for setting custom HTTP headers when fetching gems from the
7
+ # server.
8
+ #
9
+ # TODO: Get rid of this when and if gemstash only supports RubyGems versions
10
+ # that contain https://github.com/rubygems/rubygems/commit/3db265cc20b2f813.
11
+ class GemRemoteFetcher < Gem::RemoteFetcher
12
+ attr_accessor :headers
13
+
14
+ # Extracted from RubyGems 2.4.
15
+ def fetch_http(uri, last_modified = nil, head = false, depth = 0)
16
+ fetch_type = head ? Net::HTTP::Head : Net::HTTP::Get
17
+ # beginning of change
18
+ response = request uri, fetch_type, last_modified do |req|
19
+ headers.each {|k, v| req.add_field(k, v) } if headers
20
+ end
21
+ # end of change
22
+
23
+ case response
24
+ when Net::HTTPOK, Net::HTTPNotModified then
25
+ response.uri = uri if response.respond_to? :uri
26
+ head ? response : response.body
27
+ when Net::HTTPMovedPermanently, Net::HTTPFound, Net::HTTPSeeOther,
28
+ Net::HTTPTemporaryRedirect then
29
+ raise FetchError.new("too many redirects", uri) if depth > 10
30
+
31
+ location = URI.parse response["Location"]
32
+
33
+ if https?(uri) && !https?(location)
34
+ raise FetchError.new("redirecting to non-https resource: #{location}", uri)
35
+ end
36
+
37
+ fetch_http(location, last_modified, head, depth + 1)
38
+ else
39
+ raise FetchError.new("bad response #{response.message} #{response.code}", uri)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rake/clean"
4
+ CLOBBER.include "pkg"
5
+
6
+ require "bundler/gem_helper"
7
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,190 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ # This class contains all of the logic for determining the next version of a
5
+ # Gem to update to based on the requested level (patch, minor, major).
6
+ # Primarily designed to work with Resolver which will provide it the list of
7
+ # available dependency versions as found in its index, before returning it to
8
+ # to the resolution engine to select the best version.
9
+ class GemVersionPromoter
10
+ DEBUG = ENV["DEBUG_RESOLVER"]
11
+
12
+ attr_reader :level, :locked_specs, :unlock_gems
13
+
14
+ # By default, strict is false, meaning every available version of a gem
15
+ # is returned from sort_versions. The order gives preference to the
16
+ # requested level (:patch, :minor, :major) but in complicated requirement
17
+ # cases some gems will by necessity by promoted past the requested level,
18
+ # or even reverted to older versions.
19
+ #
20
+ # If strict is set to true, the results from sort_versions will be
21
+ # truncated, eliminating any version outside the current level scope.
22
+ # This can lead to unexpected outcomes or even VersionConflict exceptions
23
+ # that report a version of a gem not existing for versions that indeed do
24
+ # existing in the referenced source.
25
+ attr_accessor :strict
26
+
27
+ attr_accessor :prerelease_specified
28
+
29
+ # Given a list of locked_specs and a list of gems to unlock creates a
30
+ # GemVersionPromoter instance.
31
+ #
32
+ # @param locked_specs [SpecSet] All current locked specs. Unlike Definition
33
+ # where this list is empty if all gems are being updated, this should
34
+ # always be populated for all gems so this class can properly function.
35
+ # @param unlock_gems [String] List of gem names being unlocked. If empty,
36
+ # all gems will be considered unlocked.
37
+ # @return [GemVersionPromoter]
38
+ def initialize(locked_specs = SpecSet.new([]), unlock_gems = [])
39
+ @level = :major
40
+ @strict = false
41
+ @locked_specs = locked_specs
42
+ @unlock_gems = unlock_gems
43
+ @sort_versions = {}
44
+ @prerelease_specified = {}
45
+ end
46
+
47
+ # @param value [Symbol] One of three Symbols: :major, :minor or :patch.
48
+ def level=(value)
49
+ v = case value
50
+ when String, Symbol
51
+ value.to_sym
52
+ end
53
+
54
+ raise ArgumentError, "Unexpected level #{v}. Must be :major, :minor or :patch" unless [:major, :minor, :patch].include?(v)
55
+ @level = v
56
+ end
57
+
58
+ # Given a Dependency and an Array of SpecGroups of available versions for a
59
+ # gem, this method will return the Array of SpecGroups sorted (and possibly
60
+ # truncated if strict is true) in an order to give preference to the current
61
+ # level (:major, :minor or :patch) when resolution is deciding what versions
62
+ # best resolve all dependencies in the bundle.
63
+ # @param dep [Dependency] The Dependency of the gem.
64
+ # @param spec_groups [SpecGroup] An array of SpecGroups for the same gem
65
+ # named in the @dep param.
66
+ # @return [SpecGroup] A new instance of the SpecGroup Array sorted and
67
+ # possibly filtered.
68
+ def sort_versions(dep, spec_groups)
69
+ before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if DEBUG
70
+
71
+ @sort_versions[dep] ||= begin
72
+ gem_name = dep.name
73
+
74
+ # An Array per version returned, different entries for different platforms.
75
+ # We only need the version here so it's ok to hard code this to the first instance.
76
+ locked_spec = locked_specs[gem_name].first
77
+
78
+ if strict
79
+ filter_dep_specs(spec_groups, locked_spec)
80
+ else
81
+ sort_dep_specs(spec_groups, locked_spec)
82
+ end.tap do |specs|
83
+ if DEBUG
84
+ STDERR.puts before_result
85
+ STDERR.puts " after sort_versions: #{debug_format_result(dep, specs).inspect}"
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ # @return [bool] Convenience method for testing value of level variable.
92
+ def major?
93
+ level == :major
94
+ end
95
+
96
+ # @return [bool] Convenience method for testing value of level variable.
97
+ def minor?
98
+ level == :minor
99
+ end
100
+
101
+ private
102
+
103
+ def filter_dep_specs(spec_groups, locked_spec)
104
+ res = spec_groups.select do |spec_group|
105
+ if locked_spec && !major?
106
+ gsv = spec_group.version
107
+ lsv = locked_spec.version
108
+
109
+ must_match = minor? ? [0] : [0, 1]
110
+
111
+ matches = must_match.map {|idx| gsv.segments[idx] == lsv.segments[idx] }
112
+ (matches.uniq == [true]) ? (gsv >= lsv) : false
113
+ else
114
+ true
115
+ end
116
+ end
117
+
118
+ sort_dep_specs(res, locked_spec)
119
+ end
120
+
121
+ def sort_dep_specs(spec_groups, locked_spec)
122
+ return spec_groups unless locked_spec
123
+ @gem_name = locked_spec.name
124
+ @locked_version = locked_spec.version
125
+
126
+ result = spec_groups.sort do |a, b|
127
+ @a_ver = a.version
128
+ @b_ver = b.version
129
+
130
+ unless @prerelease_specified[@gem_name]
131
+ a_pre = @a_ver.prerelease?
132
+ b_pre = @b_ver.prerelease?
133
+
134
+ next -1 if a_pre && !b_pre
135
+ next 1 if b_pre && !a_pre
136
+ end
137
+
138
+ if major?
139
+ @a_ver <=> @b_ver
140
+ elsif either_version_older_than_locked
141
+ @a_ver <=> @b_ver
142
+ elsif segments_do_not_match(:major)
143
+ @b_ver <=> @a_ver
144
+ elsif !minor? && segments_do_not_match(:minor)
145
+ @b_ver <=> @a_ver
146
+ else
147
+ @a_ver <=> @b_ver
148
+ end
149
+ end
150
+ post_sort(result)
151
+ end
152
+
153
+ def either_version_older_than_locked
154
+ @a_ver < @locked_version || @b_ver < @locked_version
155
+ end
156
+
157
+ def segments_do_not_match(level)
158
+ index = [:major, :minor].index(level)
159
+ @a_ver.segments[index] != @b_ver.segments[index]
160
+ end
161
+
162
+ def unlocking_gem?
163
+ unlock_gems.empty? || unlock_gems.include?(@gem_name)
164
+ end
165
+
166
+ # Specific version moves can't always reliably be done during sorting
167
+ # as not all elements are compared against each other.
168
+ def post_sort(result)
169
+ # default :major behavior in Bundler does not do this
170
+ return result if major?
171
+ if unlocking_gem?
172
+ result
173
+ else
174
+ move_version_to_end(result, @locked_version)
175
+ end
176
+ end
177
+
178
+ def move_version_to_end(result, version)
179
+ move, keep = result.partition {|s| s.version.to_s == version.to_s }
180
+ keep.concat(move)
181
+ end
182
+
183
+ def debug_format_result(dep, spec_groups)
184
+ a = [dep.to_s,
185
+ spec_groups.map {|sg| [sg.version, sg.dependencies_for_activated_platforms.map {|dp| [dp.name, dp.requirement.to_s] }] }]
186
+ last_map = a.last.map {|sg_data| [sg_data.first.version, sg_data.last.map {|aa| aa.join(" ") }] }
187
+ [a.first, last_map, level, strict ? :strict : :not_strict]
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Gemdeps
5
+ def initialize(runtime)
6
+ @runtime = runtime
7
+ end
8
+
9
+ def requested_specs
10
+ @runtime.requested_specs
11
+ end
12
+
13
+ def specs
14
+ @runtime.specs
15
+ end
16
+
17
+ def dependencies
18
+ @runtime.dependencies
19
+ end
20
+
21
+ def current_dependencies
22
+ @runtime.current_dependencies
23
+ end
24
+
25
+ def requires
26
+ @runtime.requires
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "set"
4
+ module Bundler
5
+ class Graph
6
+ GRAPH_NAME = :Gemfile
7
+
8
+ def initialize(env, output_file, show_version = false, show_requirements = false, output_format = "png", without = [])
9
+ @env = env
10
+ @output_file = output_file
11
+ @show_version = show_version
12
+ @show_requirements = show_requirements
13
+ @output_format = output_format
14
+ @without_groups = without.map(&:to_sym)
15
+
16
+ @groups = []
17
+ @relations = Hash.new {|h, k| h[k] = Set.new }
18
+ @node_options = {}
19
+ @edge_options = {}
20
+
21
+ _populate_relations
22
+ end
23
+
24
+ attr_reader :groups, :relations, :node_options, :edge_options, :output_file, :output_format
25
+
26
+ def viz
27
+ GraphVizClient.new(self).run
28
+ end
29
+
30
+ private
31
+
32
+ def _populate_relations
33
+ parent_dependencies = _groups.values.to_set.flatten
34
+ loop do
35
+ break if parent_dependencies.empty?
36
+
37
+ tmp = Set.new
38
+ parent_dependencies.each do |dependency|
39
+ child_dependencies = spec_for_dependency(dependency).runtime_dependencies.to_set
40
+ @relations[dependency.name] += child_dependencies.map(&:name).to_set
41
+ tmp += child_dependencies
42
+
43
+ @node_options[dependency.name] = _make_label(dependency, :node)
44
+ child_dependencies.each do |c_dependency|
45
+ @edge_options["#{dependency.name}_#{c_dependency.name}"] = _make_label(c_dependency, :edge)
46
+ end
47
+ end
48
+ parent_dependencies = tmp
49
+ end
50
+ end
51
+
52
+ def _groups
53
+ relations = Hash.new {|h, k| h[k] = Set.new }
54
+ @env.current_dependencies.each do |dependency|
55
+ dependency.groups.each do |group|
56
+ next if @without_groups.include?(group)
57
+
58
+ relations[group.to_s].add(dependency)
59
+ @relations[group.to_s].add(dependency.name)
60
+
61
+ @node_options[group.to_s] ||= _make_label(group, :node)
62
+ @edge_options["#{group}_#{dependency.name}"] = _make_label(dependency, :edge)
63
+ end
64
+ end
65
+ @groups = relations.keys
66
+ relations
67
+ end
68
+
69
+ def _make_label(symbol_or_string_or_dependency, element_type)
70
+ case element_type.to_sym
71
+ when :node
72
+ if symbol_or_string_or_dependency.is_a?(Gem::Dependency)
73
+ label = symbol_or_string_or_dependency.name.dup
74
+ label << "\n#{spec_for_dependency(symbol_or_string_or_dependency).version}" if @show_version
75
+ else
76
+ label = symbol_or_string_or_dependency.to_s
77
+ end
78
+ when :edge
79
+ label = nil
80
+ if symbol_or_string_or_dependency.respond_to?(:requirements_list) && @show_requirements
81
+ tmp = symbol_or_string_or_dependency.requirements_list.join(", ")
82
+ label = tmp if tmp != ">= 0"
83
+ end
84
+ else
85
+ raise ArgumentError, "2nd argument is invalid"
86
+ end
87
+ label.nil? ? {} : { :label => label }
88
+ end
89
+
90
+ def spec_for_dependency(dependency)
91
+ @env.requested_specs.find {|s| s.name == dependency.name }
92
+ end
93
+
94
+ class GraphVizClient
95
+ def initialize(graph_instance)
96
+ @graph_name = graph_instance.class::GRAPH_NAME
97
+ @groups = graph_instance.groups
98
+ @relations = graph_instance.relations
99
+ @node_options = graph_instance.node_options
100
+ @edge_options = graph_instance.edge_options
101
+ @output_file = graph_instance.output_file
102
+ @output_format = graph_instance.output_format
103
+ end
104
+
105
+ def g
106
+ @g ||= ::GraphViz.digraph(@graph_name, :concentrate => true, :normalize => true, :nodesep => 0.55) do |g|
107
+ g.edge[:weight] = 2
108
+ g.edge[:fontname] = g.node[:fontname] = "Arial, Helvetica, SansSerif"
109
+ g.edge[:fontsize] = 12
110
+ end
111
+ end
112
+
113
+ def run
114
+ @groups.each do |group|
115
+ g.add_nodes(
116
+ group, {
117
+ :style => "filled",
118
+ :fillcolor => "#B9B9D5",
119
+ :shape => "box3d",
120
+ :fontsize => 16
121
+ }.merge(@node_options[group])
122
+ )
123
+ end
124
+
125
+ @relations.each do |parent, children|
126
+ children.each do |child|
127
+ if @groups.include?(parent)
128
+ g.add_nodes(child, { :style => "filled", :fillcolor => "#B9B9D5" }.merge(@node_options[child]))
129
+ g.add_edges(parent, child, { :constraint => false }.merge(@edge_options["#{parent}_#{child}"]))
130
+ else
131
+ g.add_nodes(child, @node_options[child])
132
+ g.add_edges(parent, child, @edge_options["#{parent}_#{child}"])
133
+ end
134
+ end
135
+ end
136
+
137
+ if @output_format.to_s == "debug"
138
+ $stdout.puts g.output :none => String
139
+ Bundler.ui.info "debugging bundle viz..."
140
+ else
141
+ begin
142
+ g.output @output_format.to_sym => "#{@output_file}.#{@output_format}"
143
+ Bundler.ui.info "#{@output_file}.#{@output_format}"
144
+ rescue ArgumentError => e
145
+ $stderr.puts "Unsupported output format. See Ruby-Graphviz/lib/graphviz/constants.rb"
146
+ raise e
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end