bundler 2.1.4 → 2.2.18
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1790 -1430
- data/README.md +6 -8
- data/bundler.gemspec +5 -6
- data/exe/bundle +3 -0
- data/lib/bundler/build_metadata.rb +3 -11
- data/lib/bundler/cli/add.rb +1 -1
- data/lib/bundler/cli/binstubs.rb +6 -2
- data/lib/bundler/cli/cache.rb +2 -7
- data/lib/bundler/cli/clean.rb +1 -1
- data/lib/bundler/cli/common.rb +29 -2
- data/lib/bundler/cli/console.rb +1 -1
- data/lib/bundler/cli/doctor.rb +1 -1
- data/lib/bundler/cli/exec.rb +4 -4
- data/lib/bundler/cli/fund.rb +36 -0
- data/lib/bundler/cli/gem.rb +129 -28
- data/lib/bundler/cli/info.rb +15 -4
- data/lib/bundler/cli/init.rb +2 -2
- data/lib/bundler/cli/inject.rb +1 -1
- data/lib/bundler/cli/install.rb +13 -11
- data/lib/bundler/cli/issue.rb +2 -2
- data/lib/bundler/cli/list.rb +12 -10
- data/lib/bundler/cli/outdated.rb +94 -76
- data/lib/bundler/cli/plugin.rb +10 -0
- data/lib/bundler/cli/pristine.rb +5 -0
- data/lib/bundler/cli/show.rb +1 -1
- data/lib/bundler/cli/update.rb +3 -1
- data/lib/bundler/cli.rb +72 -56
- data/lib/bundler/compact_index_client/cache.rb +6 -14
- data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
- data/lib/bundler/compact_index_client/updater.rb +13 -17
- data/lib/bundler/compact_index_client.rb +1 -1
- data/lib/bundler/current_ruby.rb +1 -0
- data/lib/bundler/definition.rb +117 -188
- data/lib/bundler/dep_proxy.rb +16 -9
- data/lib/bundler/dependency.rb +3 -10
- data/lib/bundler/dsl.rb +40 -33
- data/lib/bundler/endpoint_specification.rb +1 -1
- data/lib/bundler/env.rb +1 -1
- data/lib/bundler/environment_preserver.rb +26 -2
- data/lib/bundler/errors.rb +1 -0
- data/lib/bundler/feature_flag.rb +0 -6
- data/lib/bundler/fetcher/base.rb +1 -1
- data/lib/bundler/fetcher/compact_index.rb +1 -1
- data/lib/bundler/fetcher/downloader.rb +9 -5
- data/lib/bundler/fetcher/index.rb +3 -4
- data/lib/bundler/fetcher.rb +5 -4
- data/lib/bundler/friendly_errors.rb +22 -13
- data/lib/bundler/gem_helper.rb +51 -18
- data/lib/bundler/gem_helpers.rb +36 -25
- data/lib/bundler/gem_version_promoter.rb +4 -4
- data/lib/bundler/graph.rb +1 -1
- data/lib/bundler/index.rb +13 -9
- data/lib/bundler/injector.rb +23 -5
- data/lib/bundler/inline.rb +3 -2
- data/lib/bundler/installer/gem_installer.rb +3 -3
- data/lib/bundler/installer/parallel_installer.rb +46 -25
- data/lib/bundler/installer/standalone.rb +17 -2
- data/lib/bundler/installer.rb +37 -49
- data/lib/bundler/lazy_specification.rb +45 -25
- data/lib/bundler/lockfile_generator.rb +1 -1
- data/lib/bundler/lockfile_parser.rb +4 -14
- data/lib/bundler/man/.document +1 -0
- data/{man → lib/bundler/man}/bundle-add.1 +1 -1
- data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-binstubs.1 +5 -3
- data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
- data/{man → lib/bundler/man}/bundle-cache.1 +1 -1
- data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-check.1 +1 -1
- data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-clean.1 +1 -1
- data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-config.1 +40 -38
- data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +50 -50
- data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
- data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-exec.1 +1 -1
- data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-gem.1 +25 -3
- data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
- data/{man → lib/bundler/man}/bundle-info.1 +1 -1
- data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-init.1 +1 -1
- data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-inject.1 +1 -1
- data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-install.1 +30 -3
- data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
- data/{man → lib/bundler/man}/bundle-list.1 +7 -7
- data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
- data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
- data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-open.1 +1 -1
- data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
- data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-platform.1 +1 -1
- data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
- data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
- data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-show.1 +1 -1
- data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-update.1 +1 -1
- data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle-viz.1 +1 -1
- data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
- data/{man → lib/bundler/man}/bundle.1 +1 -1
- data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
- data/{man → lib/bundler/man}/gemfile.5 +4 -4
- data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
- data/{man → lib/bundler/man}/index.txt +0 -0
- data/lib/bundler/mirror.rb +2 -2
- data/lib/bundler/plugin/api/source.rb +22 -1
- data/lib/bundler/plugin/dsl.rb +1 -1
- data/lib/bundler/plugin/index.rb +10 -1
- data/lib/bundler/plugin/installer/rubygems.rb +1 -1
- data/lib/bundler/plugin/installer.rb +9 -11
- data/lib/bundler/plugin/source_list.rb +5 -1
- data/lib/bundler/plugin.rb +33 -7
- data/lib/bundler/psyched_yaml.rb +0 -15
- data/lib/bundler/remote_specification.rb +5 -2
- data/lib/bundler/resolver/spec_group.rb +56 -53
- data/lib/bundler/resolver.rb +88 -115
- data/lib/bundler/retry.rb +2 -2
- data/lib/bundler/ruby_version.rb +1 -1
- data/lib/bundler/rubygems_ext.rb +71 -11
- data/lib/bundler/rubygems_gem_installer.rb +50 -9
- data/lib/bundler/rubygems_integration.rb +25 -60
- data/lib/bundler/runtime.rb +4 -14
- data/lib/bundler/settings.rb +107 -55
- data/lib/bundler/shared_helpers.rb +3 -3
- data/lib/bundler/similarity_detector.rb +1 -1
- data/lib/bundler/source/git/git_proxy.rb +82 -80
- data/lib/bundler/source/git.rb +24 -22
- data/lib/bundler/source/metadata.rb +0 -4
- data/lib/bundler/source/path/installer.rb +10 -10
- data/lib/bundler/source/path.rb +10 -4
- data/lib/bundler/source/rubygems/remote.rb +1 -1
- data/lib/bundler/source/rubygems.rb +60 -28
- data/lib/bundler/source/rubygems_aggregate.rb +64 -0
- data/lib/bundler/source.rb +16 -1
- data/lib/bundler/source_list.rb +52 -28
- data/lib/bundler/source_map.rb +58 -0
- data/lib/bundler/spec_set.rb +29 -17
- data/lib/bundler/stub_specification.rb +25 -7
- data/lib/bundler/templates/Gemfile +1 -1
- data/lib/bundler/templates/gems.rb +1 -1
- data/lib/bundler/templates/newgem/CHANGELOG.md.tt +5 -0
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
- data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
- data/lib/bundler/templates/newgem/README.md.tt +6 -5
- data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
- data/lib/bundler/templates/newgem/bin/console.tt +1 -0
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +16 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +15 -7
- data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
- data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
- data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
- data/lib/bundler/ui/shell.rb +5 -5
- data/lib/bundler/uri_credentials_filter.rb +3 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +7 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +11 -5
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +3 -3
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +12 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +49 -47
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +4 -2
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +5 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +9 -8
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +5 -2
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +5 -1
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor.rb +5 -13
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
- data/lib/bundler/vendored_persistent.rb +0 -7
- data/lib/bundler/vendored_tmpdir.rb +4 -0
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler/worker.rb +1 -1
- data/lib/bundler/yaml_serializer.rb +1 -1
- data/lib/bundler.rb +34 -9
- metadata +77 -86
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
- data/man/bundle-add.1.txt +0 -58
- data/man/bundle-binstubs.1.txt +0 -48
- data/man/bundle-cache.1.txt +0 -78
- data/man/bundle-check.1.txt +0 -33
- data/man/bundle-clean.1.txt +0 -26
- data/man/bundle-config.1.txt +0 -528
- data/man/bundle-doctor.1.txt +0 -44
- data/man/bundle-exec.1.txt +0 -178
- data/man/bundle-gem.1.txt +0 -91
- data/man/bundle-info.1.txt +0 -21
- data/man/bundle-init.1.txt +0 -34
- data/man/bundle-inject.1.txt +0 -32
- data/man/bundle-install.1.txt +0 -401
- data/man/bundle-list.1.txt +0 -43
- data/man/bundle-lock.1.txt +0 -93
- data/man/bundle-open.1.txt +0 -29
- data/man/bundle-outdated.1.txt +0 -131
- data/man/bundle-platform.1.txt +0 -57
- data/man/bundle-pristine.1.txt +0 -44
- data/man/bundle-remove.1.txt +0 -34
- data/man/bundle-show.1.txt +0 -27
- data/man/bundle-update.1.txt +0 -390
- data/man/bundle-viz.1.txt +0 -39
- data/man/bundle.1.txt +0 -116
- data/man/gemfile.5.txt +0 -649
data/lib/bundler/dsl.rb
CHANGED
@@ -24,6 +24,9 @@ module Bundler
|
|
24
24
|
def initialize
|
25
25
|
@source = nil
|
26
26
|
@sources = SourceList.new
|
27
|
+
|
28
|
+
@global_rubygems_sources = []
|
29
|
+
|
27
30
|
@git_sources = {}
|
28
31
|
@dependencies = []
|
29
32
|
@groups = []
|
@@ -45,6 +48,7 @@ module Bundler
|
|
45
48
|
@gemfiles << expanded_gemfile_path
|
46
49
|
contents ||= Bundler.read_file(@gemfile.to_s)
|
47
50
|
instance_eval(contents.dup.tap{|x| x.untaint if RUBY_VERSION < "2.7" }, gemfile.to_s, 1)
|
51
|
+
check_primary_source_safety
|
48
52
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
49
53
|
message = "There was an error " \
|
50
54
|
"#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \
|
@@ -63,7 +67,7 @@ module Bundler
|
|
63
67
|
development_group = opts[:development_group] || :development
|
64
68
|
expanded_path = gemfile_root.join(path)
|
65
69
|
|
66
|
-
gemspecs =
|
70
|
+
gemspecs = Gem::Util.glob_files_in_dir("{,*}.gemspec", expanded_path).map {|g| Bundler.load_gemspec(g) }.compact
|
67
71
|
gemspecs.reject! {|s| s.name != name } if name
|
68
72
|
Index.sort_specs(gemspecs)
|
69
73
|
specs_by_name_and_version = gemspecs.group_by {|s| [s.name, s.version] }
|
@@ -75,8 +79,7 @@ module Bundler
|
|
75
79
|
|
76
80
|
@gemspecs << spec
|
77
81
|
|
78
|
-
|
79
|
-
gem spec.name, :name => spec.name, :path => path, :glob => glob, :platforms => gem_platforms
|
82
|
+
gem spec.name, :name => spec.name, :path => path, :glob => glob
|
80
83
|
|
81
84
|
group(development_group) do
|
82
85
|
spec.development_dependencies.each do |dep|
|
@@ -165,8 +168,7 @@ module Bundler
|
|
165
168
|
elsif block_given?
|
166
169
|
with_source(@sources.add_rubygems_source("remotes" => source), &blk)
|
167
170
|
else
|
168
|
-
|
169
|
-
@sources.global_rubygems_source = source
|
171
|
+
@global_rubygems_sources << source
|
170
172
|
end
|
171
173
|
end
|
172
174
|
|
@@ -184,24 +186,14 @@ module Bundler
|
|
184
186
|
end
|
185
187
|
|
186
188
|
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
|
-
|
200
189
|
source_options = normalize_hash(options).merge(
|
201
190
|
"path" => Pathname.new(path),
|
202
191
|
"root_path" => gemfile_root,
|
203
192
|
"gemspec" => gemspecs.find {|g| g.name == options["name"] }
|
204
193
|
)
|
194
|
+
|
195
|
+
source_options["global"] = true unless block_given?
|
196
|
+
|
205
197
|
source = @sources.add_path_source(source_options)
|
206
198
|
with_source(source, &blk)
|
207
199
|
end
|
@@ -223,7 +215,6 @@ module Bundler
|
|
223
215
|
|
224
216
|
def github(repo, options = {})
|
225
217
|
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?
|
227
218
|
github_uri = @git_sources["github"].call(repo)
|
228
219
|
git_options = normalize_hash(options).merge("uri" => github_uri)
|
229
220
|
git_source = @sources.add_git_source(git_options)
|
@@ -281,11 +272,14 @@ module Bundler
|
|
281
272
|
raise GemfileError, "Undefined local variable or method `#{name}' for Gemfile"
|
282
273
|
end
|
283
274
|
|
284
|
-
|
275
|
+
def check_primary_source_safety
|
276
|
+
check_path_source_safety
|
277
|
+
check_rubygems_source_safety
|
278
|
+
end
|
285
279
|
|
286
|
-
|
287
|
-
return if Bundler.feature_flag.skip_default_git_sources?
|
280
|
+
private
|
288
281
|
|
282
|
+
def add_git_sources
|
289
283
|
git_source(:github) do |repo_name|
|
290
284
|
warn_deprecated_git_source(:github, <<-'RUBY'.strip, 'Change any "reponame" :github sources to "username/reponame".')
|
291
285
|
"https://github.com/#{repo_name}.git"
|
@@ -444,25 +438,38 @@ repo_name ||= user_name
|
|
444
438
|
end
|
445
439
|
end
|
446
440
|
|
447
|
-
def
|
448
|
-
return if
|
441
|
+
def check_path_source_safety
|
442
|
+
return if @sources.global_path_source.nil?
|
443
|
+
|
444
|
+
msg = "You can no longer specify a path source by itself. Instead, \n" \
|
445
|
+
"either use the :path option on a gem, or specify the gems that \n" \
|
446
|
+
"bundler should find in the path source by passing a block to \n" \
|
447
|
+
"the path method, like: \n\n" \
|
448
|
+
" path 'dir/containing/rails' do\n" \
|
449
|
+
" gem 'rails'\n" \
|
450
|
+
" end\n\n"
|
451
|
+
|
452
|
+
SharedHelpers.major_deprecation(2, msg.strip)
|
453
|
+
end
|
454
|
+
|
455
|
+
def check_rubygems_source_safety
|
456
|
+
@sources.global_rubygems_source = @global_rubygems_sources.shift
|
457
|
+
return if @global_rubygems_sources.empty?
|
449
458
|
|
450
|
-
|
459
|
+
@global_rubygems_sources.each do |source|
|
460
|
+
@sources.add_rubygems_remote(source)
|
461
|
+
end
|
462
|
+
|
463
|
+
if Bundler.feature_flag.bundler_3_mode?
|
451
464
|
msg = "This Gemfile contains multiple primary sources. " \
|
452
465
|
"Each source after the first must include a block to indicate which gems " \
|
453
466
|
"should come from that source"
|
454
|
-
unless Bundler.feature_flag.bundler_2_mode?
|
455
|
-
msg += ". To downgrade this error to a warning, run " \
|
456
|
-
"`bundle config unset disable_multisource`"
|
457
|
-
end
|
458
467
|
raise GemfileEvalError, msg
|
459
468
|
else
|
460
469
|
Bundler::SharedHelpers.major_deprecation 2, "Your Gemfile contains multiple primary sources. " \
|
461
470
|
"Using `source` more than once without a block is a security risk, and " \
|
462
471
|
"may result in installing unexpected gems. To resolve this warning, use " \
|
463
|
-
"a block to indicate which gems should come from the secondary source.
|
464
|
-
"To upgrade this warning to an error, run `bundle config set " \
|
465
|
-
"disable_multisource true`."
|
472
|
+
"a block to indicate which gems should come from the secondary source."
|
466
473
|
end
|
467
474
|
end
|
468
475
|
|
@@ -571,7 +578,7 @@ The :#{name} git source is deprecated, and will be removed in the future.#{addit
|
|
571
578
|
end
|
572
579
|
end
|
573
580
|
|
574
|
-
|
581
|
+
private
|
575
582
|
|
576
583
|
def parse_line_number_from_description
|
577
584
|
description = self.description
|
data/lib/bundler/env.rb
CHANGED
@@ -105,7 +105,7 @@ module Bundler
|
|
105
105
|
out << [" User Home", Gem.user_home]
|
106
106
|
out << [" User Path", Gem.user_dir]
|
107
107
|
out << [" Bin Dir", Gem.bindir]
|
108
|
-
if defined?(OpenSSL)
|
108
|
+
if defined?(OpenSSL::SSL)
|
109
109
|
out << ["OpenSSL"]
|
110
110
|
out << [" Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
|
111
111
|
out << [" Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
|
@@ -17,14 +17,38 @@ module Bundler
|
|
17
17
|
].map(&:freeze).freeze
|
18
18
|
BUNDLER_PREFIX = "BUNDLER_ORIG_".freeze
|
19
19
|
|
20
|
-
|
20
|
+
def self.from_env
|
21
|
+
new(env_to_hash(ENV), BUNDLER_KEYS)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.env_to_hash(env)
|
25
|
+
to_hash = env.to_hash
|
26
|
+
return to_hash unless Gem.win_platform?
|
27
|
+
|
28
|
+
to_hash.each_with_object({}) {|(k,v), a| a[k.upcase] = v }
|
29
|
+
end
|
30
|
+
|
31
|
+
# @param env [Hash]
|
21
32
|
# @param keys [Array<String>]
|
22
33
|
def initialize(env, keys)
|
23
|
-
@original = env
|
34
|
+
@original = env
|
24
35
|
@keys = keys
|
25
36
|
@prefix = BUNDLER_PREFIX
|
26
37
|
end
|
27
38
|
|
39
|
+
# Replaces `ENV` with the bundler environment variables backed up
|
40
|
+
def replace_with_backup
|
41
|
+
ENV.replace(backup) unless Gem.win_platform?
|
42
|
+
|
43
|
+
# Fallback logic for Windows below to workaround
|
44
|
+
# https://bugs.ruby-lang.org/issues/16798. Can be dropped once all
|
45
|
+
# supported rubies include the fix for that.
|
46
|
+
|
47
|
+
ENV.clear
|
48
|
+
|
49
|
+
backup.each {|k, v| ENV[k] = v }
|
50
|
+
end
|
51
|
+
|
28
52
|
# @return [Hash]
|
29
53
|
def backup
|
30
54
|
env = @original.clone
|
data/lib/bundler/errors.rb
CHANGED
@@ -56,6 +56,7 @@ module Bundler
|
|
56
56
|
class SudoNotPermittedError < BundlerError; status_code(30); end
|
57
57
|
class ThreadCreationError < BundlerError; status_code(33); end
|
58
58
|
class APIResponseMismatchError < BundlerError; status_code(34); end
|
59
|
+
class APIResponseInvalidDependenciesError < BundlerError; status_code(35); end
|
59
60
|
class GemfileEvalError < GemfileError; end
|
60
61
|
class MarshalError < StandardError; end
|
61
62
|
|
data/lib/bundler/feature_flag.rb
CHANGED
@@ -27,23 +27,17 @@ module Bundler
|
|
27
27
|
|
28
28
|
(1..10).each {|v| define_method("bundler_#{v}_mode?") { major_version >= v } }
|
29
29
|
|
30
|
-
settings_flag(:allow_bundler_dependency_conflicts) { bundler_3_mode? }
|
31
30
|
settings_flag(:allow_offline_install) { bundler_3_mode? }
|
32
31
|
settings_flag(:auto_clean_without_path) { bundler_3_mode? }
|
33
|
-
settings_flag(:auto_config_jobs) { bundler_3_mode? }
|
34
32
|
settings_flag(:cache_all) { bundler_3_mode? }
|
35
33
|
settings_flag(:default_install_uses_path) { bundler_3_mode? }
|
36
34
|
settings_flag(:deployment_means_frozen) { bundler_3_mode? }
|
37
|
-
settings_flag(:disable_multisource) { bundler_3_mode? }
|
38
35
|
settings_flag(:forget_cli_options) { bundler_3_mode? }
|
39
36
|
settings_flag(:global_gem_cache) { bundler_3_mode? }
|
40
|
-
settings_flag(:only_update_to_newer_versions) { bundler_3_mode? }
|
41
37
|
settings_flag(:path_relative_to_cwd) { bundler_3_mode? }
|
42
38
|
settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
|
43
39
|
settings_flag(:print_only_version_number) { bundler_3_mode? }
|
44
40
|
settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
|
45
|
-
settings_flag(:skip_default_git_sources) { bundler_3_mode? }
|
46
|
-
settings_flag(:specific_platform) { bundler_3_mode? }
|
47
41
|
settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
|
48
42
|
settings_flag(:unlock_source_unlocks_spec) { !bundler_3_mode? }
|
49
43
|
settings_flag(:update_requires_all_flag) { bundler_4_mode? }
|
data/lib/bundler/fetcher/base.rb
CHANGED
@@ -14,8 +14,10 @@ module Bundler
|
|
14
14
|
def fetch(uri, headers = {}, counter = 0)
|
15
15
|
raise HTTPError, "Too many redirects" if counter >= redirect_limit
|
16
16
|
|
17
|
+
filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)
|
18
|
+
|
17
19
|
response = request(uri, headers)
|
18
|
-
Bundler.ui.debug("HTTP #{response.code} #{response.message} #{
|
20
|
+
Bundler.ui.debug("HTTP #{response.code} #{response.message} #{filtered_uri}")
|
19
21
|
|
20
22
|
case response
|
21
23
|
when Net::HTTPSuccess, Net::HTTPNotModified
|
@@ -40,7 +42,7 @@ module Bundler
|
|
40
42
|
raise BadAuthenticationError, uri.host if uri.userinfo
|
41
43
|
raise AuthenticationRequiredError, uri.host
|
42
44
|
when Net::HTTPNotFound
|
43
|
-
raise FallbackError, "Net::HTTPNotFound: #{
|
45
|
+
raise FallbackError, "Net::HTTPNotFound: #{filtered_uri}"
|
44
46
|
else
|
45
47
|
raise HTTPError, "#{response.class}#{": #{response.body}" unless response.body.empty?}"
|
46
48
|
end
|
@@ -49,7 +51,9 @@ module Bundler
|
|
49
51
|
def request(uri, headers)
|
50
52
|
validate_uri_scheme!(uri)
|
51
53
|
|
52
|
-
|
54
|
+
filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)
|
55
|
+
|
56
|
+
Bundler.ui.debug "HTTP GET #{filtered_uri}"
|
53
57
|
req = Net::HTTP::Get.new uri.request_uri, headers
|
54
58
|
if uri.user
|
55
59
|
user = CGI.unescape(uri.user)
|
@@ -69,12 +73,12 @@ module Bundler
|
|
69
73
|
raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \
|
70
74
|
"connection and try again."
|
71
75
|
else
|
72
|
-
raise HTTPError, "Network error while fetching #{
|
76
|
+
raise HTTPError, "Network error while fetching #{filtered_uri}" \
|
73
77
|
" (#{e})"
|
74
78
|
end
|
75
79
|
end
|
76
80
|
|
77
|
-
|
81
|
+
private
|
78
82
|
|
79
83
|
def validate_uri_scheme!(uri)
|
80
84
|
return if uri.scheme =~ /\Ahttps?\z/
|
@@ -8,7 +8,7 @@ module Bundler
|
|
8
8
|
class Index < Base
|
9
9
|
def specs(_gem_names)
|
10
10
|
Bundler.rubygems.fetch_all_remote_specs(remote)
|
11
|
-
rescue Gem::RemoteFetcher::FetchError
|
11
|
+
rescue Gem::RemoteFetcher::FetchError => e
|
12
12
|
case e.message
|
13
13
|
when /certificate verify failed/
|
14
14
|
raise CertificateFailureError.new(display_uri)
|
@@ -19,8 +19,7 @@ module Bundler
|
|
19
19
|
raise BadAuthenticationError, remote_uri if remote_uri.userinfo
|
20
20
|
raise AuthenticationRequiredError, remote_uri
|
21
21
|
else
|
22
|
-
|
23
|
-
raise HTTPError, "Could not fetch specs from #{display_uri}"
|
22
|
+
raise HTTPError, "Could not fetch specs from #{display_uri} due to underlying error <#{e.message}>"
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
@@ -42,7 +41,7 @@ module Bundler
|
|
42
41
|
"Your network or your gem server is probably having issues right now."
|
43
42
|
end
|
44
43
|
|
45
|
-
|
44
|
+
private
|
46
45
|
|
47
46
|
# cached gem specification path, if one exists
|
48
47
|
def gemspec_cached_path(spec_file_name)
|
data/lib/bundler/fetcher.rb
CHANGED
@@ -47,7 +47,8 @@ module Bundler
|
|
47
47
|
remote_uri = filter_uri(remote_uri)
|
48
48
|
super "Authentication is required for #{remote_uri}.\n" \
|
49
49
|
"Please supply credentials for this source. You can do this by running:\n" \
|
50
|
-
"
|
50
|
+
"`bundle config set --global #{remote_uri} username:password`\n" \
|
51
|
+
"or by storing the credentials in the `#{Settings.key_for(remote_uri)}` environment variable"
|
51
52
|
end
|
52
53
|
end
|
53
54
|
# This error is raised if HTTP authentication is provided, but incorrect.
|
@@ -137,7 +138,6 @@ module Bundler
|
|
137
138
|
end
|
138
139
|
|
139
140
|
specs.each do |name, version, platform, dependencies, metadata|
|
140
|
-
next if name == "bundler"
|
141
141
|
spec = if dependencies
|
142
142
|
EndpointSpecification.new(name, version, platform, dependencies, metadata)
|
143
143
|
else
|
@@ -216,7 +216,7 @@ module Bundler
|
|
216
216
|
"#<#{self.class}:0x#{object_id} uri=#{uri}>"
|
217
217
|
end
|
218
218
|
|
219
|
-
|
219
|
+
private
|
220
220
|
|
221
221
|
FETCHERS = [CompactIndex, Dependency, Index].freeze
|
222
222
|
|
@@ -229,6 +229,7 @@ module Bundler
|
|
229
229
|
"BUILDBOX" => "buildbox",
|
230
230
|
"GO_SERVER_URL" => "go",
|
231
231
|
"SNAP_CI" => "snap",
|
232
|
+
"GITLAB_CI" => "gitlab",
|
232
233
|
"CI_NAME" => ENV["CI_NAME"],
|
233
234
|
"CI" => "ci",
|
234
235
|
}
|
@@ -302,7 +303,7 @@ module Bundler
|
|
302
303
|
store
|
303
304
|
end
|
304
305
|
|
305
|
-
|
306
|
+
private
|
306
307
|
|
307
308
|
def remote_uri
|
308
309
|
@remote.uri
|
@@ -4,7 +4,19 @@ require_relative "vendored_thor"
|
|
4
4
|
|
5
5
|
module Bundler
|
6
6
|
module FriendlyErrors
|
7
|
-
|
7
|
+
module_function
|
8
|
+
|
9
|
+
def enable!
|
10
|
+
@disabled = false
|
11
|
+
end
|
12
|
+
|
13
|
+
def disabled?
|
14
|
+
@disabled
|
15
|
+
end
|
16
|
+
|
17
|
+
def disable!
|
18
|
+
@disabled = true
|
19
|
+
end
|
8
20
|
|
9
21
|
def log_error(error)
|
10
22
|
case error
|
@@ -23,13 +35,7 @@ module Bundler
|
|
23
35
|
Bundler.ui.error error.message
|
24
36
|
when LoadError
|
25
37
|
raise error unless error.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
|
26
|
-
Bundler.ui.error "\nCould not load OpenSSL."
|
27
|
-
Bundler.ui.warn <<-WARN, :wrap => true
|
28
|
-
You must recompile Ruby with OpenSSL support or change the sources in your \
|
29
|
-
Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL \
|
30
|
-
using RVM are available at https://rvm.io/packages/openssl.
|
31
|
-
WARN
|
32
|
-
Bundler.ui.trace error
|
38
|
+
Bundler.ui.error "\nCould not load OpenSSL. #{error.class}: #{error}\n#{error.backtrace.join("\n ")}"
|
33
39
|
when Interrupt
|
34
40
|
Bundler.ui.error "\nQuitting..."
|
35
41
|
Bundler.ui.trace error
|
@@ -57,7 +63,7 @@ module Bundler
|
|
57
63
|
end
|
58
64
|
|
59
65
|
def request_issue_report_for(e)
|
60
|
-
Bundler.ui.
|
66
|
+
Bundler.ui.error <<-EOS.gsub(/^ {8}/, ""), nil, nil
|
61
67
|
--- ERROR REPORT TEMPLATE -------------------------------------------------------
|
62
68
|
# Error Report
|
63
69
|
|
@@ -82,7 +88,7 @@ module Bundler
|
|
82
88
|
|
83
89
|
I tried...
|
84
90
|
|
85
|
-
- **Have you read our issues document, https://github.com/
|
91
|
+
- **Have you read our issues document, https://github.com/rubygems/rubygems/blob/master/bundler/doc/contributing/ISSUES.md?**
|
86
92
|
|
87
93
|
...
|
88
94
|
|
@@ -100,13 +106,13 @@ module Bundler
|
|
100
106
|
|
101
107
|
Bundler.ui.error "Unfortunately, an unexpected error occurred, and Bundler cannot continue."
|
102
108
|
|
103
|
-
Bundler.ui.
|
109
|
+
Bundler.ui.error <<-EOS.gsub(/^ {8}/, ""), nil, :yellow
|
104
110
|
|
105
111
|
First, try this link to see if there are any existing issue reports for this error:
|
106
112
|
#{issues_url(e)}
|
107
113
|
|
108
114
|
If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
|
109
|
-
https://github.com/
|
115
|
+
https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md
|
110
116
|
EOS
|
111
117
|
end
|
112
118
|
|
@@ -114,16 +120,19 @@ module Bundler
|
|
114
120
|
message = exception.message.lines.first.tr(":", " ").chomp
|
115
121
|
message = message.split("-").first if exception.is_a?(Errno)
|
116
122
|
require "cgi"
|
117
|
-
"https://github.com/
|
123
|
+
"https://github.com/rubygems/rubygems/search?q=" \
|
118
124
|
"#{CGI.escape(message)}&type=Issues"
|
119
125
|
end
|
120
126
|
end
|
121
127
|
|
122
128
|
def self.with_friendly_errors
|
129
|
+
FriendlyErrors.enable!
|
123
130
|
yield
|
124
131
|
rescue SignalException
|
125
132
|
raise
|
126
133
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
134
|
+
raise if FriendlyErrors.disabled?
|
135
|
+
|
127
136
|
FriendlyErrors.log_error(e)
|
128
137
|
exit FriendlyErrors.exit_status(e)
|
129
138
|
end
|
data/lib/bundler/gem_helper.rb
CHANGED
@@ -15,6 +15,10 @@ module Bundler
|
|
15
15
|
new(opts[:dir], opts[:name]).install
|
16
16
|
end
|
17
17
|
|
18
|
+
def tag_prefix=(prefix)
|
19
|
+
instance.tag_prefix = prefix
|
20
|
+
end
|
21
|
+
|
18
22
|
def gemspec(&block)
|
19
23
|
gemspec = instance.gemspec
|
20
24
|
block.call(gemspec) if block
|
@@ -24,12 +28,15 @@ module Bundler
|
|
24
28
|
|
25
29
|
attr_reader :spec_path, :base, :gemspec
|
26
30
|
|
31
|
+
attr_writer :tag_prefix
|
32
|
+
|
27
33
|
def initialize(base = nil, name = nil)
|
28
|
-
@base = (base
|
29
|
-
gemspecs = name ? [File.join(base, "#{name}.gemspec")] :
|
34
|
+
@base = File.expand_path(base || SharedHelpers.pwd)
|
35
|
+
gemspecs = name ? [File.join(@base, "#{name}.gemspec")] : Gem::Util.glob_files_in_dir("{,*}.gemspec", @base)
|
30
36
|
raise "Unable to determine name from existing gemspec. Use :name => 'gemname' in #install_tasks to manually set it." unless gemspecs.size == 1
|
31
37
|
@spec_path = gemspecs.first
|
32
38
|
@gemspec = Bundler.load_gemspec(@spec_path)
|
39
|
+
@tag_prefix = ""
|
33
40
|
end
|
34
41
|
|
35
42
|
def install
|
@@ -40,6 +47,11 @@ module Bundler
|
|
40
47
|
built_gem_path = build_gem
|
41
48
|
end
|
42
49
|
|
50
|
+
desc "Generate SHA512 checksum if #{name}-#{version}.gem into the checksums directory."
|
51
|
+
task "build:checksum" => "build" do
|
52
|
+
build_checksum(built_gem_path)
|
53
|
+
end
|
54
|
+
|
43
55
|
desc "Build and install #{name}-#{version}.gem into system gems."
|
44
56
|
task "install" => "build" do
|
45
57
|
install_gem(built_gem_path)
|
@@ -73,7 +85,7 @@ module Bundler
|
|
73
85
|
|
74
86
|
def build_gem
|
75
87
|
file_name = nil
|
76
|
-
sh(
|
88
|
+
sh([*gem_command, "build", "-V", spec_path]) do
|
77
89
|
file_name = File.basename(built_gem_path)
|
78
90
|
SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
|
79
91
|
FileUtils.mv(built_gem_path, "pkg")
|
@@ -84,36 +96,57 @@ module Bundler
|
|
84
96
|
|
85
97
|
def install_gem(built_gem_path = nil, local = false)
|
86
98
|
built_gem_path ||= build_gem
|
87
|
-
cmd =
|
88
|
-
cmd
|
89
|
-
_, status = sh_with_status(cmd
|
99
|
+
cmd = [*gem_command, "install", built_gem_path.to_s]
|
100
|
+
cmd << "--local" if local
|
101
|
+
_, status = sh_with_status(cmd)
|
90
102
|
unless status.success?
|
91
103
|
raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output"
|
92
104
|
end
|
93
105
|
Bundler.ui.confirm "#{name} (#{version}) installed."
|
94
106
|
end
|
95
107
|
|
96
|
-
|
108
|
+
def build_checksum(built_gem_path = nil)
|
109
|
+
built_gem_path ||= build_gem
|
110
|
+
SharedHelpers.filesystem_access(File.join(base, "checksums")) {|p| FileUtils.mkdir_p(p) }
|
111
|
+
file_name = "#{File.basename(built_gem_path)}.sha512"
|
112
|
+
require "digest/sha2"
|
113
|
+
checksum = Digest::SHA512.new.hexdigest(built_gem_path.to_s)
|
114
|
+
target = File.join(base, "checksums", file_name)
|
115
|
+
File.write(target, checksum)
|
116
|
+
Bundler.ui.confirm "#{name} #{version} checksum written to checksums/#{file_name}."
|
117
|
+
end
|
118
|
+
|
119
|
+
protected
|
97
120
|
|
98
121
|
def rubygem_push(path)
|
99
|
-
cmd =
|
122
|
+
cmd = [*gem_command, "push", path]
|
100
123
|
cmd << "--key" << gem_key if gem_key
|
101
124
|
cmd << "--host" << allowed_push_host if allowed_push_host
|
102
|
-
unless allowed_push_host || Bundler.user_home.join(".gem/credentials").file?
|
103
|
-
raise "Your rubygems.org credentials aren't set. Run `gem push` to set them."
|
104
|
-
end
|
105
125
|
sh_with_input(cmd)
|
106
126
|
Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}"
|
107
127
|
end
|
108
128
|
|
109
129
|
def built_gem_path
|
110
|
-
|
130
|
+
Gem::Util.glob_files_in_dir("#{name}-*.gem", base).sort_by {|f| File.mtime(f) }.last
|
131
|
+
end
|
132
|
+
|
133
|
+
def git_push(remote = nil)
|
134
|
+
remote ||= default_remote
|
135
|
+
perform_git_push "#{remote} refs/heads/#{current_branch}"
|
136
|
+
perform_git_push "#{remote} refs/tags/#{version_tag}"
|
137
|
+
Bundler.ui.confirm "Pushed git commits and release tag."
|
138
|
+
end
|
139
|
+
|
140
|
+
def default_remote
|
141
|
+
remote_for_branch, status = sh_with_status(%W[git config --get branch.#{current_branch}.remote])
|
142
|
+
return "origin" unless status.success?
|
143
|
+
|
144
|
+
remote_for_branch.strip
|
111
145
|
end
|
112
146
|
|
113
|
-
def
|
114
|
-
|
115
|
-
|
116
|
-
Bundler.ui.confirm "Pushed git commits and tags."
|
147
|
+
def current_branch
|
148
|
+
# We can replace this with `git branch --show-current` once we drop support for git < 2.22.0
|
149
|
+
sh(%w[git rev-parse --abbrev-ref HEAD]).gsub(%r{\Aheads/}, "").strip
|
117
150
|
end
|
118
151
|
|
119
152
|
def allowed_push_host
|
@@ -168,7 +201,7 @@ module Bundler
|
|
168
201
|
end
|
169
202
|
|
170
203
|
def version_tag
|
171
|
-
"v#{version}"
|
204
|
+
"#{@tag_prefix}v#{version}"
|
172
205
|
end
|
173
206
|
|
174
207
|
def name
|
@@ -210,7 +243,7 @@ module Bundler
|
|
210
243
|
end
|
211
244
|
|
212
245
|
def gem_command
|
213
|
-
ENV["GEM_COMMAND"]
|
246
|
+
ENV["GEM_COMMAND"]&.shellsplit || ["gem"]
|
214
247
|
end
|
215
248
|
end
|
216
249
|
end
|