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,256 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Some versions of the Bundler 1.1 RC series introduced corrupted
4
+ # lockfiles. There were two major problems:
5
+ #
6
+ # * multiple copies of the same GIT section appeared in the lockfile
7
+ # * when this happened, those sections got multiple copies of gems
8
+ # in those sections.
9
+ #
10
+ # As a result, Bundler 1.1 contains code that fixes the earlier
11
+ # corruption. We will remove this fix-up code in Bundler 1.2.
12
+
13
+ module Bundler
14
+ class LockfileParser
15
+ attr_reader :sources, :dependencies, :specs, :platforms, :bundler_version, :ruby_version
16
+
17
+ BUNDLED = "BUNDLED WITH".freeze
18
+ DEPENDENCIES = "DEPENDENCIES".freeze
19
+ PLATFORMS = "PLATFORMS".freeze
20
+ RUBY = "RUBY VERSION".freeze
21
+ GIT = "GIT".freeze
22
+ GEM = "GEM".freeze
23
+ PATH = "PATH".freeze
24
+ PLUGIN = "PLUGIN SOURCE".freeze
25
+ SPECS = " specs:".freeze
26
+ OPTIONS = /^ ([a-z]+): (.*)$/i
27
+ SOURCE = [GIT, GEM, PATH, PLUGIN].freeze
28
+
29
+ SECTIONS_BY_VERSION_INTRODUCED = {
30
+ # The strings have to be dup'ed for old RG on Ruby 2.3+
31
+ # TODO: remove dup in Bundler 2.0
32
+ Gem::Version.create("1.0".dup) => [DEPENDENCIES, PLATFORMS, GIT, GEM, PATH].freeze,
33
+ Gem::Version.create("1.10".dup) => [BUNDLED].freeze,
34
+ Gem::Version.create("1.12".dup) => [RUBY].freeze,
35
+ Gem::Version.create("1.13".dup) => [PLUGIN].freeze,
36
+ }.freeze
37
+
38
+ KNOWN_SECTIONS = SECTIONS_BY_VERSION_INTRODUCED.values.flatten.freeze
39
+
40
+ ENVIRONMENT_VERSION_SECTIONS = [BUNDLED, RUBY].freeze
41
+
42
+ def self.sections_in_lockfile(lockfile_contents)
43
+ lockfile_contents.scan(/^\w[\w ]*$/).uniq
44
+ end
45
+
46
+ def self.unknown_sections_in_lockfile(lockfile_contents)
47
+ sections_in_lockfile(lockfile_contents) - KNOWN_SECTIONS
48
+ end
49
+
50
+ def self.sections_to_ignore(base_version = nil)
51
+ base_version &&= base_version.release
52
+ base_version ||= Gem::Version.create("1.0".dup)
53
+ attributes = []
54
+ SECTIONS_BY_VERSION_INTRODUCED.each do |version, introduced|
55
+ next if version <= base_version
56
+ attributes += introduced
57
+ end
58
+ attributes
59
+ end
60
+
61
+ def initialize(lockfile)
62
+ @platforms = []
63
+ @sources = []
64
+ @dependencies = {}
65
+ @state = nil
66
+ @specs = {}
67
+
68
+ @rubygems_aggregate = Source::Rubygems.new
69
+
70
+ if lockfile.match(/<<<<<<<|=======|>>>>>>>|\|\|\|\|\|\|\|/)
71
+ raise LockfileError, "Your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} contains merge conflicts.\n" \
72
+ "Run `git checkout HEAD -- #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` first to get a clean lock."
73
+ end
74
+
75
+ lockfile.split(/(?:\r?\n)+/).each do |line|
76
+ if SOURCE.include?(line)
77
+ @state = :source
78
+ parse_source(line)
79
+ elsif line == DEPENDENCIES
80
+ @state = :dependency
81
+ elsif line == PLATFORMS
82
+ @state = :platform
83
+ elsif line == RUBY
84
+ @state = :ruby
85
+ elsif line == BUNDLED
86
+ @state = :bundled_with
87
+ elsif line =~ /^[^\s]/
88
+ @state = nil
89
+ elsif @state
90
+ send("parse_#{@state}", line)
91
+ end
92
+ end
93
+ @sources << @rubygems_aggregate unless Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
94
+ @specs = @specs.values.sort_by(&:identifier)
95
+ warn_for_outdated_bundler_version
96
+ rescue ArgumentError => e
97
+ Bundler.ui.debug(e)
98
+ raise LockfileError, "Your lockfile is unreadable. Run `rm #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` " \
99
+ "and then `bundle install` to generate a new lockfile."
100
+ end
101
+
102
+ def warn_for_outdated_bundler_version
103
+ return unless bundler_version
104
+ prerelease_text = bundler_version.prerelease? ? " --pre" : ""
105
+ current_version = Gem::Version.create(Bundler::VERSION)
106
+ case current_version.segments.first <=> bundler_version.segments.first
107
+ when -1
108
+ raise LockfileError, "You must use Bundler #{bundler_version.segments.first} or greater with this lockfile."
109
+ when 0
110
+ if current_version < bundler_version
111
+ Bundler.ui.warn "Warning: the running version of Bundler (#{current_version}) is older " \
112
+ "than the version that created the lockfile (#{bundler_version}). We suggest you " \
113
+ "upgrade to the latest version of Bundler by running `gem " \
114
+ "install bundler#{prerelease_text}`.\n"
115
+ end
116
+ end
117
+ end
118
+
119
+ private
120
+
121
+ TYPES = {
122
+ GIT => Bundler::Source::Git,
123
+ GEM => Bundler::Source::Rubygems,
124
+ PATH => Bundler::Source::Path,
125
+ PLUGIN => Bundler::Plugin,
126
+ }.freeze
127
+
128
+ def parse_source(line)
129
+ case line
130
+ when SPECS
131
+ case @type
132
+ when PATH
133
+ @current_source = TYPES[@type].from_lock(@opts)
134
+ @sources << @current_source
135
+ when GIT
136
+ @current_source = TYPES[@type].from_lock(@opts)
137
+ # Strip out duplicate GIT sections
138
+ if @sources.include?(@current_source)
139
+ @current_source = @sources.find {|s| s == @current_source }
140
+ else
141
+ @sources << @current_source
142
+ end
143
+ when GEM
144
+ if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
145
+ @opts["remotes"] = @opts.delete("remote")
146
+ @current_source = TYPES[@type].from_lock(@opts)
147
+ @sources << @current_source
148
+ else
149
+ Array(@opts["remote"]).each do |url|
150
+ @rubygems_aggregate.add_remote(url)
151
+ end
152
+ @current_source = @rubygems_aggregate
153
+ end
154
+ when PLUGIN
155
+ @current_source = Plugin.source_from_lock(@opts)
156
+ @sources << @current_source
157
+ end
158
+ when OPTIONS
159
+ value = $2
160
+ value = true if value == "true"
161
+ value = false if value == "false"
162
+
163
+ key = $1
164
+
165
+ if @opts[key]
166
+ @opts[key] = Array(@opts[key])
167
+ @opts[key] << value
168
+ else
169
+ @opts[key] = value
170
+ end
171
+ when *SOURCE
172
+ @current_source = nil
173
+ @opts = {}
174
+ @type = line
175
+ else
176
+ parse_spec(line)
177
+ end
178
+ end
179
+
180
+ space = / /
181
+ NAME_VERSION = /
182
+ ^(#{space}{2}|#{space}{4}|#{space}{6})(?!#{space}) # Exactly 2, 4, or 6 spaces at the start of the line
183
+ (.*?) # Name
184
+ (?:#{space}\(([^-]*) # Space, followed by version
185
+ (?:-(.*))?\))? # Optional platform
186
+ (!)? # Optional pinned marker
187
+ $ # Line end
188
+ /xo
189
+
190
+ def parse_dependency(line)
191
+ return unless line =~ NAME_VERSION
192
+ spaces = $1
193
+ return unless spaces.size == 2
194
+ name = $2
195
+ version = $3
196
+ pinned = $5
197
+
198
+ version = version.split(",").map(&:strip) if version
199
+
200
+ dep = Bundler::Dependency.new(name, version)
201
+
202
+ if pinned && dep.name != "bundler"
203
+ spec = @specs.find {|_, v| v.name == dep.name }
204
+ dep.source = spec.last.source if spec
205
+
206
+ # Path sources need to know what the default name / version
207
+ # to use in the case that there are no gemspecs present. A fake
208
+ # gemspec is created based on the version set on the dependency
209
+ # TODO: Use the version from the spec instead of from the dependency
210
+ if version && version.size == 1 && version.first =~ /^\s*= (.+)\s*$/ && dep.source.is_a?(Bundler::Source::Path)
211
+ dep.source.name = name
212
+ dep.source.version = $1
213
+ end
214
+ end
215
+
216
+ @dependencies[dep.name] = dep
217
+ end
218
+
219
+ def parse_spec(line)
220
+ return unless line =~ NAME_VERSION
221
+ spaces = $1
222
+ name = $2
223
+ version = $3
224
+ platform = $4
225
+
226
+ if spaces.size == 4
227
+ version = Gem::Version.new(version)
228
+ platform = platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY
229
+ @current_spec = LazySpecification.new(name, version, platform)
230
+ @current_spec.source = @current_source
231
+
232
+ # Avoid introducing multiple copies of the same spec (caused by
233
+ # duplicate GIT sections)
234
+ @specs[@current_spec.identifier] ||= @current_spec
235
+ elsif spaces.size == 6
236
+ version = version.split(",").map(&:strip) if version
237
+ dep = Gem::Dependency.new(name, version)
238
+ @current_spec.dependencies << dep
239
+ end
240
+ end
241
+
242
+ def parse_platform(line)
243
+ @platforms << Gem::Platform.new($1) if line =~ /^ (.*)$/
244
+ end
245
+
246
+ def parse_bundled_with(line)
247
+ line = line.strip
248
+ return unless Gem::Version.correct?(line)
249
+ @bundler_version = Gem::Version.create(line)
250
+ end
251
+
252
+ def parse_ruby(line)
253
+ @ruby_version = line.strip
254
+ end
255
+ end
256
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_helpers"
4
+
5
+ module Bundler
6
+ module MatchPlatform
7
+ include GemHelpers
8
+
9
+ def match_platform(p)
10
+ MatchPlatform.platforms_match?(platform, p)
11
+ end
12
+
13
+ def self.platforms_match?(gemspec_platform, local_platform)
14
+ return true if gemspec_platform.nil?
15
+ return true if Gem::Platform::RUBY == gemspec_platform
16
+ return true if local_platform == gemspec_platform
17
+ gemspec_platform = Gem::Platform.new(gemspec_platform)
18
+ return true if GemHelpers.generic(gemspec_platform) === local_platform
19
+ return true if gemspec_platform === local_platform
20
+
21
+ false
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,223 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "socket"
4
+
5
+ module Bundler
6
+ class Settings
7
+ # Class used to build the mirror set and then find a mirror for a given URI
8
+ #
9
+ # @param prober [Prober object, nil] by default a TCPSocketProbe, this object
10
+ # will be used to probe the mirror address to validate that the mirror replies.
11
+ class Mirrors
12
+ def initialize(prober = nil)
13
+ @all = Mirror.new
14
+ @prober = prober || TCPSocketProbe.new
15
+ @mirrors = {}
16
+ end
17
+
18
+ # Returns a mirror for the given uri.
19
+ #
20
+ # Depending on the uri having a valid mirror or not, it may be a
21
+ # mirror that points to the provided uri
22
+ def for(uri)
23
+ if @all.validate!(@prober).valid?
24
+ @all
25
+ else
26
+ fetch_valid_mirror_for(Settings.normalize_uri(uri))
27
+ end
28
+ end
29
+
30
+ def each
31
+ @mirrors.each do |k, v|
32
+ yield k, v.uri.to_s
33
+ end
34
+ end
35
+
36
+ def parse(key, value)
37
+ config = MirrorConfig.new(key, value)
38
+ mirror = if config.all?
39
+ @all
40
+ else
41
+ @mirrors[config.uri] ||= Mirror.new
42
+ end
43
+ config.update_mirror(mirror)
44
+ end
45
+
46
+ private
47
+
48
+ def fetch_valid_mirror_for(uri)
49
+ downcased = uri.to_s.downcase
50
+ mirror = @mirrors[downcased] || @mirrors[URI(downcased).host] || Mirror.new(uri)
51
+ mirror.validate!(@prober)
52
+ mirror = Mirror.new(uri) unless mirror.valid?
53
+ mirror
54
+ end
55
+ end
56
+
57
+ # A mirror
58
+ #
59
+ # Contains both the uri that should be used as a mirror and the
60
+ # fallback timeout which will be used for probing if the mirror
61
+ # replies on time or not.
62
+ class Mirror
63
+ DEFAULT_FALLBACK_TIMEOUT = 0.1
64
+
65
+ attr_reader :uri, :fallback_timeout
66
+
67
+ def initialize(uri = nil, fallback_timeout = 0)
68
+ self.uri = uri
69
+ self.fallback_timeout = fallback_timeout
70
+ @valid = nil
71
+ end
72
+
73
+ def uri=(uri)
74
+ @uri = if uri.nil?
75
+ nil
76
+ else
77
+ URI(uri.to_s)
78
+ end
79
+ @valid = nil
80
+ end
81
+
82
+ def fallback_timeout=(timeout)
83
+ case timeout
84
+ when true, "true"
85
+ @fallback_timeout = DEFAULT_FALLBACK_TIMEOUT
86
+ when false, "false"
87
+ @fallback_timeout = 0
88
+ else
89
+ @fallback_timeout = timeout.to_i
90
+ end
91
+ @valid = nil
92
+ end
93
+
94
+ def ==(other)
95
+ !other.nil? && uri == other.uri && fallback_timeout == other.fallback_timeout
96
+ end
97
+
98
+ def valid?
99
+ return false if @uri.nil?
100
+ return @valid unless @valid.nil?
101
+ false
102
+ end
103
+
104
+ def validate!(probe = nil)
105
+ @valid = false if uri.nil?
106
+ if @valid.nil?
107
+ @valid = fallback_timeout == 0 || (probe || TCPSocketProbe.new).replies?(self)
108
+ end
109
+ self
110
+ end
111
+ end
112
+
113
+ # Class used to parse one configuration line
114
+ #
115
+ # Gets the configuration line and the value.
116
+ # This object provides a `update_mirror` method
117
+ # used to setup the given mirror value.
118
+ class MirrorConfig
119
+ attr_accessor :uri, :value
120
+
121
+ def initialize(config_line, value)
122
+ uri, fallback =
123
+ config_line.match(%r{\Amirror\.(all|.+?)(\.fallback_timeout)?\/?\z}).captures
124
+ @fallback = !fallback.nil?
125
+ @all = false
126
+ if uri == "all"
127
+ @all = true
128
+ else
129
+ @uri = URI(uri).absolute? ? Settings.normalize_uri(uri) : uri
130
+ end
131
+ @value = value
132
+ end
133
+
134
+ def all?
135
+ @all
136
+ end
137
+
138
+ def update_mirror(mirror)
139
+ if @fallback
140
+ mirror.fallback_timeout = @value
141
+ else
142
+ mirror.uri = Settings.normalize_uri(@value)
143
+ end
144
+ end
145
+ end
146
+
147
+ # Class used for probing TCP availability for a given mirror.
148
+ class TCPSocketProbe
149
+ def replies?(mirror)
150
+ MirrorSockets.new(mirror).any? do |socket, address, timeout|
151
+ begin
152
+ socket.connect_nonblock(address)
153
+ rescue Errno::EINPROGRESS
154
+ wait_for_writtable_socket(socket, address, timeout)
155
+ rescue RuntimeError # Connection failed somehow, again
156
+ false
157
+ end
158
+ end
159
+ end
160
+
161
+ private
162
+
163
+ def wait_for_writtable_socket(socket, address, timeout)
164
+ if IO.select(nil, [socket], nil, timeout)
165
+ probe_writtable_socket(socket, address)
166
+ else # TCP Handshake timed out, or there is something dropping packets
167
+ false
168
+ end
169
+ end
170
+
171
+ def probe_writtable_socket(socket, address)
172
+ socket.connect_nonblock(address)
173
+ rescue Errno::EISCONN
174
+ true
175
+ rescue StandardError # Connection failed
176
+ false
177
+ end
178
+ end
179
+ end
180
+
181
+ # Class used to build the list of sockets that correspond to
182
+ # a given mirror.
183
+ #
184
+ # One mirror may correspond to many different addresses, both
185
+ # because of it having many dns entries or because
186
+ # the network interface is both ipv4 and ipv5
187
+ class MirrorSockets
188
+ def initialize(mirror)
189
+ @timeout = mirror.fallback_timeout
190
+ @addresses = Socket.getaddrinfo(mirror.uri.host, mirror.uri.port).map do |address|
191
+ SocketAddress.new(address[0], address[3], address[1])
192
+ end
193
+ end
194
+
195
+ def any?
196
+ @addresses.any? do |address|
197
+ socket = Socket.new(Socket.const_get(address.type), Socket::SOCK_STREAM, 0)
198
+ socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
199
+ value = yield socket, address.to_socket_address, @timeout
200
+ socket.close unless socket.closed?
201
+ value
202
+ end
203
+ end
204
+ end
205
+
206
+ # Socket address builder.
207
+ #
208
+ # Given a socket type, a host and a port,
209
+ # provides a method to build sockaddr string
210
+ class SocketAddress
211
+ attr_reader :type, :host, :port
212
+
213
+ def initialize(type, host, port)
214
+ @type = type
215
+ @host = host
216
+ @port = port
217
+ end
218
+
219
+ def to_socket_address
220
+ Socket.pack_sockaddr_in(@port, @host)
221
+ end
222
+ end
223
+ end