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,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class SimilarityDetector
5
+ SimilarityScore = Struct.new(:string, :distance)
6
+
7
+ # initialize with an array of words to be matched against
8
+ def initialize(corpus)
9
+ @corpus = corpus
10
+ end
11
+
12
+ # return an array of words similar to 'word' from the corpus
13
+ def similar_words(word, limit = 3)
14
+ words_by_similarity = @corpus.map {|w| SimilarityScore.new(w, levenshtein_distance(word, w)) }
15
+ words_by_similarity.select {|s| s.distance <= limit }.sort_by(&:distance).map(&:string)
16
+ end
17
+
18
+ # return the result of 'similar_words', concatenated into a list
19
+ # (eg "a, b, or c")
20
+ def similar_word_list(word, limit = 3)
21
+ words = similar_words(word, limit)
22
+ if words.length == 1
23
+ words[0]
24
+ elsif words.length > 1
25
+ [words[0..-2].join(", "), words[-1]].join(" or ")
26
+ end
27
+ end
28
+
29
+ protected
30
+
31
+ # http://www.informit.com/articles/article.aspx?p=683059&seqNum=36
32
+ def levenshtein_distance(this, that, ins = 2, del = 2, sub = 1)
33
+ # ins, del, sub are weighted costs
34
+ return nil if this.nil?
35
+ return nil if that.nil?
36
+ dm = [] # distance matrix
37
+
38
+ # Initialize first row values
39
+ dm[0] = (0..this.length).collect {|i| i * ins }
40
+ fill = [0] * (this.length - 1)
41
+
42
+ # Initialize first column values
43
+ (1..that.length).each do |i|
44
+ dm[i] = [i * del, fill.flatten]
45
+ end
46
+
47
+ # populate matrix
48
+ (1..that.length).each do |i|
49
+ (1..this.length).each do |j|
50
+ # critical comparison
51
+ dm[i][j] = [
52
+ dm[i - 1][j - 1] + (this[j - 1] == that[i - 1] ? 0 : sub),
53
+ dm[i][j - 1] + ins,
54
+ dm[i - 1][j] + del
55
+ ].min
56
+ end
57
+ end
58
+
59
+ # The last value in matrix is the Levenshtein distance between the strings
60
+ dm[that.length][this.length]
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Source
5
+ autoload :Gemspec, "bundler/source/gemspec"
6
+ autoload :Git, "bundler/source/git"
7
+ autoload :Metadata, "bundler/source/metadata"
8
+ autoload :Path, "bundler/source/path"
9
+ autoload :Rubygems, "bundler/source/rubygems"
10
+
11
+ attr_accessor :dependency_names
12
+
13
+ def unmet_deps
14
+ specs.unmet_dependency_names
15
+ end
16
+
17
+ def version_message(spec)
18
+ message = "#{spec.name} #{spec.version}"
19
+ message += " (#{spec.platform})" if spec.platform != Gem::Platform::RUBY && !spec.platform.nil?
20
+
21
+ if Bundler.locked_gems
22
+ locked_spec = Bundler.locked_gems.specs.find {|s| s.name == spec.name }
23
+ locked_spec_version = locked_spec.version if locked_spec
24
+ if locked_spec_version && spec.version != locked_spec_version
25
+ message += Bundler.ui.add_color(" (was #{locked_spec_version})", version_color(spec.version, locked_spec_version))
26
+ end
27
+ end
28
+
29
+ message
30
+ end
31
+
32
+ def can_lock?(spec)
33
+ spec.source == self
34
+ end
35
+
36
+ # it's possible that gems from one source depend on gems from some
37
+ # other source, so now we download gemspecs and iterate over those
38
+ # dependencies, looking for gems we don't have info on yet.
39
+ def double_check_for(*); end
40
+
41
+ def dependency_names_to_double_check
42
+ specs.dependency_names
43
+ end
44
+
45
+ def include?(other)
46
+ other == self
47
+ end
48
+
49
+ def inspect
50
+ "#<#{self.class}:0x#{object_id} #{self}>"
51
+ end
52
+
53
+ def path?
54
+ instance_of?(Bundler::Source::Path)
55
+ end
56
+
57
+ def extension_cache_path(spec)
58
+ return unless Bundler.feature_flag.global_gem_cache?
59
+ return unless source_slug = extension_cache_slug(spec)
60
+ Bundler.user_cache.join(
61
+ "extensions", Gem::Platform.local.to_s, Bundler.ruby_scope,
62
+ source_slug, spec.full_name
63
+ )
64
+ end
65
+
66
+ private
67
+
68
+ def version_color(spec_version, locked_spec_version)
69
+ if Gem::Version.correct?(spec_version) && Gem::Version.correct?(locked_spec_version)
70
+ # display yellow if there appears to be a regression
71
+ earlier_version?(spec_version, locked_spec_version) ? :yellow : :green
72
+ else
73
+ # default to green if the versions cannot be directly compared
74
+ :green
75
+ end
76
+ end
77
+
78
+ def earlier_version?(spec_version, locked_spec_version)
79
+ Gem::Version.new(spec_version) < Gem::Version.new(locked_spec_version)
80
+ end
81
+
82
+ def print_using_message(message)
83
+ if !message.include?("(was ") && Bundler.feature_flag.suppress_install_using_messages?
84
+ Bundler.ui.debug message
85
+ else
86
+ Bundler.ui.info message
87
+ end
88
+ end
89
+
90
+ def extension_cache_slug(_)
91
+ nil
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Source
5
+ class Gemspec < Path
6
+ attr_reader :gemspec
7
+
8
+ def initialize(options)
9
+ super
10
+ @gemspec = options["gemspec"]
11
+ end
12
+
13
+ def as_path_source
14
+ Path.new(options)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,329 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/vendored_fileutils"
4
+ require "uri"
5
+
6
+ module Bundler
7
+ class Source
8
+ class Git < Path
9
+ autoload :GitProxy, "bundler/source/git/git_proxy"
10
+
11
+ attr_reader :uri, :ref, :branch, :options, :submodules
12
+
13
+ def initialize(options)
14
+ @options = options
15
+ @glob = options["glob"] || DEFAULT_GLOB
16
+
17
+ @allow_cached = false
18
+ @allow_remote = false
19
+
20
+ # Stringify options that could be set as symbols
21
+ %w[ref branch tag revision].each {|k| options[k] = options[k].to_s if options[k] }
22
+
23
+ @uri = options["uri"] || ""
24
+ @safe_uri = URICredentialsFilter.credential_filtered_uri(@uri)
25
+ @branch = options["branch"]
26
+ @ref = options["ref"] || options["branch"] || options["tag"] || "master"
27
+ @submodules = options["submodules"]
28
+ @name = options["name"]
29
+ @version = options["version"].to_s.strip.gsub("-", ".pre.")
30
+
31
+ @copied = false
32
+ @local = false
33
+ end
34
+
35
+ def self.from_lock(options)
36
+ new(options.merge("uri" => options.delete("remote")))
37
+ end
38
+
39
+ def to_lock
40
+ out = String.new("GIT\n")
41
+ out << " remote: #{@uri}\n"
42
+ out << " revision: #{revision}\n"
43
+ %w[ref branch tag submodules].each do |opt|
44
+ out << " #{opt}: #{options[opt]}\n" if options[opt]
45
+ end
46
+ out << " glob: #{@glob}\n" unless @glob == DEFAULT_GLOB
47
+ out << " specs:\n"
48
+ end
49
+
50
+ def hash
51
+ [self.class, uri, ref, branch, name, version, submodules].hash
52
+ end
53
+
54
+ def eql?(other)
55
+ other.is_a?(Git) && uri == other.uri && ref == other.ref &&
56
+ branch == other.branch && name == other.name &&
57
+ version == other.version && submodules == other.submodules
58
+ end
59
+
60
+ alias_method :==, :eql?
61
+
62
+ def to_s
63
+ at = if local?
64
+ path
65
+ elsif user_ref = options["ref"]
66
+ if ref =~ /\A[a-z0-9]{4,}\z/i
67
+ shortref_for_display(user_ref)
68
+ else
69
+ user_ref
70
+ end
71
+ else
72
+ ref
73
+ end
74
+
75
+ rev = begin
76
+ "@#{shortref_for_display(revision)}"
77
+ rescue GitError
78
+ nil
79
+ end
80
+
81
+ "#{@safe_uri} (at #{at}#{rev})"
82
+ end
83
+
84
+ def name
85
+ File.basename(@uri, ".git")
86
+ end
87
+
88
+ # This is the path which is going to contain a specific
89
+ # checkout of the git repository. When using local git
90
+ # repos, this is set to the local repo.
91
+ def install_path
92
+ @install_path ||= begin
93
+ git_scope = "#{base_name}-#{shortref_for_path(revision)}"
94
+
95
+ path = Bundler.install_path.join(git_scope)
96
+
97
+ if !path.exist? && Bundler.requires_sudo?
98
+ Bundler.user_bundle_path.join(Bundler.ruby_scope).join(git_scope)
99
+ else
100
+ path
101
+ end
102
+ end
103
+ end
104
+
105
+ alias_method :path, :install_path
106
+
107
+ def extension_dir_name
108
+ "#{base_name}-#{shortref_for_path(revision)}"
109
+ end
110
+
111
+ def unlock!
112
+ git_proxy.revision = nil
113
+ options["revision"] = nil
114
+
115
+ @unlocked = true
116
+ end
117
+
118
+ def local_override!(path)
119
+ return false if local?
120
+
121
+ path = Pathname.new(path)
122
+ path = path.expand_path(Bundler.root) unless path.relative?
123
+
124
+ unless options["branch"] || Bundler.settings[:disable_local_branch_check]
125
+ raise GitError, "Cannot use local override for #{name} at #{path} because " \
126
+ ":branch is not specified in Gemfile. Specify a branch or use " \
127
+ "`bundle config --delete` to remove the local override"
128
+ end
129
+
130
+ unless path.exist?
131
+ raise GitError, "Cannot use local override for #{name} because #{path} " \
132
+ "does not exist. Check `bundle config --delete` to remove the local override"
133
+ end
134
+
135
+ set_local!(path)
136
+
137
+ # Create a new git proxy without the cached revision
138
+ # so the Gemfile.lock always picks up the new revision.
139
+ @git_proxy = GitProxy.new(path, uri, ref)
140
+
141
+ if git_proxy.branch != options["branch"] && !Bundler.settings[:disable_local_branch_check]
142
+ raise GitError, "Local override for #{name} at #{path} is using branch " \
143
+ "#{git_proxy.branch} but Gemfile specifies #{options["branch"]}"
144
+ end
145
+
146
+ changed = cached_revision && cached_revision != git_proxy.revision
147
+
148
+ if changed && !@unlocked && !git_proxy.contains?(cached_revision)
149
+ raise GitError, "The Gemfile lock is pointing to revision #{shortref_for_display(cached_revision)} " \
150
+ "but the current branch in your local override for #{name} does not contain such commit. " \
151
+ "Please make sure your branch is up to date."
152
+ end
153
+
154
+ changed
155
+ end
156
+
157
+ def specs(*)
158
+ set_local!(app_cache_path) if has_app_cache? && !local?
159
+
160
+ if requires_checkout? && !@copied
161
+ fetch
162
+ git_proxy.copy_to(install_path, submodules)
163
+ serialize_gemspecs_in(install_path)
164
+ @copied = true
165
+ end
166
+
167
+ local_specs
168
+ end
169
+
170
+ def install(spec, options = {})
171
+ force = options[:force]
172
+
173
+ print_using_message "Using #{version_message(spec)} from #{self}"
174
+
175
+ if (requires_checkout? && !@copied) || force
176
+ Bundler.ui.debug " * Checking out revision: #{ref}"
177
+ git_proxy.copy_to(install_path, submodules)
178
+ serialize_gemspecs_in(install_path)
179
+ @copied = true
180
+ end
181
+
182
+ generate_bin_options = { :disable_extensions => !Bundler.rubygems.spec_missing_extensions?(spec), :build_args => options[:build_args] }
183
+ generate_bin(spec, generate_bin_options)
184
+
185
+ requires_checkout? ? spec.post_install_message : nil
186
+ end
187
+
188
+ def cache(spec, custom_path = nil)
189
+ app_cache_path = app_cache_path(custom_path)
190
+ return unless Bundler.feature_flag.cache_all?
191
+ return if path == app_cache_path
192
+ cached!
193
+ FileUtils.rm_rf(app_cache_path)
194
+ git_proxy.checkout if requires_checkout?
195
+ git_proxy.copy_to(app_cache_path, @submodules)
196
+ serialize_gemspecs_in(app_cache_path)
197
+ end
198
+
199
+ def load_spec_files
200
+ super
201
+ rescue PathError => e
202
+ Bundler.ui.trace e
203
+ raise GitError, "#{self} is not yet checked out. Run `bundle install` first."
204
+ end
205
+
206
+ # This is the path which is going to contain a cache
207
+ # of the git repository. When using the same git repository
208
+ # across different projects, this cache will be shared.
209
+ # When using local git repos, this is set to the local repo.
210
+ def cache_path
211
+ @cache_path ||= begin
212
+ if Bundler.requires_sudo? || Bundler.feature_flag.global_gem_cache?
213
+ Bundler.user_cache
214
+ else
215
+ Bundler.bundle_path.join("cache", "bundler")
216
+ end.join("git", git_scope)
217
+ end
218
+ end
219
+
220
+ def app_cache_dirname
221
+ "#{base_name}-#{shortref_for_path(cached_revision || revision)}"
222
+ end
223
+
224
+ def revision
225
+ git_proxy.revision
226
+ end
227
+
228
+ def allow_git_ops?
229
+ @allow_remote || @allow_cached
230
+ end
231
+
232
+ private
233
+
234
+ def serialize_gemspecs_in(destination)
235
+ destination = destination.expand_path(Bundler.root) if destination.relative?
236
+ Dir["#{destination}/#{@glob}"].each do |spec_path|
237
+ # Evaluate gemspecs and cache the result. Gemspecs
238
+ # in git might require git or other dependencies.
239
+ # The gemspecs we cache should already be evaluated.
240
+ spec = Bundler.load_gemspec(spec_path)
241
+ next unless spec
242
+ Bundler.rubygems.set_installed_by_version(spec)
243
+ Bundler.rubygems.validate(spec)
244
+ File.open(spec_path, "wb") {|file| file.write(spec.to_ruby) }
245
+ end
246
+ end
247
+
248
+ def set_local!(path)
249
+ @local = true
250
+ @local_specs = @git_proxy = nil
251
+ @cache_path = @install_path = path
252
+ end
253
+
254
+ def has_app_cache?
255
+ cached_revision && super
256
+ end
257
+
258
+ def local?
259
+ @local
260
+ end
261
+
262
+ def requires_checkout?
263
+ allow_git_ops? && !local?
264
+ end
265
+
266
+ def base_name
267
+ File.basename(uri.sub(%r{^(\w+://)?([^/:]+:)?(//\w*/)?(\w*/)*}, ""), ".git")
268
+ end
269
+
270
+ def shortref_for_display(ref)
271
+ ref[0..6]
272
+ end
273
+
274
+ def shortref_for_path(ref)
275
+ ref[0..11]
276
+ end
277
+
278
+ def uri_hash
279
+ if uri =~ %r{^\w+://(\w+@)?}
280
+ # Downcase the domain component of the URI
281
+ # and strip off a trailing slash, if one is present
282
+ input = URI.parse(uri).normalize.to_s.sub(%r{/$}, "")
283
+ else
284
+ # If there is no URI scheme, assume it is an ssh/git URI
285
+ input = uri
286
+ end
287
+ SharedHelpers.digest(:SHA1).hexdigest(input)
288
+ end
289
+
290
+ def cached_revision
291
+ options["revision"]
292
+ end
293
+
294
+ def cached?
295
+ cache_path.exist?
296
+ end
297
+
298
+ def git_proxy
299
+ @git_proxy ||= GitProxy.new(cache_path, uri, ref, cached_revision, self)
300
+ end
301
+
302
+ def fetch
303
+ git_proxy.checkout
304
+ rescue GitError => e
305
+ raise unless Bundler.feature_flag.allow_offline_install?
306
+ Bundler.ui.warn "Using cached git data because of network errors:\n#{e}"
307
+ end
308
+
309
+ # no-op, since we validate when re-serializing the gemspec
310
+ def validate_spec(_spec); end
311
+
312
+ if Bundler.rubygems.stubs_provide_full_functionality?
313
+ def load_gemspec(file)
314
+ stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent)
315
+ stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s.untaint
316
+ StubSpecification.from_stub(stub)
317
+ end
318
+ end
319
+
320
+ def git_scope
321
+ "#{base_name}-#{uri_hash}"
322
+ end
323
+
324
+ def extension_cache_slug(_)
325
+ extension_dir_name
326
+ end
327
+ end
328
+ end
329
+ end