bundler 1.15.1 → 1.17.3

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 (294) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +320 -0
  3. data/README.md +17 -8
  4. data/bundler.gemspec +25 -9
  5. data/exe/bundle +1 -6
  6. data/exe/bundle_ruby +4 -3
  7. data/lib/bundler/build_metadata.rb +53 -0
  8. data/lib/bundler/capistrano.rb +5 -0
  9. data/lib/bundler/cli/add.rb +15 -6
  10. data/lib/bundler/cli/binstubs.rb +17 -9
  11. data/lib/bundler/cli/cache.rb +5 -4
  12. data/lib/bundler/cli/check.rb +3 -5
  13. data/lib/bundler/cli/clean.rb +5 -6
  14. data/lib/bundler/cli/common.rb +11 -2
  15. data/lib/bundler/cli/config.rb +2 -1
  16. data/lib/bundler/cli/console.rb +2 -1
  17. data/lib/bundler/cli/doctor.rb +48 -1
  18. data/lib/bundler/cli/exec.rb +6 -5
  19. data/lib/bundler/cli/gem.rb +13 -8
  20. data/lib/bundler/cli/info.rb +0 -1
  21. data/lib/bundler/cli/init.rb +18 -6
  22. data/lib/bundler/cli/inject.rb +1 -0
  23. data/lib/bundler/cli/install.rb +64 -77
  24. data/lib/bundler/cli/issue.rb +1 -1
  25. data/lib/bundler/cli/list.rb +58 -0
  26. data/lib/bundler/cli/lock.rb +0 -1
  27. data/lib/bundler/cli/open.rb +2 -2
  28. data/lib/bundler/cli/outdated.rb +20 -9
  29. data/lib/bundler/cli/package.rb +9 -6
  30. data/lib/bundler/cli/platform.rb +1 -0
  31. data/lib/bundler/cli/plugin.rb +1 -0
  32. data/lib/bundler/cli/pristine.rb +20 -6
  33. data/lib/bundler/cli/remove.rb +18 -0
  34. data/lib/bundler/cli/show.rb +0 -1
  35. data/lib/bundler/cli/update.rb +35 -7
  36. data/lib/bundler/cli/viz.rb +4 -0
  37. data/lib/bundler/cli.rb +234 -90
  38. data/lib/bundler/compact_index_client/cache.rb +1 -2
  39. data/lib/bundler/compact_index_client/updater.rb +35 -7
  40. data/lib/bundler/compact_index_client.rb +1 -0
  41. data/lib/bundler/compatibility_guard.rb +14 -0
  42. data/lib/bundler/constants.rb +1 -0
  43. data/lib/bundler/current_ruby.rb +13 -5
  44. data/lib/bundler/definition.rb +192 -139
  45. data/lib/bundler/dep_proxy.rb +3 -1
  46. data/lib/bundler/dependency.rb +9 -9
  47. data/lib/bundler/deployment.rb +1 -1
  48. data/lib/bundler/deprecate.rb +15 -3
  49. data/lib/bundler/dsl.rb +115 -64
  50. data/lib/bundler/endpoint_specification.rb +10 -1
  51. data/lib/bundler/env.rb +90 -29
  52. data/lib/bundler/environment_preserver.rb +27 -6
  53. data/lib/bundler/errors.rb +1 -0
  54. data/lib/bundler/feature_flag.rb +46 -4
  55. data/lib/bundler/fetcher/base.rb +1 -0
  56. data/lib/bundler/fetcher/compact_index.rb +2 -11
  57. data/lib/bundler/fetcher/dependency.rb +2 -1
  58. data/lib/bundler/fetcher/downloader.rb +11 -5
  59. data/lib/bundler/fetcher/index.rb +3 -2
  60. data/lib/bundler/fetcher.rb +18 -11
  61. data/lib/bundler/friendly_errors.rb +6 -1
  62. data/lib/bundler/gem_helper.rb +19 -10
  63. data/lib/bundler/gem_helpers.rb +1 -0
  64. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  65. data/lib/bundler/gem_tasks.rb +1 -0
  66. data/lib/bundler/gem_version_promoter.rb +17 -2
  67. data/lib/bundler/gemdeps.rb +1 -0
  68. data/lib/bundler/graph.rb +1 -0
  69. data/lib/bundler/index.rb +8 -8
  70. data/lib/bundler/injector.rb +192 -30
  71. data/lib/bundler/inline.rb +10 -10
  72. data/lib/bundler/installer/gem_installer.rb +12 -2
  73. data/lib/bundler/installer/parallel_installer.rb +78 -42
  74. data/lib/bundler/installer/standalone.rb +1 -0
  75. data/lib/bundler/installer.rb +138 -53
  76. data/lib/bundler/lazy_specification.rb +3 -2
  77. data/lib/bundler/lockfile_generator.rb +95 -0
  78. data/lib/bundler/lockfile_parser.rb +10 -4
  79. data/lib/bundler/match_platform.rb +1 -0
  80. data/lib/bundler/mirror.rb +8 -5
  81. data/lib/bundler/plugin/api/source.rb +9 -2
  82. data/lib/bundler/plugin/events.rb +61 -0
  83. data/lib/bundler/plugin/index.rb +7 -2
  84. data/lib/bundler/plugin/installer.rb +7 -6
  85. data/lib/bundler/plugin/source_list.rb +7 -8
  86. data/lib/bundler/plugin.rb +13 -5
  87. data/lib/bundler/process_lock.rb +24 -0
  88. data/lib/bundler/psyched_yaml.rb +10 -0
  89. data/lib/bundler/remote_specification.rb +10 -1
  90. data/lib/bundler/resolver/spec_group.rb +106 -0
  91. data/lib/bundler/resolver.rb +158 -195
  92. data/lib/bundler/retry.rb +1 -0
  93. data/lib/bundler/ruby_dsl.rb +1 -0
  94. data/lib/bundler/ruby_version.rb +2 -1
  95. data/lib/bundler/rubygems_ext.rb +5 -4
  96. data/lib/bundler/rubygems_gem_installer.rb +31 -1
  97. data/lib/bundler/rubygems_integration.rb +71 -32
  98. data/lib/bundler/runtime.rb +11 -9
  99. data/lib/bundler/settings/validator.rb +102 -0
  100. data/lib/bundler/settings.rb +213 -86
  101. data/lib/bundler/setup.rb +4 -7
  102. data/lib/bundler/shared_helpers.rb +131 -26
  103. data/lib/bundler/similarity_detector.rb +1 -0
  104. data/lib/bundler/source/gemspec.rb +1 -0
  105. data/lib/bundler/source/git/git_proxy.rb +21 -11
  106. data/lib/bundler/source/git.rb +24 -19
  107. data/lib/bundler/source/metadata.rb +62 -0
  108. data/lib/bundler/source/path/installer.rb +2 -0
  109. data/lib/bundler/source/path.rb +11 -7
  110. data/lib/bundler/source/rubygems/remote.rb +8 -2
  111. data/lib/bundler/source/rubygems.rb +161 -84
  112. data/lib/bundler/source.rb +36 -0
  113. data/lib/bundler/source_list.rb +75 -15
  114. data/lib/bundler/spec_set.rb +12 -6
  115. data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  116. data/lib/bundler/stub_specification.rb +1 -0
  117. data/lib/bundler/templates/.document +1 -0
  118. data/lib/bundler/templates/Executable +12 -0
  119. data/lib/bundler/templates/Executable.bundler +105 -0
  120. data/lib/bundler/templates/Gemfile +3 -0
  121. data/lib/bundler/templates/gems.rb +8 -0
  122. data/lib/bundler/templates/newgem/Gemfile.tt +2 -0
  123. data/lib/bundler/templates/newgem/README.md.tt +1 -1
  124. data/lib/bundler/templates/newgem/gitignore.tt +0 -1
  125. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +1 -0
  126. data/lib/bundler/templates/newgem/newgem.gemspec.tt +12 -3
  127. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  128. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +0 -2
  129. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  130. data/lib/bundler/ui/rg_proxy.rb +1 -0
  131. data/lib/bundler/ui/shell.rb +17 -4
  132. data/lib/bundler/ui/silent.rb +1 -0
  133. data/lib/bundler/ui.rb +1 -0
  134. data/lib/bundler/uri_credentials_filter.rb +1 -0
  135. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  136. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  137. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  138. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  139. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  140. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -0
  141. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -0
  142. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -0
  143. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -0
  144. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -0
  145. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -0
  146. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -0
  147. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +15 -4
  148. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -2
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
  150. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  151. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  152. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  153. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +491 -148
  154. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  155. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  156. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  157. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +3 -1
  158. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +1 -0
  159. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +1 -0
  160. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +9 -1
  161. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +45 -8
  162. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +9 -3
  163. data/lib/bundler/vendor/thor/lib/thor/actions.rb +6 -3
  164. data/lib/bundler/vendor/thor/lib/thor/base.rb +27 -4
  165. data/lib/bundler/vendor/thor/lib/thor/command.rb +9 -7
  166. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +12 -0
  167. data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  168. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  169. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +5 -5
  170. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +6 -5
  171. data/lib/bundler/vendor/thor/lib/thor/runner.rb +6 -4
  172. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +10 -9
  173. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  174. data/lib/bundler/vendor/thor/lib/thor.rb +25 -8
  175. data/lib/bundler/vendored_fileutils.rb +9 -0
  176. data/lib/bundler/vendored_molinillo.rb +1 -0
  177. data/lib/bundler/vendored_persistent.rb +35 -0
  178. data/lib/bundler/vendored_thor.rb +1 -0
  179. data/lib/bundler/version.rb +6 -2
  180. data/lib/bundler/version_ranges.rb +1 -0
  181. data/lib/bundler/vlad.rb +5 -0
  182. data/lib/bundler/worker.rb +1 -0
  183. data/lib/bundler/yaml_serializer.rb +3 -3
  184. data/lib/bundler.rb +86 -52
  185. data/man/bundle-add.1 +18 -3
  186. data/man/bundle-add.1.txt +26 -14
  187. data/man/bundle-add.ronn +13 -2
  188. data/man/bundle-binstubs.1 +11 -1
  189. data/man/bundle-binstubs.1.txt +33 -18
  190. data/man/bundle-binstubs.ronn +15 -1
  191. data/man/bundle-check.1 +4 -4
  192. data/man/bundle-check.1.txt +15 -14
  193. data/man/bundle-check.ronn +3 -3
  194. data/man/bundle-clean.1 +1 -1
  195. data/man/bundle-clean.1.txt +10 -10
  196. data/man/bundle-config.1 +129 -29
  197. data/man/bundle-config.1.txt +285 -174
  198. data/man/bundle-config.ronn +167 -88
  199. data/man/bundle-doctor.1 +44 -0
  200. data/man/bundle-doctor.1.txt +44 -0
  201. data/man/bundle-doctor.ronn +33 -0
  202. data/man/bundle-exec.1 +6 -3
  203. data/man/bundle-exec.1.txt +78 -71
  204. data/man/bundle-exec.ronn +10 -3
  205. data/man/bundle-gem.1 +4 -4
  206. data/man/bundle-gem.1.txt +41 -40
  207. data/man/bundle-gem.ronn +3 -2
  208. data/man/bundle-info.1 +1 -1
  209. data/man/bundle-info.1.txt +8 -8
  210. data/man/bundle-init.1 +9 -4
  211. data/man/bundle-init.1.txt +23 -13
  212. data/man/bundle-init.ronn +15 -4
  213. data/man/bundle-inject.1 +4 -4
  214. data/man/bundle-inject.1.txt +10 -10
  215. data/man/bundle-inject.ronn +3 -3
  216. data/man/bundle-install.1 +31 -28
  217. data/man/bundle-install.1.txt +205 -194
  218. data/man/bundle-install.ronn +44 -35
  219. data/man/bundle-list.1 +50 -0
  220. data/man/bundle-list.1.txt +43 -0
  221. data/man/bundle-list.ronn +33 -0
  222. data/man/bundle-lock.1 +1 -1
  223. data/man/bundle-lock.1.txt +47 -47
  224. data/man/bundle-lock.ronn +1 -1
  225. data/man/bundle-open.1 +1 -1
  226. data/man/bundle-open.1.txt +7 -7
  227. data/man/bundle-outdated.1 +7 -3
  228. data/man/bundle-outdated.1.txt +40 -36
  229. data/man/bundle-outdated.ronn +6 -2
  230. data/man/bundle-package.1 +6 -3
  231. data/man/bundle-package.1.txt +44 -39
  232. data/man/bundle-package.ronn +7 -2
  233. data/man/bundle-platform.1 +1 -1
  234. data/man/bundle-platform.1.txt +13 -13
  235. data/man/bundle-pristine.1 +21 -3
  236. data/man/bundle-pristine.1.txt +33 -10
  237. data/man/bundle-pristine.ronn +24 -3
  238. data/man/bundle-remove.1 +31 -0
  239. data/man/bundle-remove.1.txt +34 -0
  240. data/man/bundle-remove.ronn +23 -0
  241. data/man/bundle-show.1 +3 -3
  242. data/man/bundle-show.1.txt +14 -12
  243. data/man/bundle-show.ronn +3 -2
  244. data/man/bundle-update.1 +13 -9
  245. data/man/bundle-update.1.txt +133 -130
  246. data/man/bundle-update.ronn +21 -17
  247. data/man/bundle-viz.1 +7 -7
  248. data/man/bundle-viz.1.txt +17 -15
  249. data/man/bundle-viz.ronn +6 -6
  250. data/man/bundle.1 +31 -32
  251. data/man/bundle.1.txt +63 -75
  252. data/man/bundle.ronn +35 -47
  253. data/man/gemfile.5 +44 -8
  254. data/man/gemfile.5.ronn +54 -8
  255. data/man/gemfile.5.txt +218 -165
  256. data/man/index.txt +25 -15
  257. metadata +36 -44
  258. data/.codeclimate.yml +0 -25
  259. data/.gitignore +0 -18
  260. data/.rspec +0 -3
  261. data/.rubocop.yml +0 -131
  262. data/.rubocop_todo.yml +0 -418
  263. data/.travis.yml +0 -122
  264. data/CODE_OF_CONDUCT.md +0 -42
  265. data/CONTRIBUTING.md +0 -17
  266. data/Rakefile +0 -346
  267. data/bin/rake +0 -19
  268. data/bin/rspec +0 -15
  269. data/bin/rubocop +0 -17
  270. data/bin/with_rubygems +0 -39
  271. data/doc/README.md +0 -30
  272. data/doc/TROUBLESHOOTING.md +0 -64
  273. data/doc/contributing/BUG_TRIAGE.md +0 -36
  274. data/doc/contributing/COMMUNITY.md +0 -13
  275. data/doc/contributing/GETTING_HELP.md +0 -11
  276. data/doc/contributing/HOW_YOU_CAN_HELP.md +0 -27
  277. data/doc/contributing/ISSUES.md +0 -51
  278. data/doc/contributing/README.md +0 -38
  279. data/doc/development/NEW_FEATURES.md +0 -10
  280. data/doc/development/PULL_REQUESTS.md +0 -40
  281. data/doc/development/README.md +0 -19
  282. data/doc/development/RELEASING.md +0 -9
  283. data/doc/development/SETUP.md +0 -29
  284. data/doc/documentation/README.md +0 -29
  285. data/doc/documentation/VISION.md +0 -26
  286. data/doc/documentation/WRITING.md +0 -54
  287. data/lib/bundler/postit_trampoline.rb +0 -73
  288. data/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
  289. data/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
  290. data/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
  291. data/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
  292. data/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
  293. data/lib/bundler/vendor/postit/lib/postit.rb +0 -15
  294. data/task/release.rake +0 -116
@@ -1,11 +1,23 @@
1
1
  # frozen_string_literal: true
2
+
3
+ begin
4
+ require "rubygems/deprecate"
5
+ rescue LoadError
6
+ # it's fine if it doesn't exist on the current RubyGems...
7
+ nil
8
+ end
9
+
2
10
  module Bundler
3
- if defined? ::Deprecate
11
+ # If Bundler::Deprecate is an autoload constant, we need to define it
12
+ if defined?(Bundler::Deprecate) && !autoload?(:Deprecate)
13
+ # nothing to do!
14
+ elsif defined? ::Deprecate
4
15
  Deprecate = ::Deprecate
5
16
  elsif defined? Gem::Deprecate
6
17
  Deprecate = Gem::Deprecate
7
18
  else
8
- class Deprecate; end
19
+ class Deprecate
20
+ end
9
21
  end
10
22
 
11
23
  unless Deprecate.respond_to?(:skip_during)
@@ -20,7 +32,7 @@ module Bundler
20
32
 
21
33
  unless Deprecate.respond_to?(:skip)
22
34
  def Deprecate.skip
23
- @skip
35
+ @skip ||= false
24
36
  end
25
37
  end
26
38
 
data/lib/bundler/dsl.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/dependency"
3
4
  require "bundler/ruby_dsl"
4
5
 
@@ -14,6 +15,9 @@ module Bundler
14
15
 
15
16
  VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze
16
17
 
18
+ VALID_KEYS = %w[group groups git path glob name branch ref tag require submodules
19
+ platform platforms type source install_if gemfile].freeze
20
+
17
21
  attr_reader :gemspecs
18
22
  attr_accessor :dependencies
19
23
 
@@ -30,14 +34,16 @@ module Bundler
30
34
  @ruby_version = nil
31
35
  @gemspecs = []
32
36
  @gemfile = nil
37
+ @gemfiles = []
33
38
  add_git_sources
34
39
  end
35
40
 
36
41
  def eval_gemfile(gemfile, contents = nil)
37
- expanded_gemfile_path = Pathname.new(gemfile).expand_path
42
+ expanded_gemfile_path = Pathname.new(gemfile).expand_path(@gemfile && @gemfile.parent)
38
43
  original_gemfile = @gemfile
39
44
  @gemfile = expanded_gemfile_path
40
- contents ||= Bundler.read_file(gemfile.to_s)
45
+ @gemfiles << expanded_gemfile_path
46
+ contents ||= Bundler.read_file(@gemfile.to_s)
41
47
  instance_eval(contents.dup.untaint, gemfile.to_s, 1)
42
48
  rescue Exception => e
43
49
  message = "There was an error " \
@@ -87,6 +93,7 @@ module Bundler
87
93
 
88
94
  def gem(name, *args)
89
95
  options = args.last.is_a?(Hash) ? args.pop.dup : {}
96
+ options["gemfile"] = @gemfile
90
97
  version = args || [">= 0"]
91
98
 
92
99
  normalize_options(name, version, options)
@@ -95,25 +102,38 @@ module Bundler
95
102
 
96
103
  # if there's already a dependency with this name we try to prefer one
97
104
  if current = @dependencies.find {|d| d.name == dep.name }
105
+ deleted_dep = @dependencies.delete(current) if current.type == :development
106
+
98
107
  if current.requirement != dep.requirement
99
- if current.type == :development
100
- @dependencies.delete current
101
- else
108
+ unless deleted_dep
102
109
  return if dep.type == :development
110
+
111
+ update_prompt = ""
112
+
113
+ if File.basename(@gemfile) == Injector::INJECTED_GEMS
114
+ if dep.requirements_list.include?(">= 0") && !current.requirements_list.include?(">= 0")
115
+ update_prompt = ". Gem already added"
116
+ else
117
+ update_prompt = ". If you want to update the gem version, run `bundle update #{current.name}`"
118
+
119
+ update_prompt += ". You may also need to change the version requirement specified in the Gemfile if it's too restrictive." unless current.requirements_list.include?(">= 0")
120
+ end
121
+ end
122
+
103
123
  raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \
104
- "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})"
124
+ "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})" \
125
+ "#{update_prompt}"
105
126
  end
106
127
 
107
128
  else
108
129
  Bundler.ui.warn "Your Gemfile lists the gem #{current.name} (#{current.requirement}) more than once.\n" \
109
130
  "You should probably keep only one of them.\n" \
131
+ "Remove any duplicate entries and specify the gem only once (per group).\n" \
110
132
  "While it's not a problem now, it could cause errors if you change the version of one of them later."
111
133
  end
112
134
 
113
135
  if current.source != dep.source
114
- if current.type == :development
115
- @dependencies.delete current
116
- else
136
+ unless deleted_dep
117
137
  return if dep.type == :development
118
138
  raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
119
139
  "You specified that #{dep.name} (#{dep.requirement}) should come from " \
@@ -128,10 +148,12 @@ module Bundler
128
148
  def source(source, *args, &blk)
129
149
  options = args.last.is_a?(Hash) ? args.pop.dup : {}
130
150
  options = normalize_hash(options)
151
+ source = normalize_source(source)
152
+
131
153
  if options.key?("type")
132
154
  options["type"] = options["type"].to_s
133
155
  unless Plugin.source?(options["type"])
134
- raise "No sources available for #{options["type"]}"
156
+ raise InvalidOption, "No plugin sources available for #{options["type"]}"
135
157
  end
136
158
 
137
159
  unless block_given?
@@ -141,12 +163,10 @@ module Bundler
141
163
  source_opts = options.merge("uri" => source)
142
164
  with_source(@sources.add_plugin_source(options["type"], source_opts), &blk)
143
165
  elsif block_given?
144
- source = normalize_source(source)
145
166
  with_source(@sources.add_rubygems_source("remotes" => source), &blk)
146
167
  else
147
- source = normalize_source(source)
148
168
  check_primary_source_safety(@sources)
149
- @sources.add_rubygems_remote(source)
169
+ @sources.global_rubygems_source = source
150
170
  end
151
171
  end
152
172
 
@@ -164,6 +184,19 @@ module Bundler
164
184
  end
165
185
 
166
186
  def path(path, options = {}, &blk)
187
+ unless block_given?
188
+ msg = "You can no longer specify a path source by itself. Instead, \n" \
189
+ "either use the :path option on a gem, or specify the gems that \n" \
190
+ "bundler should find in the path source by passing a block to \n" \
191
+ "the path method, like: \n\n" \
192
+ " path 'dir/containing/rails' do\n" \
193
+ " gem 'rails'\n" \
194
+ " end\n\n"
195
+
196
+ raise DeprecatedError, msg if Bundler.feature_flag.disable_multisource?
197
+ SharedHelpers.major_deprecation(2, msg.strip)
198
+ end
199
+
167
200
  source_options = normalize_hash(options).merge(
168
201
  "path" => Pathname.new(path),
169
202
  "root_path" => gemfile_root,
@@ -190,6 +223,7 @@ module Bundler
190
223
 
191
224
  def github(repo, options = {})
192
225
  raise ArgumentError, "GitHub sources require a block" unless block_given?
226
+ raise DeprecatedError, "The #github method has been removed" if Bundler.feature_flag.skip_default_git_sources?
193
227
  github_uri = @git_sources["github"].call(repo)
194
228
  git_options = normalize_hash(options).merge("uri" => github_uri)
195
229
  git_source = @sources.add_git_source(git_options)
@@ -197,16 +231,16 @@ module Bundler
197
231
  end
198
232
 
199
233
  def to_definition(lockfile, unlock)
200
- Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups)
234
+ Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles)
201
235
  end
202
236
 
203
237
  def group(*args, &blk)
204
- opts = Hash === args.last ? args.pop.dup : {}
205
- normalize_group_options(opts, args)
238
+ options = args.last.is_a?(Hash) ? args.pop.dup : {}
239
+ normalize_group_options(options, args)
206
240
 
207
241
  @groups.concat args
208
242
 
209
- if opts["optional"]
243
+ if options["optional"]
210
244
  optional_groups = args - @optional_groups
211
245
  @optional_groups.concat optional_groups
212
246
  end
@@ -216,9 +250,9 @@ module Bundler
216
250
  args.each { @groups.pop }
217
251
  end
218
252
 
219
- def install_if(*args, &blk)
253
+ def install_if(*args)
220
254
  @install_conditionals.concat args
221
- blk.call
255
+ yield
222
256
  ensure
223
257
  args.each { @install_conditionals.pop }
224
258
  end
@@ -250,7 +284,12 @@ module Bundler
250
284
  private
251
285
 
252
286
  def add_git_sources
287
+ return if Bundler.feature_flag.skip_default_git_sources?
288
+
253
289
  git_source(:github) do |repo_name|
290
+ warn_deprecated_git_source(:github, <<-'RUBY'.strip, 'Change any "reponame" :github sources to "username/reponame".')
291
+ "https://github.com/#{repo_name}.git"
292
+ RUBY
254
293
  # It would be better to use https instead of the git protocol, but this
255
294
  # can break deployment of existing locked bundles when switching between
256
295
  # different versions of Bundler. The change will be made in 2.0, which
@@ -266,24 +305,30 @@ module Bundler
266
305
  # end
267
306
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
268
307
  # TODO: 2.0 upgrade this setting to the default
269
- if Bundler.settings["github.https"]
308
+ if Bundler.feature_flag.github_https?
309
+ Bundler::SharedHelpers.major_deprecation 2, "The `github.https` setting will be removed"
270
310
  "https://github.com/#{repo_name}.git"
271
311
  else
272
- warn_github_source_change(repo_name)
273
312
  "git://github.com/#{repo_name}.git"
274
313
  end
275
314
  end
276
315
 
277
316
  # TODO: 2.0 remove this deprecated git source
278
317
  git_source(:gist) do |repo_name|
279
- warn_deprecated_git_source(:gist, 'https://gist.github.com/#{repo_name}.git')
318
+ warn_deprecated_git_source(:gist, '"https://gist.github.com/#{repo_name}.git"')
319
+
280
320
  "https://gist.github.com/#{repo_name}.git"
281
321
  end
282
322
 
283
323
  # TODO: 2.0 remove this deprecated git source
284
324
  git_source(:bitbucket) do |repo_name|
285
- user_name, repo_name = repo_name.split "/"
286
- warn_deprecated_git_source(:bitbucket, 'https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git')
325
+ warn_deprecated_git_source(:bitbucket, <<-'RUBY'.strip)
326
+ user_name, repo_name = repo_name.split("/")
327
+ repo_name ||= user_name
328
+ "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
329
+ RUBY
330
+
331
+ user_name, repo_name = repo_name.split("/")
287
332
  repo_name ||= user_name
288
333
  "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
289
334
  end
@@ -308,7 +353,7 @@ module Bundler
308
353
  end
309
354
 
310
355
  def valid_keys
311
- @valid_keys ||= %w(group groups git path glob name branch ref tag require submodules platform platforms type source install_if)
356
+ @valid_keys ||= VALID_KEYS
312
357
  end
313
358
 
314
359
  def normalize_options(name, version, opts)
@@ -318,6 +363,9 @@ module Bundler
318
363
  if name =~ /\s/
319
364
  raise GemfileError, %('#{name}' is not a valid gem name because it contains whitespace)
320
365
  end
366
+ if name.empty?
367
+ raise GemfileError, %(an empty gem name is not valid)
368
+ end
321
369
 
322
370
  normalize_hash(opts)
323
371
 
@@ -355,7 +403,7 @@ module Bundler
355
403
  opts["git"] = @git_sources[git_name].call(opts[git_name])
356
404
  end
357
405
 
358
- %w(git path).each do |type|
406
+ %w[git path].each do |type|
359
407
  next unless param = opts[type]
360
408
  if version.first && version.first =~ /^\s*=?\s*(\d[^\s]*)\s*$/
361
409
  options = opts.merge("name" => name, "version" => $1)
@@ -366,8 +414,8 @@ module Bundler
366
414
  opts["source"] = source
367
415
  end
368
416
 
369
- opts["source"] ||= @source
370
- opts["env"] ||= @env
417
+ opts["source"] ||= @source
418
+ opts["env"] ||= @env
371
419
  opts["platforms"] = platforms.dup
372
420
  opts["group"] = groups
373
421
  opts["should_include"] = install_if
@@ -377,7 +425,7 @@ module Bundler
377
425
  normalize_hash(opts)
378
426
 
379
427
  groups = groups.map {|group| ":#{group}" }.join(", ")
380
- validate_keys("group #{groups}", opts, %w(optional))
428
+ validate_keys("group #{groups}", opts, %w[optional])
381
429
 
382
430
  opts["optional"] ||= false
383
431
  end
@@ -390,25 +438,25 @@ module Bundler
390
438
  raise GemfileError, %(The `branch` option for `#{command}` is not allowed. Only gems with a git source can specify a branch)
391
439
  end
392
440
 
393
- if invalid_keys.any?
394
- message = String.new
395
- message << "You passed #{invalid_keys.map {|k| ":" + k }.join(", ")} "
396
- message << if invalid_keys.size > 1
397
- "as options for #{command}, but they are invalid."
398
- else
399
- "as an option for #{command}, but it is invalid."
400
- end
401
-
402
- message << " Valid options are: #{valid_keys.join(", ")}."
403
- message << " You may be able to resolve this by upgrading Bundler to the newest version."
404
- raise InvalidOption, message
405
- end
441
+ return true unless invalid_keys.any?
442
+
443
+ message = String.new
444
+ message << "You passed #{invalid_keys.map {|k| ":" + k }.join(", ")} "
445
+ message << if invalid_keys.size > 1
446
+ "as options for #{command}, but they are invalid."
447
+ else
448
+ "as an option for #{command}, but it is invalid."
449
+ end
450
+
451
+ message << " Valid options are: #{valid_keys.join(", ")}."
452
+ message << " You may be able to resolve this by upgrading Bundler to the newest version."
453
+ raise InvalidOption, message
406
454
  end
407
455
 
408
456
  def normalize_source(source)
409
457
  case source
410
458
  when :gemcutter, :rubygems, :rubyforge
411
- Bundler::SharedHelpers.major_deprecation "The source :#{source} is deprecated because HTTP " \
459
+ Bundler::SharedHelpers.major_deprecation 2, "The source :#{source} is deprecated because HTTP " \
412
460
  "requests are insecure.\nPlease change your source to 'https://" \
413
461
  "rubygems.org' if possible, or 'http://rubygems.org' if not."
414
462
  "http://rubygems.org"
@@ -419,17 +467,20 @@ module Bundler
419
467
  end
420
468
  end
421
469
 
422
- def check_primary_source_safety(source)
423
- return unless source.rubygems_primary_remotes.any?
470
+ def check_primary_source_safety(source_list)
471
+ return if source_list.rubygems_primary_remotes.empty? && source_list.global_rubygems_source.nil?
424
472
 
425
- # TODO: 2.0 upgrade from setting to default
426
- if Bundler.settings[:disable_multisource]
427
- raise GemfileError, "Warning: this Gemfile contains multiple primary sources. " \
473
+ if Bundler.feature_flag.disable_multisource?
474
+ msg = "This Gemfile contains multiple primary sources. " \
428
475
  "Each source after the first must include a block to indicate which gems " \
429
- "should come from that source. To downgrade this error to a warning, run " \
430
- "`bundle config --delete disable_multisource`"
476
+ "should come from that source"
477
+ unless Bundler.feature_flag.bundler_2_mode?
478
+ msg += ". To downgrade this error to a warning, run " \
479
+ "`bundle config --delete disable_multisource`"
480
+ end
481
+ raise GemfileEvalError, msg
431
482
  else
432
- Bundler::SharedHelpers.major_deprecation "Your Gemfile contains multiple primary sources. " \
483
+ Bundler::SharedHelpers.major_deprecation 2, "Your Gemfile contains multiple primary sources. " \
433
484
  "Using `source` more than once without a block is a security risk, and " \
434
485
  "may result in installing unexpected gems. To resolve this warning, use " \
435
486
  "a block to indicate which gems should come from the secondary source. " \
@@ -438,20 +489,20 @@ module Bundler
438
489
  end
439
490
  end
440
491
 
441
- def warn_github_source_change(repo_name)
492
+ def warn_deprecated_git_source(name, replacement, additional_message = nil)
442
493
  # TODO: 2.0 remove deprecation
443
- Bundler::SharedHelpers.major_deprecation "The :github option uses the git: protocol, which is not secure. " \
444
- "Bundler 2.0 will use the https: protocol, which is secure. Enable this change now by " \
445
- "running `bundle config github.https true`."
446
- end
494
+ additional_message &&= " #{additional_message}"
495
+ replacement = if replacement.count("\n").zero?
496
+ "{|repo_name| #{replacement} }"
497
+ else
498
+ "do |repo_name|\n#{replacement.to_s.gsub(/^/, " ")}\n end"
499
+ end
500
+
501
+ Bundler::SharedHelpers.major_deprecation 2, <<-EOS
502
+ The :#{name} git source is deprecated, and will be removed in Bundler 2.0.#{additional_message} Add this code to the top of your Gemfile to ensure it continues to work:
503
+
504
+ git_source(:#{name}) #{replacement}
447
505
 
448
- def warn_deprecated_git_source(name, repo_string)
449
- # TODO: 2.0 remove deprecation
450
- Bundler::SharedHelpers.major_deprecation <<-EOS
451
- The :#{name} git source is deprecated, and will be removed in Bundler 2.0. Add this code to your Gemfile to ensure it continues to work:
452
- git_source(:#{name}) do |repo_name|
453
- "#{repo_string}"
454
- end
455
506
  EOS
456
507
  end
457
508
 
@@ -530,7 +581,7 @@ The :#{name} git source is deprecated, and will be removed in Bundler 2.0. Add t
530
581
  lines = contents.lines.to_a
531
582
  indent = " # "
532
583
  indicator = indent.tr("#", ">")
533
- first_line = (line_numer.zero?)
584
+ first_line = line_numer.zero?
534
585
  last_line = (line_numer == (lines.count - 1))
535
586
 
536
587
  m << "\n"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  # used for Creating Specifications from the Gemcutter Endpoint
4
5
  class EndpointSpecification < Gem::Specification
@@ -9,11 +10,15 @@ module Bundler
9
10
  attr_accessor :source, :remote, :dependencies
10
11
 
11
12
  def initialize(name, version, platform, dependencies, metadata = nil)
13
+ super()
12
14
  @name = name
13
15
  @version = Gem::Version.create version
14
16
  @platform = platform
15
17
  @dependencies = dependencies.map {|dep, reqs| build_dependency(dep, reqs) }
16
18
 
19
+ @loaded_from = nil
20
+ @remote_specification = nil
21
+
17
22
  parse_metadata(metadata)
18
23
  end
19
24
 
@@ -71,6 +76,8 @@ module Bundler
71
76
  @remote_specification.post_install_message
72
77
  elsif _local_specification
73
78
  _local_specification.post_install_message
79
+ else
80
+ super
74
81
  end
75
82
  end
76
83
 
@@ -80,6 +87,8 @@ module Bundler
80
87
  @remote_specification.extensions
81
88
  elsif _local_specification
82
89
  _local_specification.extensions
90
+ else
91
+ super
83
92
  end
84
93
  end
85
94
 
@@ -114,7 +123,7 @@ module Bundler
114
123
  @required_ruby_version = Gem::Requirement.new(v)
115
124
  end
116
125
  end
117
- rescue => e
126
+ rescue StandardError => e
118
127
  raise GemspecError, "There was an error parsing the metadata for the gem #{name} (#{version}): #{e.class}\n#{e}\nThe metadata was #{data.inspect}"
119
128
  end
120
129
 
data/lib/bundler/env.rb CHANGED
@@ -1,33 +1,21 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/rubygems_integration"
3
4
  require "bundler/source/git/git_proxy"
4
5
 
5
6
  module Bundler
6
7
  class Env
7
- def write(io)
8
+ def self.write(io)
8
9
  io.write report
9
10
  end
10
11
 
11
- def report(options = {})
12
+ def self.report(options = {})
12
13
  print_gemfile = options.delete(:print_gemfile) { true }
13
14
  print_gemspecs = options.delete(:print_gemspecs) { true }
14
15
 
15
- out = String.new("## Environment\n\n```\n")
16
- out << "Bundler #{Bundler::VERSION}\n"
17
- out << "Rubygems #{Gem::VERSION}\n"
18
- out << "Ruby #{ruby_version}"
19
- out << "GEM_HOME #{ENV["GEM_HOME"]}\n" unless ENV["GEM_HOME"].nil? || ENV["GEM_HOME"].empty?
20
- out << "GEM_PATH #{ENV["GEM_PATH"]}\n" unless ENV["GEM_PATH"] == ENV["GEM_HOME"]
21
- out << "RVM #{ENV["rvm_version"]}\n" if ENV["rvm_version"]
22
- out << "Git #{git_version}\n"
23
- out << "Platform #{Gem::Platform.local}\n"
24
- out << "OpenSSL #{OpenSSL::OPENSSL_VERSION}\n" if defined?(OpenSSL::OPENSSL_VERSION)
25
- %w(rubygems-bundler open_gem).each do |name|
26
- specs = Bundler.rubygems.find_name(name)
27
- out << "#{name} (#{specs.map(&:version).join(",")})\n" unless specs.empty?
28
- end
29
-
30
- out << "```\n"
16
+ out = String.new
17
+ append_formatted_table("Environment", environment, out)
18
+ append_formatted_table("Bundler Build Metadata", BuildMetadata.to_h, out)
31
19
 
32
20
  unless Bundler.settings.all.empty?
33
21
  out << "\n## Bundler settings\n\n```\n"
@@ -43,9 +31,18 @@ module Bundler
43
31
  return out unless SharedHelpers.in_bundle?
44
32
 
45
33
  if print_gemfile
34
+ gemfiles = [Bundler.default_gemfile]
35
+ begin
36
+ gemfiles = Bundler.definition.gemfiles
37
+ rescue GemfileNotFound
38
+ nil
39
+ end
40
+
46
41
  out << "\n## Gemfile\n"
47
- out << "\n### #{Bundler.default_gemfile.relative_path_from(SharedHelpers.pwd)}\n\n"
48
- out << "```ruby\n" << read_file(Bundler.default_gemfile).chomp << "\n```\n"
42
+ gemfiles.each do |gemfile|
43
+ out << "\n### #{Pathname.new(gemfile).relative_path_from(SharedHelpers.pwd)}\n\n"
44
+ out << "```ruby\n" << read_file(gemfile).chomp << "\n```\n"
45
+ end
49
46
 
50
47
  out << "\n### #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}\n\n"
51
48
  out << "```\n" << read_file(Bundler.default_lockfile).chomp << "\n```\n"
@@ -63,32 +60,96 @@ module Bundler
63
60
  out
64
61
  end
65
62
 
66
- private
67
-
68
- def read_file(filename)
69
- File.read(filename.to_s).strip
63
+ def self.read_file(filename)
64
+ Bundler.read_file(filename.to_s).strip
70
65
  rescue Errno::ENOENT
71
66
  "<No #{filename} found>"
72
- rescue => e
67
+ rescue RuntimeError => e
73
68
  "#{e.class}: #{e.message}"
74
69
  end
75
70
 
76
- def ruby_version
71
+ def self.ruby_version
77
72
  str = String.new("#{RUBY_VERSION}")
78
73
  if RUBY_VERSION < "1.9"
79
74
  str << " (#{RUBY_RELEASE_DATE}"
80
75
  str << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
81
- str << ") [#{RUBY_PLATFORM}]\n"
76
+ str << ") [#{RUBY_PLATFORM}]"
82
77
  else
83
78
  str << "p#{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
84
- str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]\n"
79
+ str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]"
85
80
  end
86
81
  end
87
82
 
88
- def git_version
83
+ def self.git_version
89
84
  Bundler::Source::Git::GitProxy.new(nil, nil, nil).full_version
90
85
  rescue Bundler::Source::Git::GitNotInstalledError
91
86
  "not installed"
92
87
  end
88
+
89
+ def self.version_of(script)
90
+ return "not installed" unless Bundler.which(script)
91
+ `#{script} --version`.chomp
92
+ end
93
+
94
+ def self.chruby_version
95
+ return "not installed" unless Bundler.which("chruby-exec")
96
+ `chruby-exec -- chruby --version`.
97
+ sub(/.*^chruby: (#{Gem::Version::VERSION_PATTERN}).*/m, '\1')
98
+ end
99
+
100
+ def self.environment
101
+ out = []
102
+
103
+ out << ["Bundler", Bundler::VERSION]
104
+ out << [" Platforms", Gem.platforms.join(", ")]
105
+ out << ["Ruby", ruby_version]
106
+ out << [" Full Path", Gem.ruby]
107
+ out << [" Config Dir", Pathname.new(Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE).dirname]
108
+ out << ["RubyGems", Gem::VERSION]
109
+ out << [" Gem Home", ENV.fetch("GEM_HOME") { Gem.dir }]
110
+ out << [" Gem Path", ENV.fetch("GEM_PATH") { Gem.path.join(File::PATH_SEPARATOR) }]
111
+ out << [" User Path", Gem.user_dir]
112
+ out << [" Bin Dir", Gem.bindir]
113
+ if defined?(OpenSSL)
114
+ out << ["OpenSSL"]
115
+ out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
116
+ out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
117
+ out << [" Cert File", OpenSSL::X509::DEFAULT_CERT_FILE] if defined?(OpenSSL::X509::DEFAULT_CERT_FILE)
118
+ out << [" Cert Dir", OpenSSL::X509::DEFAULT_CERT_DIR] if defined?(OpenSSL::X509::DEFAULT_CERT_DIR)
119
+ end
120
+ out << ["Tools"]
121
+ out << [" Git", git_version]
122
+ out << [" RVM", ENV.fetch("rvm_version") { version_of("rvm") }]
123
+ out << [" rbenv", version_of("rbenv")]
124
+ out << [" chruby", chruby_version]
125
+
126
+ %w[rubygems-bundler open_gem].each do |name|
127
+ specs = Bundler.rubygems.find_name(name)
128
+ out << [" #{name}", "(#{specs.map(&:version).join(",")})"] unless specs.empty?
129
+ end
130
+ if (exe = caller.last.split(":").first) && exe =~ %r{(exe|bin)/bundler?\z}
131
+ shebang = File.read(exe).lines.first
132
+ shebang.sub!(/^#!\s*/, "")
133
+ unless shebang.start_with?(Gem.ruby, "/usr/bin/env ruby")
134
+ out << ["Gem.ruby", Gem.ruby]
135
+ out << ["bundle #!", shebang]
136
+ end
137
+ end
138
+
139
+ out
140
+ end
141
+
142
+ def self.append_formatted_table(title, pairs, out)
143
+ return if pairs.empty?
144
+ out << "\n" unless out.empty?
145
+ out << "## #{title}\n\n```\n"
146
+ ljust = pairs.map {|k, _v| k.to_s.length }.max
147
+ pairs.each do |k, v|
148
+ out << "#{k.to_s.ljust(ljust)} #{v}\n"
149
+ end
150
+ out << "```\n"
151
+ end
152
+
153
+ private_class_method :read_file, :ruby_version, :git_version, :append_formatted_table, :version_of, :chruby_version
93
154
  end
94
155
  end