bundler 1.15.4 → 1.16.0.pre.1

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 (251) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +43 -0
  3. data/README.md +12 -7
  4. data/exe/bundle +1 -1
  5. data/exe/bundle_ruby +4 -3
  6. data/lib/bundler.rb +47 -37
  7. data/lib/bundler/build_metadata.rb +38 -0
  8. data/lib/bundler/capistrano.rb +5 -0
  9. data/lib/bundler/cli.rb +155 -67
  10. data/lib/bundler/cli/add.rb +0 -1
  11. data/lib/bundler/cli/binstubs.rb +9 -7
  12. data/lib/bundler/cli/cache.rb +5 -4
  13. data/lib/bundler/cli/check.rb +3 -5
  14. data/lib/bundler/cli/clean.rb +5 -6
  15. data/lib/bundler/cli/common.rb +11 -2
  16. data/lib/bundler/cli/config.rb +2 -1
  17. data/lib/bundler/cli/console.rb +2 -1
  18. data/lib/bundler/cli/doctor.rb +1 -0
  19. data/lib/bundler/cli/exec.rb +2 -1
  20. data/lib/bundler/cli/gem.rb +3 -2
  21. data/lib/bundler/cli/info.rb +0 -1
  22. data/lib/bundler/cli/init.rb +17 -6
  23. data/lib/bundler/cli/inject.rb +1 -0
  24. data/lib/bundler/cli/install.rb +61 -61
  25. data/lib/bundler/cli/issue.rb +1 -1
  26. data/lib/bundler/cli/list.rb +22 -0
  27. data/lib/bundler/cli/lock.rb +0 -1
  28. data/lib/bundler/cli/open.rb +2 -2
  29. data/lib/bundler/cli/outdated.rb +13 -8
  30. data/lib/bundler/cli/package.rb +9 -6
  31. data/lib/bundler/cli/platform.rb +1 -0
  32. data/lib/bundler/cli/plugin.rb +1 -0
  33. data/lib/bundler/cli/pristine.rb +9 -2
  34. data/lib/bundler/cli/show.rb +0 -1
  35. data/lib/bundler/cli/update.rb +31 -5
  36. data/lib/bundler/cli/viz.rb +1 -0
  37. data/lib/bundler/compact_index_client.rb +1 -0
  38. data/lib/bundler/compact_index_client/cache.rb +1 -0
  39. data/lib/bundler/compact_index_client/updater.rb +3 -2
  40. data/lib/bundler/compatibility_guard.rb +14 -0
  41. data/lib/bundler/constants.rb +1 -0
  42. data/lib/bundler/current_ruby.rb +5 -4
  43. data/lib/bundler/definition.rb +140 -95
  44. data/lib/bundler/dep_proxy.rb +2 -0
  45. data/lib/bundler/dependency.rb +6 -7
  46. data/lib/bundler/deployment.rb +1 -1
  47. data/lib/bundler/deprecate.rb +1 -0
  48. data/lib/bundler/dsl.rb +97 -62
  49. data/lib/bundler/endpoint_specification.rb +9 -0
  50. data/lib/bundler/env.rb +63 -27
  51. data/lib/bundler/environment_preserver.rb +26 -6
  52. data/lib/bundler/errors.rb +1 -0
  53. data/lib/bundler/feature_flag.rb +39 -4
  54. data/lib/bundler/fetcher.rb +15 -8
  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 +1 -0
  58. data/lib/bundler/fetcher/downloader.rb +1 -0
  59. data/lib/bundler/fetcher/index.rb +1 -0
  60. data/lib/bundler/friendly_errors.rb +2 -1
  61. data/lib/bundler/gem_helper.rb +14 -9
  62. data/lib/bundler/gem_helpers.rb +1 -0
  63. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  64. data/lib/bundler/gem_tasks.rb +1 -0
  65. data/lib/bundler/gem_version_promoter.rb +1 -0
  66. data/lib/bundler/gemdeps.rb +1 -0
  67. data/lib/bundler/graph.rb +1 -0
  68. data/lib/bundler/index.rb +15 -8
  69. data/lib/bundler/injector.rb +25 -22
  70. data/lib/bundler/inline.rb +5 -7
  71. data/lib/bundler/installer.rb +93 -45
  72. data/lib/bundler/installer/gem_installer.rb +2 -0
  73. data/lib/bundler/installer/parallel_installer.rb +73 -42
  74. data/lib/bundler/installer/standalone.rb +1 -0
  75. data/lib/bundler/lazy_specification.rb +2 -1
  76. data/lib/bundler/lockfile_generator.rb +95 -0
  77. data/lib/bundler/lockfile_parser.rb +10 -4
  78. data/lib/bundler/match_platform.rb +1 -0
  79. data/lib/bundler/mirror.rb +6 -3
  80. data/lib/bundler/plugin.rb +1 -0
  81. data/lib/bundler/plugin/api/source.rb +8 -0
  82. data/lib/bundler/plugin/installer.rb +7 -6
  83. data/lib/bundler/plugin/source_list.rb +7 -8
  84. data/lib/bundler/process_lock.rb +24 -0
  85. data/lib/bundler/psyched_yaml.rb +1 -0
  86. data/lib/bundler/remote_specification.rb +1 -0
  87. data/lib/bundler/resolver.rb +138 -191
  88. data/lib/bundler/resolver/spec_group.rb +111 -0
  89. data/lib/bundler/retry.rb +1 -0
  90. data/lib/bundler/ruby_dsl.rb +1 -0
  91. data/lib/bundler/ruby_version.rb +1 -0
  92. data/lib/bundler/rubygems_ext.rb +5 -4
  93. data/lib/bundler/rubygems_gem_installer.rb +23 -0
  94. data/lib/bundler/rubygems_integration.rb +56 -27
  95. data/lib/bundler/runtime.rb +3 -5
  96. data/lib/bundler/settings.rb +177 -76
  97. data/lib/bundler/settings/validator.rb +79 -0
  98. data/lib/bundler/setup.rb +1 -0
  99. data/lib/bundler/shared_helpers.rb +86 -26
  100. data/lib/bundler/similarity_detector.rb +1 -0
  101. data/lib/bundler/source.rb +32 -0
  102. data/lib/bundler/source/gemspec.rb +1 -0
  103. data/lib/bundler/source/git.rb +21 -16
  104. data/lib/bundler/source/git/git_proxy.rb +14 -10
  105. data/lib/bundler/source/metadata.rb +63 -0
  106. data/lib/bundler/source/path.rb +8 -8
  107. data/lib/bundler/source/path/installer.rb +2 -0
  108. data/lib/bundler/source/rubygems.rb +131 -84
  109. data/lib/bundler/source/rubygems/remote.rb +3 -0
  110. data/lib/bundler/source_list.rb +75 -15
  111. data/lib/bundler/spec_set.rb +2 -1
  112. data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  113. data/lib/bundler/stub_specification.rb +1 -0
  114. data/lib/bundler/templates/Executable +4 -0
  115. data/lib/bundler/templates/Executable.bundler +105 -0
  116. data/lib/bundler/templates/Gemfile +1 -0
  117. data/lib/bundler/templates/gems.rb +8 -0
  118. data/lib/bundler/templates/newgem/README.md.tt +1 -1
  119. data/lib/bundler/templates/newgem/gitignore.tt +0 -1
  120. data/lib/bundler/templates/newgem/newgem.gemspec.tt +4 -1
  121. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  122. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +0 -2
  123. data/lib/bundler/ui.rb +1 -0
  124. data/lib/bundler/ui/rg_proxy.rb +1 -0
  125. data/lib/bundler/ui/shell.rb +15 -4
  126. data/lib/bundler/ui/silent.rb +1 -0
  127. data/lib/bundler/uri_credentials_filter.rb +1 -0
  128. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  129. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  130. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  131. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  132. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  133. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +3 -2
  134. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +1 -0
  135. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +1 -0
  136. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +1 -0
  137. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +1 -0
  138. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +1 -0
  139. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +1 -0
  140. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +1 -0
  141. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +1 -0
  142. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +3 -2
  143. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +69 -6
  144. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  145. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  146. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  147. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +487 -148
  148. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  150. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  151. data/lib/bundler/vendored_fileutils.rb +9 -0
  152. data/lib/bundler/vendored_molinillo.rb +1 -0
  153. data/lib/bundler/vendored_persistent.rb +34 -0
  154. data/lib/bundler/vendored_thor.rb +1 -0
  155. data/lib/bundler/version.rb +6 -2
  156. data/lib/bundler/version_ranges.rb +1 -0
  157. data/lib/bundler/vlad.rb +5 -0
  158. data/lib/bundler/worker.rb +1 -0
  159. data/lib/bundler/yaml_serializer.rb +3 -3
  160. data/man/bundle-add.1 +43 -0
  161. data/man/bundle-add.1.txt +40 -0
  162. data/man/bundle-binstubs.1 +40 -0
  163. data/man/bundle-binstubs.1.txt +48 -0
  164. data/man/bundle-binstubs.ronn +14 -0
  165. data/man/bundle-check.1 +31 -0
  166. data/man/bundle-check.1.txt +32 -0
  167. data/man/bundle-clean.1 +24 -0
  168. data/man/bundle-clean.1.txt +26 -0
  169. data/man/bundle-config.1 +455 -0
  170. data/man/bundle-config.1.txt +491 -0
  171. data/man/bundle-config.ronn +133 -79
  172. data/man/bundle-exec.1 +165 -0
  173. data/man/bundle-exec.1.txt +178 -0
  174. data/man/bundle-exec.ronn +7 -0
  175. data/man/bundle-gem.1 +80 -0
  176. data/man/bundle-gem.1.txt +91 -0
  177. data/man/bundle-gem.ronn +2 -1
  178. data/man/bundle-info.1 +20 -0
  179. data/man/bundle-info.1.txt +21 -0
  180. data/man/bundle-init.1 +20 -0
  181. data/man/bundle-init.1.txt +24 -0
  182. data/man/bundle-inject.1 +33 -0
  183. data/man/bundle-inject.1.txt +32 -0
  184. data/man/bundle-install.1 +305 -0
  185. data/man/bundle-install.1.txt +385 -0
  186. data/man/bundle-install.ronn +32 -32
  187. data/man/bundle-list.1 +20 -0
  188. data/man/bundle-list.1.txt +21 -0
  189. data/man/bundle-list.ronn +15 -0
  190. data/man/bundle-lock.1 +84 -0
  191. data/man/bundle-lock.1.txt +93 -0
  192. data/man/bundle-open.1 +32 -0
  193. data/man/bundle-open.1.txt +29 -0
  194. data/man/bundle-outdated.1 +151 -0
  195. data/man/bundle-outdated.1.txt +127 -0
  196. data/man/bundle-outdated.ronn +1 -1
  197. data/man/bundle-package.1 +55 -0
  198. data/man/bundle-package.1.txt +79 -0
  199. data/man/bundle-package.ronn +5 -0
  200. data/man/bundle-platform.1 +61 -0
  201. data/man/bundle-platform.1.txt +57 -0
  202. data/man/bundle-pristine.1 +34 -0
  203. data/man/bundle-pristine.1.txt +44 -0
  204. data/man/bundle-pristine.ronn +24 -3
  205. data/man/bundle-show.1 +23 -0
  206. data/man/bundle-show.1.txt +25 -0
  207. data/man/bundle-update.1 +390 -0
  208. data/man/bundle-update.1.txt +386 -0
  209. data/man/bundle-update.ronn +2 -2
  210. data/man/bundle-viz.1 +39 -0
  211. data/man/bundle-viz.1.txt +38 -0
  212. data/man/bundle-viz.ronn +5 -5
  213. data/man/bundle.1 +132 -0
  214. data/man/bundle.1.txt +113 -0
  215. data/man/bundle.ronn +5 -2
  216. data/man/gemfile.5 +679 -0
  217. data/man/gemfile.5.ronn +31 -0
  218. data/man/gemfile.5.txt +636 -0
  219. data/man/index.txt +23 -0
  220. metadata +21 -36
  221. data/.codeclimate.yml +0 -25
  222. data/.gitignore +0 -18
  223. data/.rspec +0 -3
  224. data/.rubocop.yml +0 -131
  225. data/.rubocop_todo.yml +0 -418
  226. data/.travis.yml +0 -122
  227. data/CODE_OF_CONDUCT.md +0 -42
  228. data/CONTRIBUTING.md +0 -17
  229. data/Rakefile +0 -338
  230. data/bin/rake +0 -19
  231. data/bin/rspec +0 -15
  232. data/bin/rubocop +0 -17
  233. data/bin/with_rubygems +0 -39
  234. data/bundler.gemspec +0 -48
  235. data/doc/README.md +0 -30
  236. data/doc/TROUBLESHOOTING.md +0 -64
  237. data/doc/contributing/BUG_TRIAGE.md +0 -36
  238. data/doc/contributing/COMMUNITY.md +0 -13
  239. data/doc/contributing/GETTING_HELP.md +0 -11
  240. data/doc/contributing/HOW_YOU_CAN_HELP.md +0 -27
  241. data/doc/contributing/ISSUES.md +0 -51
  242. data/doc/contributing/README.md +0 -38
  243. data/doc/development/NEW_FEATURES.md +0 -10
  244. data/doc/development/PULL_REQUESTS.md +0 -40
  245. data/doc/development/README.md +0 -19
  246. data/doc/development/RELEASING.md +0 -9
  247. data/doc/development/SETUP.md +0 -27
  248. data/doc/documentation/README.md +0 -29
  249. data/doc/documentation/VISION.md +0 -26
  250. data/doc/documentation/WRITING.md +0 -54
  251. data/task/release.rake +0 -116
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class DepProxy
4
5
  attr_reader :__platform, :dep
@@ -13,6 +14,7 @@ module Bundler
13
14
  end
14
15
 
15
16
  def ==(other)
17
+ return if other.nil?
16
18
  dep == other.dep && __platform == other.__platform
17
19
  end
18
20
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "rubygems/dependency"
3
4
  require "bundler/shared_helpers"
4
5
  require "bundler/rubygems_ext"
@@ -90,16 +91,14 @@ module Bundler
90
91
  @autorequire = Array(options["require"] || []) if options.key?("require")
91
92
  end
92
93
 
94
+ # Returns the platforms this dependency is valid for, in the same order as
95
+ # passed in the `valid_platforms` parameter
93
96
  def gem_platforms(valid_platforms)
94
97
  return valid_platforms if @platforms.empty?
95
98
 
96
- platforms = []
97
- @platforms.each do |p|
98
- platform = PLATFORM_MAP[p]
99
- next unless valid_platforms.include?(platform)
100
- platforms |= [platform]
101
- end
102
- platforms
99
+ @gem_platforms ||= @platforms.map {|pl| PLATFORM_MAP[pl] }.compact.uniq
100
+
101
+ valid_platforms & @gem_platforms
103
102
  end
104
103
 
105
104
  def should_include?
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "bundler/shared_helpers"
4
- Bundler::SharedHelpers.major_deprecation "Bundler no longer integrates with " \
4
+ Bundler::SharedHelpers.major_deprecation 2, "Bundler no longer integrates with " \
5
5
  "Capistrano, but Capistrano provides its own integration with " \
6
6
  "Bundler via the capistrano-bundler gem. Use it instead."
7
7
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  if defined? ::Deprecate
4
5
  Deprecate = ::Deprecate
@@ -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].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 " \
@@ -95,10 +101,10 @@ module Bundler
95
101
 
96
102
  # if there's already a dependency with this name we try to prefer one
97
103
  if current = @dependencies.find {|d| d.name == dep.name }
104
+ deleted_dep = @dependencies.delete(current) if current.type == :development
105
+
98
106
  if current.requirement != dep.requirement
99
- if current.type == :development
100
- @dependencies.delete current
101
- else
107
+ unless deleted_dep
102
108
  return if dep.type == :development
103
109
  raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \
104
110
  "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})"
@@ -111,9 +117,7 @@ module Bundler
111
117
  end
112
118
 
113
119
  if current.source != dep.source
114
- if current.type == :development
115
- @dependencies.delete current
116
- else
120
+ unless deleted_dep
117
121
  return if dep.type == :development
118
122
  raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
119
123
  "You specified that #{dep.name} (#{dep.requirement}) should come from " \
@@ -128,10 +132,12 @@ module Bundler
128
132
  def source(source, *args, &blk)
129
133
  options = args.last.is_a?(Hash) ? args.pop.dup : {}
130
134
  options = normalize_hash(options)
135
+ source = normalize_source(source)
136
+
131
137
  if options.key?("type")
132
138
  options["type"] = options["type"].to_s
133
139
  unless Plugin.source?(options["type"])
134
- raise "No sources available for #{options["type"]}"
140
+ raise InvalidOption, "No plugin sources available for #{options["type"]}"
135
141
  end
136
142
 
137
143
  unless block_given?
@@ -141,12 +147,10 @@ module Bundler
141
147
  source_opts = options.merge("uri" => source)
142
148
  with_source(@sources.add_plugin_source(options["type"], source_opts), &blk)
143
149
  elsif block_given?
144
- source = normalize_source(source)
145
150
  with_source(@sources.add_rubygems_source("remotes" => source), &blk)
146
151
  else
147
- source = normalize_source(source)
148
152
  check_primary_source_safety(@sources)
149
- @sources.add_rubygems_remote(source)
153
+ @sources.global_rubygems_source = source
150
154
  end
151
155
  end
152
156
 
@@ -164,6 +168,19 @@ module Bundler
164
168
  end
165
169
 
166
170
  def path(path, options = {}, &blk)
171
+ unless block_given?
172
+ msg = "You can no longer specify a path source by itself. Instead, \n" \
173
+ "either use the :path option on a gem, or specify the gems that \n" \
174
+ "bundler should find in the path source by passing a block to \n" \
175
+ "the path method, like: \n\n" \
176
+ " path 'dir/containing/rails' do\n" \
177
+ " gem 'rails'\n" \
178
+ " end\n\n"
179
+
180
+ raise DeprecatedError, msg if Bundler.feature_flag.disable_multisource?
181
+ SharedHelpers.major_deprecation(2, msg.strip)
182
+ end
183
+
167
184
  source_options = normalize_hash(options).merge(
168
185
  "path" => Pathname.new(path),
169
186
  "root_path" => gemfile_root,
@@ -190,6 +207,7 @@ module Bundler
190
207
 
191
208
  def github(repo, options = {})
192
209
  raise ArgumentError, "GitHub sources require a block" unless block_given?
210
+ raise DeprecatedError, "The #github method has been removed" if Bundler.feature_flag.skip_default_git_sources?
193
211
  github_uri = @git_sources["github"].call(repo)
194
212
  git_options = normalize_hash(options).merge("uri" => github_uri)
195
213
  git_source = @sources.add_git_source(git_options)
@@ -197,16 +215,16 @@ module Bundler
197
215
  end
198
216
 
199
217
  def to_definition(lockfile, unlock)
200
- Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups)
218
+ Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles)
201
219
  end
202
220
 
203
221
  def group(*args, &blk)
204
- opts = Hash === args.last ? args.pop.dup : {}
205
- normalize_group_options(opts, args)
222
+ options = args.last.is_a?(Hash) ? args.pop.dup : {}
223
+ normalize_group_options(options, args)
206
224
 
207
225
  @groups.concat args
208
226
 
209
- if opts["optional"]
227
+ if options["optional"]
210
228
  optional_groups = args - @optional_groups
211
229
  @optional_groups.concat optional_groups
212
230
  end
@@ -216,9 +234,9 @@ module Bundler
216
234
  args.each { @groups.pop }
217
235
  end
218
236
 
219
- def install_if(*args, &blk)
237
+ def install_if(*args)
220
238
  @install_conditionals.concat args
221
- blk.call
239
+ yield
222
240
  ensure
223
241
  args.each { @install_conditionals.pop }
224
242
  end
@@ -250,7 +268,12 @@ module Bundler
250
268
  private
251
269
 
252
270
  def add_git_sources
271
+ return if Bundler.feature_flag.skip_default_git_sources?
272
+
253
273
  git_source(:github) do |repo_name|
274
+ warn_deprecated_git_source(:github, <<-'RUBY'.strip, 'Change any "reponame" :github sources to "username/reponame".')
275
+ "https://github.com/#{repo_name}.git"
276
+ RUBY
254
277
  # It would be better to use https instead of the git protocol, but this
255
278
  # can break deployment of existing locked bundles when switching between
256
279
  # different versions of Bundler. The change will be made in 2.0, which
@@ -267,23 +290,29 @@ module Bundler
267
290
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
268
291
  # TODO: 2.0 upgrade this setting to the default
269
292
  if Bundler.settings["github.https"]
293
+ Bundler::SharedHelpers.major_deprecation 2, "The `github.https` setting will be removed"
270
294
  "https://github.com/#{repo_name}.git"
271
295
  else
272
- warn_github_source_change(repo_name)
273
296
  "git://github.com/#{repo_name}.git"
274
297
  end
275
298
  end
276
299
 
277
300
  # TODO: 2.0 remove this deprecated git source
278
301
  git_source(:gist) do |repo_name|
279
- warn_deprecated_git_source(:gist, 'https://gist.github.com/#{repo_name}.git')
302
+ warn_deprecated_git_source(:gist, '"https://gist.github.com/#{repo_name}.git"')
303
+
280
304
  "https://gist.github.com/#{repo_name}.git"
281
305
  end
282
306
 
283
307
  # TODO: 2.0 remove this deprecated git source
284
308
  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')
309
+ warn_deprecated_git_source(:bitbucket, <<-'RUBY'.strip)
310
+ user_name, repo_name = repo_name.split("/")
311
+ repo_name ||= user_name
312
+ "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
313
+ RUBY
314
+
315
+ user_name, repo_name = repo_name.split("/")
287
316
  repo_name ||= user_name
288
317
  "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
289
318
  end
@@ -308,7 +337,7 @@ module Bundler
308
337
  end
309
338
 
310
339
  def valid_keys
311
- @valid_keys ||= %w(group groups git path glob name branch ref tag require submodules platform platforms type source install_if)
340
+ @valid_keys ||= VALID_KEYS
312
341
  end
313
342
 
314
343
  def normalize_options(name, version, opts)
@@ -318,6 +347,9 @@ module Bundler
318
347
  if name =~ /\s/
319
348
  raise GemfileError, %('#{name}' is not a valid gem name because it contains whitespace)
320
349
  end
350
+ if name.empty?
351
+ raise GemfileError, %(an empty gem name is not valid)
352
+ end
321
353
 
322
354
  normalize_hash(opts)
323
355
 
@@ -355,7 +387,7 @@ module Bundler
355
387
  opts["git"] = @git_sources[git_name].call(opts[git_name])
356
388
  end
357
389
 
358
- %w(git path).each do |type|
390
+ %w[git path].each do |type|
359
391
  next unless param = opts[type]
360
392
  if version.first && version.first =~ /^\s*=?\s*(\d[^\s]*)\s*$/
361
393
  options = opts.merge("name" => name, "version" => $1)
@@ -366,8 +398,8 @@ module Bundler
366
398
  opts["source"] = source
367
399
  end
368
400
 
369
- opts["source"] ||= @source
370
- opts["env"] ||= @env
401
+ opts["source"] ||= @source
402
+ opts["env"] ||= @env
371
403
  opts["platforms"] = platforms.dup
372
404
  opts["group"] = groups
373
405
  opts["should_include"] = install_if
@@ -377,7 +409,7 @@ module Bundler
377
409
  normalize_hash(opts)
378
410
 
379
411
  groups = groups.map {|group| ":#{group}" }.join(", ")
380
- validate_keys("group #{groups}", opts, %w(optional))
412
+ validate_keys("group #{groups}", opts, %w[optional])
381
413
 
382
414
  opts["optional"] ||= false
383
415
  end
@@ -390,25 +422,25 @@ module Bundler
390
422
  raise GemfileError, %(The `branch` option for `#{command}` is not allowed. Only gems with a git source can specify a branch)
391
423
  end
392
424
 
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
425
+ return true unless invalid_keys.any?
426
+
427
+ message = String.new
428
+ message << "You passed #{invalid_keys.map {|k| ":" + k }.join(", ")} "
429
+ message << if invalid_keys.size > 1
430
+ "as options for #{command}, but they are invalid."
431
+ else
432
+ "as an option for #{command}, but it is invalid."
433
+ end
434
+
435
+ message << " Valid options are: #{valid_keys.join(", ")}."
436
+ message << " You may be able to resolve this by upgrading Bundler to the newest version."
437
+ raise InvalidOption, message
406
438
  end
407
439
 
408
440
  def normalize_source(source)
409
441
  case source
410
442
  when :gemcutter, :rubygems, :rubyforge
411
- Bundler::SharedHelpers.major_deprecation "The source :#{source} is deprecated because HTTP " \
443
+ Bundler::SharedHelpers.major_deprecation 2, "The source :#{source} is deprecated because HTTP " \
412
444
  "requests are insecure.\nPlease change your source to 'https://" \
413
445
  "rubygems.org' if possible, or 'http://rubygems.org' if not."
414
446
  "http://rubygems.org"
@@ -419,17 +451,20 @@ module Bundler
419
451
  end
420
452
  end
421
453
 
422
- def check_primary_source_safety(source)
423
- return unless source.rubygems_primary_remotes.any?
454
+ def check_primary_source_safety(source_list)
455
+ return if source_list.rubygems_primary_remotes.empty? && source_list.global_rubygems_source.nil?
424
456
 
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. " \
457
+ if Bundler.feature_flag.disable_multisource?
458
+ msg = "This Gemfile contains multiple primary sources. " \
428
459
  "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`"
460
+ "should come from that source"
461
+ unless Bundler.feature_flag.bundler_2_mode?
462
+ msg += ". To downgrade this error to a warning, run " \
463
+ "`bundle config --delete disable_multisource`"
464
+ end
465
+ raise GemfileEvalError, msg
431
466
  else
432
- Bundler::SharedHelpers.major_deprecation "Your Gemfile contains multiple primary sources. " \
467
+ Bundler::SharedHelpers.major_deprecation 2, "Your Gemfile contains multiple primary sources. " \
433
468
  "Using `source` more than once without a block is a security risk, and " \
434
469
  "may result in installing unexpected gems. To resolve this warning, use " \
435
470
  "a block to indicate which gems should come from the secondary source. " \
@@ -438,20 +473,20 @@ module Bundler
438
473
  end
439
474
  end
440
475
 
441
- def warn_github_source_change(repo_name)
476
+ def warn_deprecated_git_source(name, replacement, additional_message = nil)
442
477
  # 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
478
+ additional_message &&= " #{additional_message}"
479
+ replacement = if replacement.count("\n").zero?
480
+ "{|repo_name| #{replacement} }"
481
+ else
482
+ "do |repo_name|\n#{replacement.to_s.gsub(/^/, " ")}\n end"
483
+ end
484
+
485
+ Bundler::SharedHelpers.major_deprecation 2, <<-EOS
486
+ 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:
487
+
488
+ git_source(:#{name}) #{replacement}
447
489
 
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
490
  EOS
456
491
  end
457
492
 
@@ -530,7 +565,7 @@ The :#{name} git source is deprecated, and will be removed in Bundler 2.0. Add t
530
565
  lines = contents.lines.to_a
531
566
  indent = " # "
532
567
  indicator = indent.tr("#", ">")
533
- first_line = (line_numer.zero?)
568
+ first_line = line_numer.zero?
534
569
  last_line = (line_numer == (lines.count - 1))
535
570
 
536
571
  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
 
@@ -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,9 +60,7 @@ module Bundler
63
60
  out
64
61
  end
65
62
 
66
- private
67
-
68
- def read_file(filename)
63
+ def self.read_file(filename)
69
64
  File.read(filename.to_s).strip
70
65
  rescue Errno::ENOENT
71
66
  "<No #{filename} found>"
@@ -73,22 +68,63 @@ module Bundler
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.environment
90
+ out = []
91
+
92
+ out << ["Bundler", Bundler::VERSION]
93
+ out << ["RubyGems", Gem::VERSION]
94
+ out << ["Ruby", ruby_version]
95
+ out << ["GEM_HOME", ENV["GEM_HOME"]] unless ENV["GEM_HOME"].nil? || ENV["GEM_HOME"].empty?
96
+ out << ["GEM_PATH", ENV["GEM_PATH"]] unless ENV["GEM_PATH"].nil? || ENV["GEM_PATH"].empty?
97
+ out << ["RVM", ENV["rvm_version"]] if ENV["rvm_version"]
98
+ out << ["Git", git_version]
99
+ out << ["Platform", Gem::Platform.local]
100
+ out << ["OpenSSL", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
101
+ %w[rubygems-bundler open_gem].each do |name|
102
+ specs = Bundler.rubygems.find_name(name)
103
+ out << [name, "(#{specs.map(&:version).join(",")})"] unless specs.empty?
104
+ end
105
+ if (exe = caller.last.split(":").first) && exe =~ %r{(exe|bin)/bundler?\z}
106
+ shebang = File.read(exe).lines.first
107
+ shebang.sub!(/^#!\s*/, "")
108
+ unless shebang.start_with?(Gem.ruby, "/usr/bin/env ruby")
109
+ out << ["Gem.ruby", Gem.ruby]
110
+ out << ["bundle #!", shebang]
111
+ end
112
+ end
113
+
114
+ out
115
+ end
116
+
117
+ def self.append_formatted_table(title, pairs, out)
118
+ return if pairs.empty?
119
+ out << "\n" unless out.empty?
120
+ out << "## #{title}\n\n```\n"
121
+ ljust = pairs.map {|k, _v| k.to_s.length }.max
122
+ pairs.each do |k, v|
123
+ out << "#{k.to_s.ljust(ljust)} #{v}\n"
124
+ end
125
+ out << "```\n"
126
+ end
127
+
128
+ private_class_method :read_file, :ruby_version, :git_version, :append_formatted_table
93
129
  end
94
130
  end