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,262 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "shellwords"
4
+ require "tempfile"
5
+ module Bundler
6
+ class Source
7
+ class Git
8
+ class GitNotInstalledError < GitError
9
+ def initialize
10
+ msg = String.new
11
+ msg << "You need to install git to be able to use gems from git repositories. "
12
+ msg << "For help installing git, please refer to GitHub's tutorial at https://help.github.com/articles/set-up-git"
13
+ super msg
14
+ end
15
+ end
16
+
17
+ class GitNotAllowedError < GitError
18
+ def initialize(command)
19
+ msg = String.new
20
+ msg << "Bundler is trying to run a `git #{command}` at runtime. You probably need to run `bundle install`. However, "
21
+ msg << "this error message could probably be more useful. Please submit a ticket at http://github.com/bundler/bundler/issues "
22
+ msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}"
23
+ super msg
24
+ end
25
+ end
26
+
27
+ class GitCommandError < GitError
28
+ def initialize(command, path = nil, extra_info = nil)
29
+ msg = String.new
30
+ msg << "Git error: command `git #{command}` in directory #{SharedHelpers.pwd} has failed."
31
+ msg << "\n#{extra_info}" if extra_info
32
+ msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path && path.exist?
33
+ super msg
34
+ end
35
+ end
36
+
37
+ class MissingGitRevisionError < GitError
38
+ def initialize(ref, repo)
39
+ msg = "Revision #{ref} does not exist in the repository #{repo}. Maybe you misspelled it?"
40
+ super msg
41
+ end
42
+ end
43
+
44
+ # The GitProxy is responsible to interact with git repositories.
45
+ # All actions required by the Git source is encapsulated in this
46
+ # object.
47
+ class GitProxy
48
+ attr_accessor :path, :uri, :ref
49
+ attr_writer :revision
50
+
51
+ def initialize(path, uri, ref, revision = nil, git = nil)
52
+ @path = path
53
+ @uri = uri
54
+ @ref = ref
55
+ @revision = revision
56
+ @git = git
57
+ raise GitNotInstalledError.new if allow? && !Bundler.git_present?
58
+ end
59
+
60
+ def revision
61
+ return @revision if @revision
62
+
63
+ begin
64
+ @revision ||= find_local_revision
65
+ rescue GitCommandError
66
+ raise MissingGitRevisionError.new(ref, URICredentialsFilter.credential_filtered_uri(uri))
67
+ end
68
+
69
+ @revision
70
+ end
71
+
72
+ def branch
73
+ @branch ||= allowed_in_path do
74
+ git("rev-parse --abbrev-ref HEAD").strip
75
+ end
76
+ end
77
+
78
+ def contains?(commit)
79
+ allowed_in_path do
80
+ result = git_null("branch --contains #{commit}")
81
+ $? == 0 && result =~ /^\* (.*)$/
82
+ end
83
+ end
84
+
85
+ def version
86
+ git("--version").match(/(git version\s*)?((\.?\d+)+).*/)[2]
87
+ end
88
+
89
+ def full_version
90
+ git("--version").sub("git version", "").strip
91
+ end
92
+
93
+ def checkout
94
+ return if path.exist? && has_revision_cached?
95
+ extra_ref = "#{Shellwords.shellescape(ref)}:#{Shellwords.shellescape(ref)}" if ref && ref.start_with?("refs/")
96
+
97
+ Bundler.ui.info "Fetching #{URICredentialsFilter.credential_filtered_uri(uri)}"
98
+
99
+ unless path.exist?
100
+ SharedHelpers.filesystem_access(path.dirname) do |p|
101
+ FileUtils.mkdir_p(p)
102
+ end
103
+ git_retry %(clone #{uri_escaped_with_configured_credentials} "#{path}" --bare --no-hardlinks --quiet)
104
+ return unless extra_ref
105
+ end
106
+
107
+ in_path do
108
+ git_retry %(fetch --force --quiet --tags #{uri_escaped_with_configured_credentials} "refs/heads/*:refs/heads/*" #{extra_ref})
109
+ end
110
+ end
111
+
112
+ def copy_to(destination, submodules = false)
113
+ # method 1
114
+ unless File.exist?(destination.join(".git"))
115
+ begin
116
+ SharedHelpers.filesystem_access(destination.dirname) do |p|
117
+ FileUtils.mkdir_p(p)
118
+ end
119
+ SharedHelpers.filesystem_access(destination) do |p|
120
+ FileUtils.rm_rf(p)
121
+ end
122
+ git_retry %(clone --no-checkout --quiet "#{path}" "#{destination}")
123
+ File.chmod(((File.stat(destination).mode | 0o777) & ~File.umask), destination)
124
+ rescue Errno::EEXIST => e
125
+ file_path = e.message[%r{.*?(/.*)}, 1]
126
+ raise GitError, "Bundler could not install a gem because it needs to " \
127
+ "create a directory, but a file exists - #{file_path}. Please delete " \
128
+ "this file and try again."
129
+ end
130
+ end
131
+ # method 2
132
+ SharedHelpers.chdir(destination) do
133
+ git_retry %(fetch --force --quiet --tags "#{path}")
134
+
135
+ begin
136
+ git "reset --hard #{@revision}"
137
+ rescue GitCommandError
138
+ raise MissingGitRevisionError.new(@revision, URICredentialsFilter.credential_filtered_uri(uri))
139
+ end
140
+
141
+ if submodules
142
+ git_retry "submodule update --init --recursive"
143
+ elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
144
+ git_retry "submodule deinit --all --force"
145
+ end
146
+ end
147
+ end
148
+
149
+ private
150
+
151
+ # TODO: Do not rely on /dev/null.
152
+ # Given that open3 is not cross platform until Ruby 1.9.3,
153
+ # the best solution is to pipe to /dev/null if it exists.
154
+ # If it doesn't, everything will work fine, but the user
155
+ # will get the $stderr messages as well.
156
+ def git_null(command)
157
+ git("#{command} 2>#{Bundler::NULL}", false)
158
+ end
159
+
160
+ def git_retry(command)
161
+ Bundler::Retry.new("`git #{URICredentialsFilter.credential_filtered_string(command, uri)}`", GitNotAllowedError).attempts do
162
+ git(command)
163
+ end
164
+ end
165
+
166
+ def git(command, check_errors = true, error_msg = nil)
167
+ command_with_no_credentials = URICredentialsFilter.credential_filtered_string(command, uri)
168
+ raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
169
+
170
+ out = SharedHelpers.with_clean_git_env do
171
+ capture_and_filter_stderr(uri) { `git #{command}` }
172
+ end
173
+
174
+ stdout_with_no_credentials = URICredentialsFilter.credential_filtered_string(out, uri)
175
+ raise GitCommandError.new(command_with_no_credentials, path, error_msg) if check_errors && !$?.success?
176
+ stdout_with_no_credentials
177
+ end
178
+
179
+ def has_revision_cached?
180
+ return unless @revision
181
+ in_path { git("cat-file -e #{@revision}") }
182
+ true
183
+ rescue GitError
184
+ false
185
+ end
186
+
187
+ def remove_cache
188
+ FileUtils.rm_rf(path)
189
+ end
190
+
191
+ def find_local_revision
192
+ allowed_in_path do
193
+ git("rev-parse --verify #{Shellwords.shellescape(ref)}", true).strip
194
+ end
195
+ end
196
+
197
+ # Escape the URI for git commands
198
+ def uri_escaped_with_configured_credentials
199
+ remote = configured_uri_for(uri)
200
+ if Bundler::WINDOWS
201
+ # Windows quoting requires double quotes only, with double quotes
202
+ # inside the string escaped by being doubled.
203
+ '"' + remote.gsub('"') { '""' } + '"'
204
+ else
205
+ # Bash requires single quoted strings, with the single quotes escaped
206
+ # by ending the string, escaping the quote, and restarting the string.
207
+ "'" + remote.gsub("'") { "'\\''" } + "'"
208
+ end
209
+ end
210
+
211
+ # Adds credentials to the URI as Fetcher#configured_uri_for does
212
+ def configured_uri_for(uri)
213
+ if /https?:/ =~ uri
214
+ remote = URI(uri)
215
+ config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
216
+ remote.userinfo ||= config_auth
217
+ remote.to_s
218
+ else
219
+ uri
220
+ end
221
+ end
222
+
223
+ def allow?
224
+ @git ? @git.allow_git_ops? : true
225
+ end
226
+
227
+ def in_path(&blk)
228
+ checkout unless path.exist?
229
+ _ = URICredentialsFilter # load it before we chdir
230
+ SharedHelpers.chdir(path, &blk)
231
+ end
232
+
233
+ def allowed_in_path
234
+ return in_path { yield } if allow?
235
+ raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application"
236
+ end
237
+
238
+ # TODO: Replace this with Open3 when upgrading to bundler 2
239
+ # Similar to #git_null, as Open3 is not cross-platform,
240
+ # a temporary way is to use Tempfile to capture the stderr.
241
+ # When replacing this using Open3, make sure git_null is
242
+ # also replaced by Open3, so stdout and stderr all got handled properly.
243
+ def capture_and_filter_stderr(uri)
244
+ return_value, captured_err = ""
245
+ backup_stderr = STDERR.dup
246
+ begin
247
+ Tempfile.open("captured_stderr") do |f|
248
+ STDERR.reopen(f)
249
+ return_value = yield
250
+ f.rewind
251
+ captured_err = f.read
252
+ end
253
+ ensure
254
+ STDERR.reopen backup_stderr
255
+ end
256
+ $stderr.puts URICredentialsFilter.credential_filtered_string(captured_err, uri) if uri && !captured_err.empty?
257
+ return_value
258
+ end
259
+ end
260
+ end
261
+ end
262
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Source
5
+ class Metadata < Source
6
+ def specs
7
+ @specs ||= Index.build do |idx|
8
+ idx << Gem::Specification.new("ruby\0", RubyVersion.system.to_gem_version_with_patchlevel)
9
+ idx << Gem::Specification.new("rubygems\0", Gem::VERSION)
10
+
11
+ idx << Gem::Specification.new do |s|
12
+ s.name = "bundler"
13
+ s.version = VERSION
14
+ s.platform = Gem::Platform::RUBY
15
+ s.source = self
16
+ s.authors = ["bundler team"]
17
+ s.bindir = "exe"
18
+ s.executables = %w[bundle]
19
+ # can't point to the actual gemspec or else the require paths will be wrong
20
+ s.loaded_from = File.expand_path("..", __FILE__)
21
+ end
22
+
23
+ if local_spec = Bundler.rubygems.find_name("bundler").find {|s| s.version.to_s == VERSION }
24
+ idx << local_spec
25
+ end
26
+
27
+ idx.each {|s| s.source = self }
28
+ end
29
+ end
30
+
31
+ def cached!; end
32
+
33
+ def remote!; end
34
+
35
+ def options
36
+ {}
37
+ end
38
+
39
+ def install(spec, _opts = {})
40
+ print_using_message "Using #{version_message(spec)}"
41
+ nil
42
+ end
43
+
44
+ def to_s
45
+ "the local ruby installation"
46
+ end
47
+
48
+ def ==(other)
49
+ self.class == other.class
50
+ end
51
+ alias_method :eql?, :==
52
+
53
+ def hash
54
+ self.class.hash
55
+ end
56
+
57
+ def version_message(spec)
58
+ "#{spec.name} #{spec.version}"
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,249 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Source
5
+ class Path < Source
6
+ autoload :Installer, "bundler/source/path/installer"
7
+
8
+ attr_reader :path, :options, :root_path, :original_path
9
+ attr_writer :name
10
+ attr_accessor :version
11
+
12
+ protected :original_path
13
+
14
+ DEFAULT_GLOB = "{,*,*/*}.gemspec".freeze
15
+
16
+ def initialize(options)
17
+ @options = options.dup
18
+ @glob = options["glob"] || DEFAULT_GLOB
19
+
20
+ @allow_cached = false
21
+ @allow_remote = false
22
+
23
+ @root_path = options["root_path"] || Bundler.root
24
+
25
+ if options["path"]
26
+ @path = Pathname.new(options["path"])
27
+ @path = expand(@path) unless @path.relative?
28
+ end
29
+
30
+ @name = options["name"]
31
+ @version = options["version"]
32
+
33
+ # Stores the original path. If at any point we move to the
34
+ # cached directory, we still have the original path to copy from.
35
+ @original_path = @path
36
+ end
37
+
38
+ def remote!
39
+ @local_specs = nil
40
+ @allow_remote = true
41
+ end
42
+
43
+ def cached!
44
+ @local_specs = nil
45
+ @allow_cached = true
46
+ end
47
+
48
+ def self.from_lock(options)
49
+ new(options.merge("path" => options.delete("remote")))
50
+ end
51
+
52
+ def to_lock
53
+ out = String.new("PATH\n")
54
+ out << " remote: #{lockfile_path}\n"
55
+ out << " glob: #{@glob}\n" unless @glob == DEFAULT_GLOB
56
+ out << " specs:\n"
57
+ end
58
+
59
+ def to_s
60
+ "source at `#{@path}`"
61
+ end
62
+
63
+ def hash
64
+ [self.class, expanded_path, version].hash
65
+ end
66
+
67
+ def eql?(other)
68
+ return unless other.class == self.class
69
+ expanded_original_path == other.expanded_original_path &&
70
+ version == other.version
71
+ end
72
+
73
+ alias_method :==, :eql?
74
+
75
+ def name
76
+ File.basename(expanded_path.to_s)
77
+ end
78
+
79
+ def install(spec, options = {})
80
+ print_using_message "Using #{version_message(spec)} from #{self}"
81
+ generate_bin(spec, :disable_extensions => true)
82
+ nil # no post-install message
83
+ end
84
+
85
+ def cache(spec, custom_path = nil)
86
+ app_cache_path = app_cache_path(custom_path)
87
+ return unless Bundler.feature_flag.cache_all?
88
+ return if expand(@original_path).to_s.index(root_path.to_s + "/") == 0
89
+
90
+ unless @original_path.exist?
91
+ raise GemNotFound, "Can't cache gem #{version_message(spec)} because #{self} is missing!"
92
+ end
93
+
94
+ FileUtils.rm_rf(app_cache_path)
95
+ FileUtils.cp_r("#{@original_path}/.", app_cache_path)
96
+ FileUtils.touch(app_cache_path.join(".bundlecache"))
97
+ end
98
+
99
+ def local_specs(*)
100
+ @local_specs ||= load_spec_files
101
+ end
102
+
103
+ def specs
104
+ if has_app_cache?
105
+ @path = app_cache_path
106
+ @expanded_path = nil # Invalidate
107
+ end
108
+ local_specs
109
+ end
110
+
111
+ def app_cache_dirname
112
+ name
113
+ end
114
+
115
+ def root
116
+ Bundler.root
117
+ end
118
+
119
+ def expanded_original_path
120
+ @expanded_original_path ||= expand(original_path)
121
+ end
122
+
123
+ private
124
+
125
+ def expanded_path
126
+ @expanded_path ||= expand(path)
127
+ end
128
+
129
+ def expand(somepath)
130
+ somepath.expand_path(root_path)
131
+ rescue ArgumentError => e
132
+ Bundler.ui.debug(e)
133
+ raise PathError, "There was an error while trying to use the path " \
134
+ "`#{somepath}`.\nThe error message was: #{e.message}."
135
+ end
136
+
137
+ def lockfile_path
138
+ return relative_path(original_path) if original_path.absolute?
139
+ expand(original_path).relative_path_from(Bundler.root)
140
+ end
141
+
142
+ def app_cache_path(custom_path = nil)
143
+ @app_cache_path ||= Bundler.app_cache(custom_path).join(app_cache_dirname)
144
+ end
145
+
146
+ def has_app_cache?
147
+ SharedHelpers.in_bundle? && app_cache_path.exist?
148
+ end
149
+
150
+ def load_gemspec(file)
151
+ return unless spec = Bundler.load_gemspec(file)
152
+ Bundler.rubygems.set_installed_by_version(spec)
153
+ spec
154
+ end
155
+
156
+ def validate_spec(spec)
157
+ Bundler.rubygems.validate(spec)
158
+ end
159
+
160
+ def load_spec_files
161
+ index = Index.new
162
+
163
+ if File.directory?(expanded_path)
164
+ # We sort depth-first since `<<` will override the earlier-found specs
165
+ Dir["#{expanded_path}/#{@glob}"].sort_by {|p| -p.split(File::SEPARATOR).size }.each do |file|
166
+ next unless spec = load_gemspec(file)
167
+ spec.source = self
168
+
169
+ # Validation causes extension_dir to be calculated, which depends
170
+ # on #source, so we validate here instead of load_gemspec
171
+ validate_spec(spec)
172
+ index << spec
173
+ end
174
+
175
+ if index.empty? && @name && @version
176
+ index << Gem::Specification.new do |s|
177
+ s.name = @name
178
+ s.source = self
179
+ s.version = Gem::Version.new(@version)
180
+ s.platform = Gem::Platform::RUBY
181
+ s.summary = "Fake gemspec for #{@name}"
182
+ s.relative_loaded_from = "#{@name}.gemspec"
183
+ s.authors = ["no one"]
184
+ if expanded_path.join("bin").exist?
185
+ executables = expanded_path.join("bin").children
186
+ executables.reject! {|p| File.directory?(p) }
187
+ s.executables = executables.map {|c| c.basename.to_s }
188
+ end
189
+ end
190
+ end
191
+ else
192
+ message = String.new("The path `#{expanded_path}` ")
193
+ message << if File.exist?(expanded_path)
194
+ "is not a directory."
195
+ else
196
+ "does not exist."
197
+ end
198
+ raise PathError, message
199
+ end
200
+
201
+ index
202
+ end
203
+
204
+ def relative_path(path = self.path)
205
+ if path.to_s.start_with?(root_path.to_s)
206
+ return path.relative_path_from(root_path)
207
+ end
208
+ path
209
+ end
210
+
211
+ def generate_bin(spec, options = {})
212
+ gem_dir = Pathname.new(spec.full_gem_path)
213
+
214
+ # Some gem authors put absolute paths in their gemspec
215
+ # and we have to save them from themselves
216
+ spec.files = spec.files.map do |p|
217
+ next p unless p =~ /\A#{Pathname::SEPARATOR_PAT}/
218
+ next if File.directory?(p)
219
+ begin
220
+ Pathname.new(p).relative_path_from(gem_dir).to_s
221
+ rescue ArgumentError
222
+ p
223
+ end
224
+ end.compact
225
+
226
+ installer = Path::Installer.new(
227
+ spec,
228
+ :env_shebang => false,
229
+ :disable_extensions => options[:disable_extensions],
230
+ :build_args => options[:build_args],
231
+ :bundler_extension_cache_path => extension_cache_path(spec)
232
+ )
233
+ installer.post_install
234
+ rescue Gem::InvalidSpecificationException => e
235
+ Bundler.ui.warn "\n#{spec.name} at #{spec.full_gem_path} did not have a valid gemspec.\n" \
236
+ "This prevents bundler from installing bins or native extensions, but " \
237
+ "that may not affect its functionality."
238
+
239
+ if !spec.extensions.empty? && !spec.email.empty?
240
+ Bundler.ui.warn "If you need to use this package without installing it from a gem " \
241
+ "repository, please contact #{spec.email} and ask them " \
242
+ "to modify their .gemspec so it can work with `gem build`."
243
+ end
244
+
245
+ Bundler.ui.warn "The validation message from RubyGems was:\n #{e.message}"
246
+ end
247
+ end
248
+ end
249
+ end