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,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/vendored_thor"
4
+ module Bundler
5
+ class CLI::Plugin < Thor
6
+ desc "install PLUGINS", "Install the plugin from the source"
7
+ long_desc <<-D
8
+ Install plugins either from the rubygems source provided (with --source option) or from a git source provided with (--git option). If no sources are provided, it uses Gem.sources
9
+ D
10
+ method_option "source", :type => :string, :default => nil, :banner =>
11
+ "URL of the RubyGems source to fetch the plugin from"
12
+ method_option "version", :type => :string, :default => nil, :banner =>
13
+ "The version of the plugin to fetch"
14
+ method_option "git", :type => :string, :default => nil, :banner =>
15
+ "URL of the git repo to fetch from"
16
+ method_option "branch", :type => :string, :default => nil, :banner =>
17
+ "The git branch to checkout"
18
+ method_option "ref", :type => :string, :default => nil, :banner =>
19
+ "The git revision to check out"
20
+ def install(*plugins)
21
+ Bundler::Plugin.install(plugins, options)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Pristine
5
+ def initialize(gems)
6
+ @gems = gems
7
+ end
8
+
9
+ def run
10
+ CLI::Common.ensure_all_gems_in_lockfile!(@gems)
11
+ definition = Bundler.definition
12
+ definition.validate_runtime!
13
+ installer = Bundler::Installer.new(Bundler.root, definition)
14
+
15
+ Bundler.load.specs.each do |spec|
16
+ next if spec.name == "bundler" # Source::Rubygems doesn't install bundler
17
+ next if !@gems.empty? && !@gems.include?(spec.name)
18
+
19
+ gem_name = "#{spec.name} (#{spec.version}#{spec.git_version})"
20
+ gem_name += " (#{spec.platform})" if !spec.platform.nil? && spec.platform != Gem::Platform::RUBY
21
+
22
+ case source = spec.source
23
+ when Source::Rubygems
24
+ cached_gem = spec.cache_file
25
+ unless File.exist?(cached_gem)
26
+ Bundler.ui.error("Failed to pristine #{gem_name}. Cached gem #{cached_gem} does not exist.")
27
+ next
28
+ end
29
+
30
+ FileUtils.rm_rf spec.full_gem_path
31
+ when Source::Git
32
+ source.remote!
33
+ if extension_cache_path = source.extension_cache_path(spec)
34
+ FileUtils.rm_rf extension_cache_path
35
+ end
36
+ FileUtils.rm_rf spec.extension_dir if spec.respond_to?(:extension_dir)
37
+ FileUtils.rm_rf spec.full_gem_path
38
+ else
39
+ Bundler.ui.warn("Cannot pristine #{gem_name}. Gem is sourced from local path.")
40
+ next
41
+ end
42
+
43
+ Bundler::GemInstaller.new(spec, installer, false, 0, true).install_from_spec
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Remove
5
+ def initialize(gems, options)
6
+ @gems = gems
7
+ @options = options
8
+ end
9
+
10
+ def run
11
+ raise InvalidOption, "Please specify gems to remove." if @gems.empty?
12
+
13
+ Injector.remove(@gems, {})
14
+
15
+ Installer.install(Bundler.root, Bundler.definition) if @options["install"]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Show
5
+ attr_reader :options, :gem_name, :latest_specs
6
+ def initialize(options, gem_name)
7
+ @options = options
8
+ @gem_name = gem_name
9
+ @verbose = options[:verbose] || options[:outdated]
10
+ @latest_specs = fetch_latest_specs if @verbose
11
+ end
12
+
13
+ def run
14
+ Bundler.ui.silence do
15
+ Bundler.definition.validate_runtime!
16
+ Bundler.load.lock
17
+ end
18
+
19
+ if gem_name
20
+ if gem_name == "bundler"
21
+ path = File.expand_path("../../../..", __FILE__)
22
+ else
23
+ spec = Bundler::CLI::Common.select_spec(gem_name, :regex_match)
24
+ return unless spec
25
+ path = spec.full_gem_path
26
+ unless File.directory?(path)
27
+ Bundler.ui.warn "The gem #{gem_name} has been deleted. It was installed at:"
28
+ end
29
+ end
30
+ return Bundler.ui.info(path)
31
+ end
32
+
33
+ if options[:paths]
34
+ Bundler.load.specs.sort_by(&:name).map do |s|
35
+ Bundler.ui.info s.full_gem_path
36
+ end
37
+ else
38
+ Bundler.ui.info "Gems included by the bundle:"
39
+ Bundler.load.specs.sort_by(&:name).each do |s|
40
+ desc = " * #{s.name} (#{s.version}#{s.git_version})"
41
+ if @verbose
42
+ latest = latest_specs.find {|l| l.name == s.name }
43
+ Bundler.ui.info <<-END.gsub(/^ +/, "")
44
+ #{desc}
45
+ \tSummary: #{s.summary || "No description available."}
46
+ \tHomepage: #{s.homepage || "No website available."}
47
+ \tStatus: #{outdated?(s, latest) ? "Outdated - #{s.version} < #{latest.version}" : "Up to date"}
48
+ END
49
+ else
50
+ Bundler.ui.info desc
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ def fetch_latest_specs
59
+ definition = Bundler.definition(true)
60
+ if options[:outdated]
61
+ Bundler.ui.info "Fetching remote specs for outdated check...\n\n"
62
+ Bundler.ui.silence { definition.resolve_remotely! }
63
+ else
64
+ definition.resolve_with_cache!
65
+ end
66
+ Bundler.reset!
67
+ definition.specs
68
+ end
69
+
70
+ def outdated?(current, latest)
71
+ return false unless latest
72
+ Gem::Version.new(current.version) < Gem::Version.new(latest.version)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Update
5
+ attr_reader :options, :gems
6
+ def initialize(options, gems)
7
+ @options = options
8
+ @gems = gems
9
+ end
10
+
11
+ def run
12
+ Bundler.ui.level = "error" if options[:quiet]
13
+
14
+ Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.feature_flag.plugins?
15
+
16
+ sources = Array(options[:source])
17
+ groups = Array(options[:group]).map(&:to_sym)
18
+
19
+ full_update = gems.empty? && sources.empty? && groups.empty? && !options[:ruby] && !options[:bundler]
20
+
21
+ if full_update && !options[:all]
22
+ if Bundler.feature_flag.update_requires_all_flag?
23
+ raise InvalidOption, "To update everything, pass the `--all` flag."
24
+ end
25
+ SharedHelpers.major_deprecation 3, "Pass --all to `bundle update` to update everything"
26
+ elsif !full_update && options[:all]
27
+ raise InvalidOption, "Cannot specify --all along with specific options."
28
+ end
29
+
30
+ if full_update
31
+ # We're doing a full update
32
+ Bundler.definition(true)
33
+ else
34
+ unless Bundler.default_lockfile.exist?
35
+ raise GemfileLockNotFound, "This Bundle hasn't been installed yet. " \
36
+ "Run `bundle install` to update and install the bundled gems."
37
+ end
38
+ Bundler::CLI::Common.ensure_all_gems_in_lockfile!(gems)
39
+
40
+ if groups.any?
41
+ deps = Bundler.definition.dependencies.select {|d| (d.groups & groups).any? }
42
+ gems.concat(deps.map(&:name))
43
+ end
44
+
45
+ Bundler.definition(:gems => gems, :sources => sources, :ruby => options[:ruby],
46
+ :lock_shared_dependencies => options[:conservative],
47
+ :bundler => options[:bundler])
48
+ end
49
+
50
+ Bundler::CLI::Common.configure_gem_version_promoter(Bundler.definition, options)
51
+
52
+ Bundler::Fetcher.disable_endpoint = options["full-index"]
53
+
54
+ opts = options.dup
55
+ opts["update"] = true
56
+ opts["local"] = options[:local]
57
+
58
+ Bundler.settings.set_command_option_if_given :jobs, opts["jobs"]
59
+
60
+ Bundler.definition.validate_runtime!
61
+ installer = Installer.install Bundler.root, Bundler.definition, opts
62
+ Bundler.load.cache if Bundler.app_cache.exist?
63
+
64
+ if CLI::Common.clean_after_install?
65
+ require "bundler/cli/clean"
66
+ Bundler::CLI::Clean.new(options).run
67
+ end
68
+
69
+ if locked_gems = Bundler.definition.locked_gems
70
+ gems.each do |name|
71
+ locked_version = locked_gems.specs.find {|s| s.name == name }
72
+ locked_version &&= locked_version.version
73
+ next unless locked_version
74
+ new_version = Bundler.definition.specs[name].first
75
+ new_version &&= new_version.version
76
+ if !new_version
77
+ Bundler.ui.warn "Bundler attempted to update #{name} but it was removed from the bundle"
78
+ elsif new_version < locked_version
79
+ Bundler.ui.warn "Note: #{name} version regressed from #{locked_version} to #{new_version}"
80
+ elsif new_version == locked_version
81
+ Bundler.ui.warn "Bundler attempted to update #{name} but its version stayed the same"
82
+ end
83
+ end
84
+ end
85
+
86
+ Bundler.ui.confirm "Bundle updated!"
87
+ Bundler::CLI::Common.output_without_groups_message
88
+ Bundler::CLI::Common.output_post_install_messages installer.post_install_messages
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Viz
5
+ attr_reader :options, :gem_name
6
+ def initialize(options)
7
+ @options = options
8
+ end
9
+
10
+ def run
11
+ # make sure we get the right `graphviz`. There is also a `graphviz`
12
+ # gem we're not built to support
13
+ gem "ruby-graphviz"
14
+ require "graphviz"
15
+
16
+ options[:without] = options[:without].join(":").tr(" ", ":").split(":")
17
+ output_file = File.expand_path(options[:file])
18
+
19
+ graph = Graph.new(Bundler.load, output_file, options[:version], options[:requirements], options[:format], options[:without])
20
+ graph.viz
21
+ rescue LoadError => e
22
+ Bundler.ui.error e.inspect
23
+ Bundler.ui.warn "Make sure you have the graphviz ruby gem. You can install it with:"
24
+ Bundler.ui.warn "`gem install ruby-graphviz`"
25
+ rescue StandardError => e
26
+ raise unless e.message =~ /GraphViz not installed or dot not in PATH/
27
+ Bundler.ui.error e.message
28
+ Bundler.ui.warn "Please install GraphViz. On a Mac with Homebrew, you can run `brew install graphviz`."
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+ require "set"
5
+
6
+ module Bundler
7
+ class CompactIndexClient
8
+ DEBUG_MUTEX = Mutex.new
9
+ def self.debug
10
+ return unless ENV["DEBUG_COMPACT_INDEX"]
11
+ DEBUG_MUTEX.synchronize { warn("[#{self}] #{yield}") }
12
+ end
13
+
14
+ class Error < StandardError; end
15
+
16
+ require "bundler/compact_index_client/cache"
17
+ require "bundler/compact_index_client/updater"
18
+
19
+ attr_reader :directory
20
+
21
+ # @return [Lambda] A lambda that takes an array of inputs and a block, and
22
+ # maps the inputs with the block in parallel.
23
+ #
24
+ attr_accessor :in_parallel
25
+
26
+ def initialize(directory, fetcher)
27
+ @directory = Pathname.new(directory)
28
+ @updater = Updater.new(fetcher)
29
+ @cache = Cache.new(@directory)
30
+ @endpoints = Set.new
31
+ @info_checksums_by_name = {}
32
+ @parsed_checksums = false
33
+ @mutex = Mutex.new
34
+ @in_parallel = lambda do |inputs, &blk|
35
+ inputs.map(&blk)
36
+ end
37
+ end
38
+
39
+ def names
40
+ Bundler::CompactIndexClient.debug { "/names" }
41
+ update(@cache.names_path, "names")
42
+ @cache.names
43
+ end
44
+
45
+ def versions
46
+ Bundler::CompactIndexClient.debug { "/versions" }
47
+ update(@cache.versions_path, "versions")
48
+ versions, @info_checksums_by_name = @cache.versions
49
+ versions
50
+ end
51
+
52
+ def dependencies(names)
53
+ Bundler::CompactIndexClient.debug { "dependencies(#{names})" }
54
+ in_parallel.call(names) do |name|
55
+ update_info(name)
56
+ @cache.dependencies(name).map {|d| d.unshift(name) }
57
+ end.flatten(1)
58
+ end
59
+
60
+ def spec(name, version, platform = nil)
61
+ Bundler::CompactIndexClient.debug { "spec(name = #{name}, version = #{version}, platform = #{platform})" }
62
+ update_info(name)
63
+ @cache.specific_dependency(name, version, platform)
64
+ end
65
+
66
+ def update_and_parse_checksums!
67
+ Bundler::CompactIndexClient.debug { "update_and_parse_checksums!" }
68
+ return @info_checksums_by_name if @parsed_checksums
69
+ update(@cache.versions_path, "versions")
70
+ @info_checksums_by_name = @cache.checksums
71
+ @parsed_checksums = true
72
+ end
73
+
74
+ private
75
+
76
+ def update(local_path, remote_path)
77
+ Bundler::CompactIndexClient.debug { "update(#{local_path}, #{remote_path})" }
78
+ unless synchronize { @endpoints.add?(remote_path) }
79
+ Bundler::CompactIndexClient.debug { "already fetched #{remote_path}" }
80
+ return
81
+ end
82
+ @updater.update(local_path, url(remote_path))
83
+ end
84
+
85
+ def update_info(name)
86
+ Bundler::CompactIndexClient.debug { "update_info(#{name})" }
87
+ path = @cache.info_path(name)
88
+ checksum = @updater.checksum_for_file(path)
89
+ unless existing = @info_checksums_by_name[name]
90
+ Bundler::CompactIndexClient.debug { "skipping updating info for #{name} since it is missing from versions" }
91
+ return
92
+ end
93
+ if checksum == existing
94
+ Bundler::CompactIndexClient.debug { "skipping updating info for #{name} since the versions checksum matches the local checksum" }
95
+ return
96
+ end
97
+ Bundler::CompactIndexClient.debug { "updating info for #{name} since the versions checksum #{existing} != the local checksum #{checksum}" }
98
+ update(path, "info/#{name}")
99
+ end
100
+
101
+ def url(path)
102
+ path
103
+ end
104
+
105
+ def synchronize
106
+ @mutex.synchronize { yield }
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CompactIndexClient
5
+ class Cache
6
+ attr_reader :directory
7
+
8
+ def initialize(directory)
9
+ @directory = Pathname.new(directory).expand_path
10
+ info_roots.each do |dir|
11
+ SharedHelpers.filesystem_access(dir) do
12
+ FileUtils.mkdir_p(dir)
13
+ end
14
+ end
15
+ end
16
+
17
+ def names
18
+ lines(names_path)
19
+ end
20
+
21
+ def names_path
22
+ directory.join("names")
23
+ end
24
+
25
+ def versions
26
+ versions_by_name = Hash.new {|hash, key| hash[key] = [] }
27
+ info_checksums_by_name = {}
28
+
29
+ lines(versions_path).each do |line|
30
+ name, versions_string, info_checksum = line.split(" ", 3)
31
+ info_checksums_by_name[name] = info_checksum || ""
32
+ versions_string.split(",").each do |version|
33
+ if version.start_with?("-")
34
+ version = version[1..-1].split("-", 2).unshift(name)
35
+ versions_by_name[name].delete(version)
36
+ else
37
+ version = version.split("-", 2).unshift(name)
38
+ versions_by_name[name] << version
39
+ end
40
+ end
41
+ end
42
+
43
+ [versions_by_name, info_checksums_by_name]
44
+ end
45
+
46
+ def versions_path
47
+ directory.join("versions")
48
+ end
49
+
50
+ def checksums
51
+ checksums = {}
52
+
53
+ lines(versions_path).each do |line|
54
+ name, _, checksum = line.split(" ", 3)
55
+ checksums[name] = checksum
56
+ end
57
+
58
+ checksums
59
+ end
60
+
61
+ def dependencies(name)
62
+ lines(info_path(name)).map do |line|
63
+ parse_gem(line)
64
+ end
65
+ end
66
+
67
+ def info_path(name)
68
+ name = name.to_s
69
+ if name =~ /[^a-z0-9_-]/
70
+ name += "-#{SharedHelpers.digest(:MD5).hexdigest(name).downcase}"
71
+ info_roots.last.join(name)
72
+ else
73
+ info_roots.first.join(name)
74
+ end
75
+ end
76
+
77
+ def specific_dependency(name, version, platform)
78
+ pattern = [version, platform].compact.join("-")
79
+ return nil if pattern.empty?
80
+
81
+ gem_lines = info_path(name).read
82
+ gem_line = gem_lines[/^#{Regexp.escape(pattern)}\b.*/, 0]
83
+ gem_line ? parse_gem(gem_line) : nil
84
+ end
85
+
86
+ private
87
+
88
+ def lines(path)
89
+ return [] unless path.file?
90
+ lines = SharedHelpers.filesystem_access(path, :read, &:read).split("\n")
91
+ header = lines.index("---")
92
+ header ? lines[header + 1..-1] : lines
93
+ end
94
+
95
+ def parse_gem(string)
96
+ version_and_platform, rest = string.split(" ", 2)
97
+ version, platform = version_and_platform.split("-", 2)
98
+ dependencies, requirements = rest.split("|", 2).map {|s| s.split(",") } if rest
99
+ dependencies = dependencies ? dependencies.map {|d| parse_dependency(d) } : []
100
+ requirements = requirements ? requirements.map {|r| parse_dependency(r) } : []
101
+ [version, platform, dependencies, requirements]
102
+ end
103
+
104
+ def parse_dependency(string)
105
+ dependency = string.split(":")
106
+ dependency[-1] = dependency[-1].split("&") if dependency.size > 1
107
+ dependency
108
+ end
109
+
110
+ def info_roots
111
+ [
112
+ directory.join("info"),
113
+ directory.join("info-special-characters"),
114
+ ]
115
+ end
116
+ end
117
+ end
118
+ end