bundler 4.0.23 → 4.1.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/{lib/bundler/vendor/connection_pool/LICENSE → MIT.txt} +8 -6
- data/bundler.gemspec +23 -6
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/checksum.rb +40 -25
- data/lib/bundler/ci_detector.rb +1 -1
- data/lib/bundler/cli/add.rb +3 -4
- data/lib/bundler/cli/cache.rb +4 -0
- data/lib/bundler/cli/clean.rb +5 -0
- data/lib/bundler/cli/common.rb +37 -1
- data/lib/bundler/cli/config.rb +4 -2
- data/lib/bundler/cli/gem.rb +0 -17
- data/lib/bundler/cli/install.rb +4 -5
- data/lib/bundler/cli/lock.rb +4 -16
- data/lib/bundler/cli/outdated.rb +8 -3
- data/lib/bundler/cli/platform.rb +1 -15
- data/lib/bundler/cli/pristine.rb +2 -1
- data/lib/bundler/cli/update.rb +21 -12
- data/lib/bundler/cli.rb +19 -28
- data/lib/bundler/definition.rb +61 -24
- data/lib/bundler/dependency.rb +4 -0
- data/lib/bundler/dsl.rb +77 -11
- data/lib/bundler/endpoint_specification.rb +51 -14
- data/lib/bundler/env.rb +7 -24
- data/lib/bundler/errors.rb +34 -5
- data/lib/bundler/fetcher/compact_index.rb +14 -5
- data/lib/bundler/fetcher/connection_pools.rb +150 -0
- data/lib/bundler/fetcher/downloader.rb +33 -24
- data/lib/bundler/fetcher.rb +8 -47
- data/lib/bundler/injector.rb +3 -3
- data/lib/bundler/inline.rb +44 -4
- data/lib/bundler/installer/parallel_installer.rb +25 -30
- data/lib/bundler/installer.rb +20 -10
- data/lib/bundler/lazy_specification.rb +44 -17
- data/lib/bundler/lockfile_generator.rb +24 -2
- data/lib/bundler/lockfile_parser.rb +43 -5
- data/lib/bundler/man/bundle-add.1 +7 -4
- data/lib/bundler/man/bundle-add.1.ronn +8 -4
- data/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/lib/bundler/man/bundle-cache.1 +2 -2
- data/lib/bundler/man/bundle-cache.1.ronn +2 -2
- data/lib/bundler/man/bundle-check.1 +1 -1
- data/lib/bundler/man/bundle-clean.1 +1 -1
- data/lib/bundler/man/bundle-config.1 +38 -6
- data/lib/bundler/man/bundle-config.1.ronn +143 -10
- data/lib/bundler/man/bundle-console.1 +1 -1
- data/lib/bundler/man/bundle-doctor.1 +1 -1
- data/lib/bundler/man/bundle-env.1 +1 -1
- data/lib/bundler/man/bundle-exec.1 +1 -1
- data/lib/bundler/man/bundle-fund.1 +1 -1
- data/lib/bundler/man/bundle-gem.1 +1 -1
- data/lib/bundler/man/bundle-help.1 +1 -1
- data/lib/bundler/man/bundle-info.1 +1 -1
- data/lib/bundler/man/bundle-init.1 +1 -1
- data/lib/bundler/man/bundle-install.1 +2 -2
- data/lib/bundler/man/bundle-install.1.ronn +4 -4
- data/lib/bundler/man/bundle-issue.1 +1 -1
- data/lib/bundler/man/bundle-licenses.1 +1 -1
- data/lib/bundler/man/bundle-list.1 +1 -1
- data/lib/bundler/man/bundle-lock.1 +4 -4
- data/lib/bundler/man/bundle-lock.1.ronn +6 -6
- data/lib/bundler/man/bundle-open.1 +1 -1
- data/lib/bundler/man/bundle-outdated.1 +2 -2
- data/lib/bundler/man/bundle-outdated.1.ronn +1 -1
- data/lib/bundler/man/bundle-platform.1 +1 -1
- data/lib/bundler/man/bundle-plugin.1 +1 -1
- data/lib/bundler/man/bundle-pristine.1 +1 -1
- data/lib/bundler/man/bundle-remove.1 +1 -1
- data/lib/bundler/man/bundle-show.1 +1 -1
- data/lib/bundler/man/bundle-update.1 +5 -5
- data/lib/bundler/man/bundle-update.1.ronn +5 -7
- data/lib/bundler/man/bundle-version.1 +1 -1
- data/lib/bundler/man/bundle.1 +1 -1
- data/lib/bundler/man/gemfile.5 +45 -1
- data/lib/bundler/man/gemfile.5.ronn +53 -0
- data/lib/bundler/match_metadata.rb +20 -0
- data/lib/bundler/match_platform.rb +25 -2
- data/lib/bundler/match_remote_metadata.rb +21 -6
- data/lib/bundler/materialization.rb +2 -1
- data/lib/bundler/override.rb +69 -0
- data/lib/bundler/plugin/dsl.rb +3 -5
- data/lib/bundler/plugin/events.rb +55 -13
- data/lib/bundler/plugin/index.rb +87 -11
- data/lib/bundler/plugin/installer/path.rb +1 -1
- data/lib/bundler/plugin/installer.rb +13 -5
- data/lib/bundler/plugin.rb +58 -30
- data/lib/bundler/remote_specification.rb +6 -3
- data/lib/bundler/resolver/base.rb +2 -1
- data/lib/bundler/resolver/incompatibility.rb +1 -1
- data/lib/bundler/resolver.rb +73 -23
- data/lib/bundler/ruby_version.rb +0 -2
- data/lib/bundler/rubygems_ext.rb +71 -1
- data/lib/bundler/rubygems_gem_installer.rb +41 -2
- data/lib/bundler/rubygems_integration.rb +7 -2
- data/lib/bundler/runtime.rb +69 -2
- data/lib/bundler/self_manager.rb +9 -15
- data/lib/bundler/settings.rb +373 -30
- data/lib/bundler/shared_helpers.rb +2 -1
- data/lib/bundler/source/git/git_proxy.rb +2 -10
- data/lib/bundler/source/git.rb +15 -6
- data/lib/bundler/source/path/installer.rb +1 -1
- data/lib/bundler/source/rubygems/remote.rb +10 -5
- data/lib/bundler/source/rubygems.rb +48 -12
- data/lib/bundler/spec_set.rb +16 -4
- data/lib/bundler/stub_specification.rb +2 -1
- data/lib/bundler/templates/newgem/Gemfile.tt +4 -4
- data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +1 -1
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +3 -3
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -1
- data/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +1 -1
- data/lib/bundler/ui/shell.rb +0 -4
- data/lib/bundler/ui/silent.rb +0 -4
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +29 -54
- data/lib/bundler/vendored_pub_grub.rb +5 -2
- data/lib/bundler/vendored_securerandom.rb +11 -8
- data/lib/bundler/vendored_uri.rb +14 -14
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler/worker.rb +3 -2
- data/lib/bundler.rb +4 -2
- data/lib/rubygems/compact_index_client/cache.rb +122 -0
- data/lib/rubygems/compact_index_client/cache_file.rb +147 -0
- data/lib/rubygems/compact_index_client/http_fetcher.rb +88 -0
- data/lib/rubygems/compact_index_client/parser.rb +90 -0
- data/lib/rubygems/compact_index_client/updater.rb +113 -0
- data/lib/rubygems/compact_index_client.rb +111 -0
- data/lib/rubygems/cooldown_settings.rb +57 -0
- data/lib/rubygems/credential_store/native/linux.rb +97 -0
- data/lib/rubygems/credential_store/native/macos.rb +88 -0
- data/lib/rubygems/credential_store/native/windows.rb +130 -0
- data/lib/rubygems/credential_store.rb +332 -0
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/assignment.rb +1 -1
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +7 -7
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/failure_writer.rb +1 -1
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/incompatibility.rb +4 -4
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/package.rb +1 -1
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/partial_solution.rb +1 -1
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/rubygems.rb +3 -3
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/solve_failure.rb +1 -1
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/static_package_source.rb +3 -3
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/strategy.rb +2 -2
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/term.rb +1 -1
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/version.rb +1 -1
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/version_constraint.rb +3 -3
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/version_range.rb +1 -1
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/version_solver.rb +2 -2
- data/lib/{bundler → rubygems}/vendor/pub_grub/lib/pub_grub/version_union.rb +1 -1
- data/lib/rubygems/vendor/pub_grub/lib/pub_grub.rb +57 -0
- data/lib/{bundler → rubygems}/vendor/securerandom/lib/securerandom.rb +10 -6
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/common.rb +120 -120
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/file.rb +13 -13
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/ftp.rb +24 -24
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/generic.rb +135 -147
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/http.rb +18 -18
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/https.rb +4 -4
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/ldap.rb +14 -14
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/ldaps.rb +4 -4
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/mailto.rb +21 -21
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/rfc2396_parser.rb +39 -39
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/rfc3986_parser.rb +14 -14
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/version.rb +2 -2
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/ws.rb +12 -12
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri/wss.rb +4 -4
- data/lib/{bundler → rubygems}/vendor/uri/lib/uri.rb +35 -31
- data/lib/rubygems/yaml_serializer.rb +880 -0
- metadata +77 -68
- data/CHANGELOG.md +0 -5812
- data/LICENSE.md +0 -22
- data/README.md +0 -58
- data/lib/bundler/compact_index_client/cache.rb +0 -107
- data/lib/bundler/compact_index_client/cache_file.rb +0 -148
- data/lib/bundler/compact_index_client/parser.rb +0 -87
- data/lib/bundler/compact_index_client/updater.rb +0 -105
- data/lib/bundler/compact_index_client.rb +0 -92
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +0 -237
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +0 -3
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -56
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +0 -233
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +0 -82
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +0 -41
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +0 -65
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +0 -89
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +0 -1159
- data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +0 -31
- data/lib/bundler/vendored_persistent.rb +0 -11
- data/lib/bundler/yaml_serializer.rb +0 -98
- /data/lib/{bundler → rubygems}/vendor/pub_grub/LICENSE.txt +0 -0
- /data/lib/{bundler → rubygems}/vendor/securerandom/COPYING +0 -0
- /data/lib/{bundler → rubygems}/vendor/uri/COPYING +0 -0
|
@@ -430,7 +430,7 @@ module Bundler
|
|
|
430
430
|
def configured_uri
|
|
431
431
|
@configured_uri ||= if /https?:/.match?(uri)
|
|
432
432
|
remote = Gem::URI(uri)
|
|
433
|
-
config_auth = Bundler.settings
|
|
433
|
+
config_auth = Bundler.settings.credentials_for(remote)
|
|
434
434
|
remote.userinfo ||= config_auth
|
|
435
435
|
remote.to_s
|
|
436
436
|
else
|
|
@@ -507,15 +507,7 @@ module Bundler
|
|
|
507
507
|
|
|
508
508
|
return ["git", *opts, *cmd] unless dir
|
|
509
509
|
|
|
510
|
-
|
|
511
|
-
# repository from -C, so the cache clone is named with --git-dir.
|
|
512
|
-
# Working trees, like a local override, still go through -C.
|
|
513
|
-
location = bare_repo?(dir) ? "--git-dir" : "-C"
|
|
514
|
-
["git", location, dir.to_s, *opts, *cmd]
|
|
515
|
-
end
|
|
516
|
-
|
|
517
|
-
def bare_repo?(dir)
|
|
518
|
-
File.exist?(File.join(dir, "objects")) && File.exist?(File.join(dir, "HEAD"))
|
|
510
|
+
["git", "-C", dir.to_s, *opts, *cmd]
|
|
519
511
|
end
|
|
520
512
|
|
|
521
513
|
def extra_clone_args
|
data/lib/bundler/source/git.rb
CHANGED
|
@@ -30,6 +30,7 @@ module Bundler
|
|
|
30
30
|
|
|
31
31
|
@copied = false
|
|
32
32
|
@local = false
|
|
33
|
+
@cached_app_cache_path = nil
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
def remote!
|
|
@@ -191,8 +192,13 @@ module Bundler
|
|
|
191
192
|
set_cache_path!(app_cache_path) if use_app_cache?
|
|
192
193
|
|
|
193
194
|
if requires_checkout? && !@copied
|
|
194
|
-
|
|
195
|
-
|
|
195
|
+
Plugin.hook(Plugin::Events::GIT_BEFORE_FETCH, self)
|
|
196
|
+
begin
|
|
197
|
+
fetch unless use_app_cache?
|
|
198
|
+
checkout
|
|
199
|
+
ensure
|
|
200
|
+
Plugin.hook(Plugin::Events::GIT_AFTER_FETCH, self)
|
|
201
|
+
end
|
|
196
202
|
end
|
|
197
203
|
|
|
198
204
|
local_specs
|
|
@@ -272,6 +278,11 @@ module Bundler
|
|
|
272
278
|
|
|
273
279
|
app_cache_path = app_cache_path(custom_path)
|
|
274
280
|
|
|
281
|
+
# When several gems share a single git source, this is called once per
|
|
282
|
+
# gem. Copying the repository is expensive for large repos, so skip it
|
|
283
|
+
# if we already populated this cache during the same command.
|
|
284
|
+
return if @cached_app_cache_path == app_cache_path
|
|
285
|
+
|
|
275
286
|
migrate = try_migrate ? bare_repo?(app_cache_path) : false
|
|
276
287
|
|
|
277
288
|
set_cache_path!(nil) if migrate
|
|
@@ -283,6 +294,8 @@ module Bundler
|
|
|
283
294
|
git_proxy.checkout if migrate || requires_checkout?
|
|
284
295
|
git_proxy.copy_to(app_cache_path, @submodules)
|
|
285
296
|
serialize_gemspecs_in(app_cache_path)
|
|
297
|
+
|
|
298
|
+
@cached_app_cache_path = app_cache_path
|
|
286
299
|
end
|
|
287
300
|
|
|
288
301
|
def checkout
|
|
@@ -405,10 +418,6 @@ module Bundler
|
|
|
405
418
|
options["revision"]
|
|
406
419
|
end
|
|
407
420
|
|
|
408
|
-
def cached?
|
|
409
|
-
cache_path.exist?
|
|
410
|
-
end
|
|
411
|
-
|
|
412
421
|
def git_proxy
|
|
413
422
|
@git_proxy ||= GitProxy.new(cache_path, uri, options, locked_revision, self)
|
|
414
423
|
end
|
|
@@ -18,12 +18,17 @@ module Bundler
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
# Returns the cooldown days that apply to this remote, resolving the
|
|
21
|
-
# precedence CLI > config > Gemfile per-source
|
|
22
|
-
# cooldown applies.
|
|
21
|
+
# precedence CLI > config > Gemfile per-source and then raising the
|
|
22
|
+
# result to RubyGems' own setting. Returns nil if no cooldown applies.
|
|
23
|
+
#
|
|
24
|
+
# The resolver asks once per candidate spec, so the settings lookup is
|
|
25
|
+
# memoized. That snapshots the value: a Remote created before a
|
|
26
|
+
# settings change keeps the old one. Nothing in Bundler changes the
|
|
27
|
+
# cooldown setting after the sources are built (the CLI flag is applied
|
|
28
|
+
# before the Definition exists), so build a new Remote if you need to.
|
|
23
29
|
def effective_cooldown
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
@cooldown
|
|
30
|
+
return @effective_cooldown if defined?(@effective_cooldown)
|
|
31
|
+
@effective_cooldown = Bundler.settings.cooldown_for(@cooldown)
|
|
27
32
|
end
|
|
28
33
|
|
|
29
34
|
MAX_CACHE_SLUG_HOST_SIZE = 255 - 1 - 32 # 255 minus dot minus MD5 length
|
|
@@ -25,6 +25,7 @@ module Bundler
|
|
|
25
25
|
@checksum_store = Checksum::Store.new
|
|
26
26
|
@gem_installers = {}
|
|
27
27
|
@gem_installers_mutex = Mutex.new
|
|
28
|
+
@remote_spec_for_mutex = Mutex.new
|
|
28
29
|
@remote_specs_mutex = Mutex.new
|
|
29
30
|
|
|
30
31
|
cooldown = options["cooldown"]
|
|
@@ -196,6 +197,8 @@ module Bundler
|
|
|
196
197
|
"the security policy didn't allow it, with the message: #{e.message}"
|
|
197
198
|
end
|
|
198
199
|
|
|
200
|
+
s.content_address = spec.content_address if spec.content_address
|
|
201
|
+
|
|
199
202
|
spec.__swap__(s)
|
|
200
203
|
end
|
|
201
204
|
|
|
@@ -230,8 +233,12 @@ module Bundler
|
|
|
230
233
|
spec.post_install_message
|
|
231
234
|
end
|
|
232
235
|
|
|
236
|
+
def uncached?(spec)
|
|
237
|
+
caches.none? {|cache| File.exist?(package_path(cache, spec)) }
|
|
238
|
+
end
|
|
239
|
+
|
|
233
240
|
def cache(spec, custom_path = nil)
|
|
234
|
-
cached_path =
|
|
241
|
+
cached_path = fetch_gem_if_possible(spec)
|
|
235
242
|
raise GemNotFound, "Missing gem file '#{spec.file_name}'." unless cached_path
|
|
236
243
|
return if File.dirname(cached_path) == Bundler.app_cache.to_s
|
|
237
244
|
Bundler.ui.info " * #{File.basename(cached_path)}"
|
|
@@ -437,12 +444,14 @@ module Bundler
|
|
|
437
444
|
# Looks up a single spec in the remote sources, fetching only its own
|
|
438
445
|
# name when the full remote index is not already materialized.
|
|
439
446
|
def remote_spec_for(spec)
|
|
440
|
-
|
|
447
|
+
@remote_spec_for_mutex.synchronize do
|
|
448
|
+
return remote_specs.search(spec).first if @remote_specs || api_fetchers.empty?
|
|
441
449
|
|
|
442
|
-
|
|
443
|
-
|
|
450
|
+
index = Index.build do |idx|
|
|
451
|
+
fetch_names(api_fetchers, [spec.name], idx)
|
|
452
|
+
end
|
|
453
|
+
index.search(spec).first
|
|
444
454
|
end
|
|
445
|
-
index.search(spec).first
|
|
446
455
|
end
|
|
447
456
|
|
|
448
457
|
def fetch_names(fetchers, dependency_names, index)
|
|
@@ -462,10 +471,24 @@ module Bundler
|
|
|
462
471
|
if spec.remote
|
|
463
472
|
fetch_gem(spec, previous_spec)
|
|
464
473
|
else
|
|
465
|
-
cached_gem(spec)
|
|
474
|
+
cached_gem(spec) || refetch_gem(spec, previous_spec)
|
|
466
475
|
end
|
|
467
476
|
end
|
|
468
477
|
|
|
478
|
+
# An installed gem materializes without a remote, so a reinstall forced by
|
|
479
|
+
# `--redownload` has to look the gem up in the remote index again before it
|
|
480
|
+
# can download the archive that the cache no longer holds.
|
|
481
|
+
def refetch_gem(spec, previous_spec = nil)
|
|
482
|
+
return unless @allow_remote
|
|
483
|
+
|
|
484
|
+
remote_spec = remote_spec_for(spec)
|
|
485
|
+
return unless remote_spec && remote_spec.full_name == spec.full_name
|
|
486
|
+
|
|
487
|
+
path = fetch_gem(remote_spec, previous_spec)
|
|
488
|
+
spec.remote = remote_spec.remote
|
|
489
|
+
path
|
|
490
|
+
end
|
|
491
|
+
|
|
469
492
|
def fetch_gem(spec, previous_spec = nil)
|
|
470
493
|
spec.fetch_platform
|
|
471
494
|
|
|
@@ -545,8 +568,13 @@ module Bundler
|
|
|
545
568
|
Bundler.ui.confirm("Fetching #{version_message(spec, previous_spec)}")
|
|
546
569
|
gem_remote_fetcher = remote_fetchers.fetch(spec.remote).gem_remote_fetcher
|
|
547
570
|
|
|
548
|
-
|
|
549
|
-
|
|
571
|
+
Plugin.hook(Plugin::Events::GEM_BEFORE_FETCH, spec)
|
|
572
|
+
begin
|
|
573
|
+
Gem.time("Downloaded #{spec.name} in", 0, true) do
|
|
574
|
+
Bundler.rubygems.download_gem(spec, uri, download_cache_path, gem_remote_fetcher)
|
|
575
|
+
end
|
|
576
|
+
ensure
|
|
577
|
+
Plugin.hook(Plugin::Events::GEM_AFTER_FETCH, spec)
|
|
550
578
|
end
|
|
551
579
|
end
|
|
552
580
|
|
|
@@ -566,7 +594,12 @@ module Bundler
|
|
|
566
594
|
return unless remote = spec.remote
|
|
567
595
|
return unless cache_slug = remote.cache_slug
|
|
568
596
|
|
|
569
|
-
|
|
597
|
+
if Gem.respond_to?(:global_gem_cache_path)
|
|
598
|
+
Pathname.new(Gem.global_gem_cache_path).join(cache_slug)
|
|
599
|
+
else
|
|
600
|
+
# Fall back to old location for older RubyGems versions
|
|
601
|
+
Bundler.user_cache.join("gems", cache_slug)
|
|
602
|
+
end
|
|
570
603
|
end
|
|
571
604
|
|
|
572
605
|
def extension_cache_slug(spec)
|
|
@@ -574,11 +607,11 @@ module Bundler
|
|
|
574
607
|
remote.cache_slug
|
|
575
608
|
end
|
|
576
609
|
|
|
577
|
-
# We are using a mutex to
|
|
610
|
+
# We are using a mutex to read and write from/to the hash.
|
|
578
611
|
# The reason this double synchronization was added is for performance
|
|
579
612
|
# and to lock the mutex for the shortest possible amount of time. Otherwise,
|
|
580
613
|
# all threads are fighting over this mutex and when it gets acquired it gets locked
|
|
581
|
-
# until a
|
|
614
|
+
# until a thread finishes downloading a gem, leaving the other threads waiting
|
|
582
615
|
# doing nothing.
|
|
583
616
|
def rubygems_gem_installer(spec, options)
|
|
584
617
|
@gem_installers_mutex.synchronize { @gem_installers[spec.name] } || begin
|
|
@@ -589,6 +622,7 @@ module Bundler
|
|
|
589
622
|
|
|
590
623
|
installer = Bundler::RubyGemsGemInstaller.at(
|
|
591
624
|
path,
|
|
625
|
+
content_address: (spec.content_address if Gem::ContentAddress.content_addressed?(spec, validate_ruby_abi: false)),
|
|
592
626
|
security_policy: Bundler.rubygems.security_policies[Bundler.settings["trust-policy"]],
|
|
593
627
|
install_dir: rubygems_dir.to_s,
|
|
594
628
|
bin_dir: Bundler.system_bindir.to_s,
|
|
@@ -596,7 +630,9 @@ module Bundler
|
|
|
596
630
|
wrappers: true,
|
|
597
631
|
env_shebang: true,
|
|
598
632
|
build_args: options[:build_args],
|
|
599
|
-
bundler_extension_cache_path: extension_cache_path(spec)
|
|
633
|
+
bundler_extension_cache_path: extension_cache_path(spec),
|
|
634
|
+
build_extension: Bundler.settings[:no_build_extension] ? false : nil,
|
|
635
|
+
install_plugin: Bundler.settings[:no_install_plugin] ? false : nil
|
|
600
636
|
)
|
|
601
637
|
@gem_installers_mutex.synchronize { @gem_installers[spec.name] ||= installer }
|
|
602
638
|
end
|
data/lib/bundler/spec_set.rb
CHANGED
|
@@ -178,7 +178,7 @@ module Bundler
|
|
|
178
178
|
end
|
|
179
179
|
|
|
180
180
|
def find_by_name_and_platform(name, platform)
|
|
181
|
-
|
|
181
|
+
lookup[name]&.detect {|spec| spec.installable_on_platform?(platform) }
|
|
182
182
|
end
|
|
183
183
|
|
|
184
184
|
def specs_with_additional_variants_from(other)
|
|
@@ -274,13 +274,25 @@ module Bundler
|
|
|
274
274
|
|
|
275
275
|
valid_platform = lookup.all? do |_, specs|
|
|
276
276
|
spec = specs.first
|
|
277
|
+
# The matching candidates returned by source.specs.search are remote
|
|
278
|
+
# specs that do not carry the override list themselves. Borrow it from
|
|
279
|
+
# the LazySpec we are validating so platform-variant validation honors
|
|
280
|
+
# the same overrides the install/resolve path already applies.
|
|
281
|
+
overrides = spec.is_a?(LazySpecification) ? Array(spec.overrides) : []
|
|
277
282
|
matching_specs = spec.source.specs.search([spec.name, spec.version])
|
|
278
283
|
platform_spec = MatchPlatform.select_best_platform_match(matching_specs, platform).find do |s|
|
|
279
|
-
|
|
284
|
+
s.matches_current_metadata_with_overrides?(overrides) && valid_dependencies?(s)
|
|
280
285
|
end
|
|
281
286
|
|
|
282
287
|
if platform_spec
|
|
283
|
-
|
|
288
|
+
unless specs.include?(platform_spec)
|
|
289
|
+
new_lazy = LazySpecification.from_spec(platform_spec)
|
|
290
|
+
# Carry the overrides forward so a follow-up complete_platform
|
|
291
|
+
# call that picks this synthesized variant as its exemplar still
|
|
292
|
+
# honors the user's override list.
|
|
293
|
+
new_lazy.overrides = overrides if overrides.any?
|
|
294
|
+
new_specs << new_lazy
|
|
295
|
+
end
|
|
284
296
|
true
|
|
285
297
|
else
|
|
286
298
|
false
|
|
@@ -314,7 +326,7 @@ module Bundler
|
|
|
314
326
|
end
|
|
315
327
|
|
|
316
328
|
def sorted
|
|
317
|
-
@sorted ||= ([
|
|
329
|
+
@sorted ||= ([lookup["rake"]&.first] + tsort).compact.uniq
|
|
318
330
|
rescue Gem::TSort::Cyclic => error
|
|
319
331
|
cgems = extract_circular_gems(error)
|
|
320
332
|
raise CyclicDependencyError, "Your bundle requires gems that depend" \
|
|
@@ -4,7 +4,8 @@ module Bundler
|
|
|
4
4
|
class StubSpecification < RemoteSpecification
|
|
5
5
|
def self.from_stub(stub)
|
|
6
6
|
return stub if stub.is_a?(Bundler::StubSpecification)
|
|
7
|
-
|
|
7
|
+
content_address = stub.content_address
|
|
8
|
+
spec = new(stub.name, stub.version, stub.platform, nil, content_address: content_address)
|
|
8
9
|
spec.stub = stub
|
|
9
10
|
spec
|
|
10
11
|
end
|
|
@@ -6,19 +6,19 @@ source "https://rubygems.org"
|
|
|
6
6
|
gemspec
|
|
7
7
|
|
|
8
8
|
gem "irb"
|
|
9
|
-
gem "rake", "
|
|
9
|
+
gem "rake", ">= 13.0"
|
|
10
10
|
<%- if config[:ext] -%>
|
|
11
11
|
|
|
12
12
|
gem "rake-compiler"
|
|
13
13
|
<%- end -%>
|
|
14
14
|
<%- if config[:test] -%>
|
|
15
15
|
|
|
16
|
-
gem "<%= config[:test] %>"
|
|
16
|
+
gem "<%= config[:test] %>"
|
|
17
17
|
<%- end -%>
|
|
18
18
|
<%- if config[:linter] == "rubocop" -%>
|
|
19
19
|
|
|
20
|
-
gem "rubocop"
|
|
20
|
+
gem "rubocop"
|
|
21
21
|
<%- elsif config[:linter] == "standard" -%>
|
|
22
22
|
|
|
23
|
-
gem "standard"
|
|
23
|
+
gem "standard"
|
|
24
24
|
<%- end -%>
|
|
@@ -45,12 +45,12 @@ Gem::Specification.new do |spec|
|
|
|
45
45
|
<%- end -%>
|
|
46
46
|
|
|
47
47
|
# Uncomment to register a new dependency of your gem
|
|
48
|
-
# spec.add_dependency "example-gem", "
|
|
48
|
+
# spec.add_dependency "example-gem", ">= 1.0"
|
|
49
49
|
<%- if config[:ext] == 'rust' -%>
|
|
50
|
-
spec.add_dependency "rb_sys", "
|
|
50
|
+
spec.add_dependency "rb_sys", ">= 0.9.128"
|
|
51
51
|
<%- end -%>
|
|
52
52
|
<%- if config[:ext] == 'go' -%>
|
|
53
|
-
spec.add_dependency "go_gem", "
|
|
53
|
+
spec.add_dependency "go_gem", ">= 0.2"
|
|
54
54
|
<%- end -%>
|
|
55
55
|
|
|
56
56
|
# For more information and examples about making a new gem, check out our
|
|
@@ -9,7 +9,7 @@ RSpec.describe <%= config[:constant_name] %> do
|
|
|
9
9
|
it "can call into Rust" do
|
|
10
10
|
result = <%= config[:constant_name] %>.hello("world")
|
|
11
11
|
|
|
12
|
-
expect(result).to
|
|
12
|
+
expect(result).to eq("Hello world, from Rust!")
|
|
13
13
|
end
|
|
14
14
|
<%- else -%>
|
|
15
15
|
it "does something useful" do
|
|
@@ -9,7 +9,7 @@ class <%= config[:minitest_constant_name] %> < Minitest::Test
|
|
|
9
9
|
|
|
10
10
|
<%- if config[:ext] == 'rust' -%>
|
|
11
11
|
def test_hello_world
|
|
12
|
-
assert_equal "Hello
|
|
12
|
+
assert_equal "Hello world, from Rust!", <%= config[:constant_name] %>.hello("world")
|
|
13
13
|
end
|
|
14
14
|
<%- else -%>
|
|
15
15
|
def test_it_does_something_useful
|
data/lib/bundler/ui/shell.rb
CHANGED
data/lib/bundler/ui/silent.rb
CHANGED
|
@@ -181,7 +181,7 @@ end
|
|
|
181
181
|
#
|
|
182
182
|
module Bundler::FileUtils
|
|
183
183
|
# The version number.
|
|
184
|
-
VERSION = "1.8.
|
|
184
|
+
VERSION = "1.8.0"
|
|
185
185
|
|
|
186
186
|
def self.private_module_function(name) #:nodoc:
|
|
187
187
|
module_function name
|
|
@@ -279,67 +279,38 @@ module Bundler::FileUtils
|
|
|
279
279
|
end
|
|
280
280
|
private_module_function :remove_trailing_slash
|
|
281
281
|
|
|
282
|
-
# :markup: markdown
|
|
283
282
|
#
|
|
284
|
-
#
|
|
285
|
-
#
|
|
286
|
-
#
|
|
287
|
-
# Argument `paths` may be one path or an array of paths;
|
|
288
|
-
# each must be {interpretable as a path}[rdoc-ref:FileUtils@Path+Arguments].
|
|
289
|
-
#
|
|
290
|
-
# By default, creates a directory entry at each of the given `paths`;
|
|
291
|
-
# each directory has permissions `0775`;
|
|
292
|
-
# returns an array of the paths:
|
|
293
|
-
#
|
|
294
|
-
# ```ruby
|
|
295
|
-
# Bundler::FileUtils.mkdir('foo') # => ["foo"]
|
|
296
|
-
# Bundler::FileUtils.mkdir(%w[bar baz]) # => ["bar", "baz"]
|
|
297
|
-
# File.stat(Dir.new('foo')).mode.to_s(8) # => "40775"
|
|
298
|
-
# File.stat(Dir.new('bar')).mode.to_s(8) # => "40775"
|
|
299
|
-
# File.stat(Dir.new('baz')).mode.to_s(8) # => "40775"
|
|
300
|
-
# Bundler::FileUtils.rmdir(%w[foo bar baz]) # => ["foo", "bar", "baz"]
|
|
301
|
-
# ```
|
|
302
|
-
#
|
|
303
|
-
# Raises an exception if for any reason a directory cannot be created;
|
|
304
|
-
# a common reason is that the directory already exists.
|
|
283
|
+
# Creates directories at the paths in the given +list+
|
|
284
|
+
# (a single path or an array of paths);
|
|
285
|
+
# returns +list+ if it is an array, <tt>[list]</tt> otherwise.
|
|
305
286
|
#
|
|
306
|
-
#
|
|
307
|
-
#
|
|
287
|
+
# Argument +list+ or its elements
|
|
288
|
+
# should be {interpretable as paths}[rdoc-ref:FileUtils@Path+Arguments].
|
|
308
289
|
#
|
|
309
|
-
#
|
|
310
|
-
#
|
|
311
|
-
#
|
|
312
|
-
# Bundler::FileUtils.rmdir('bar')
|
|
313
|
-
# ```
|
|
290
|
+
# With no keyword arguments, creates a directory at each +path+ in +list+
|
|
291
|
+
# by calling: <tt>Dir.mkdir(path, mode)</tt>;
|
|
292
|
+
# see {Dir.mkdir}[https://docs.ruby-lang.org/en/master/Dir.html#method-c-mkdir]:
|
|
314
293
|
#
|
|
315
|
-
#
|
|
316
|
-
#
|
|
317
|
-
# returns `nil`
|
|
294
|
+
# Bundler::FileUtils.mkdir(%w[tmp0 tmp1]) # => ["tmp0", "tmp1"]
|
|
295
|
+
# Bundler::FileUtils.mkdir('tmp4') # => ["tmp4"]
|
|
318
296
|
#
|
|
319
|
-
#
|
|
320
|
-
# Bundler::FileUtils.mkdir('foo', noop: true) # => nil
|
|
321
|
-
# Dir.exist?('foo') # => false
|
|
322
|
-
# ```
|
|
297
|
+
# Keyword arguments:
|
|
323
298
|
#
|
|
324
|
-
#
|
|
325
|
-
#
|
|
299
|
+
# - <tt>mode: <i>mode</i></tt> - also calls <tt>File.chmod(mode, path)</tt>;
|
|
300
|
+
# see {File.chmod}[https://docs.ruby-lang.org/en/master/File.html#method-c-chmod].
|
|
301
|
+
# - <tt>noop: true</tt> - does not create directories.
|
|
302
|
+
# - <tt>verbose: true</tt> - prints an equivalent command:
|
|
326
303
|
#
|
|
327
|
-
#
|
|
328
|
-
#
|
|
329
|
-
# Bundler::FileUtils.mkdir(%w[bar baz], mode: 0644, verbose: true)
|
|
330
|
-
# Bundler::FileUtils.mkdir(%w[bar baz], mode: 0644, verbose: true, noop: true)
|
|
331
|
-
# ```
|
|
304
|
+
# Bundler::FileUtils.mkdir(%w[tmp0 tmp1], verbose: true)
|
|
305
|
+
# Bundler::FileUtils.mkdir(%w[tmp2 tmp3], mode: 0700, verbose: true)
|
|
332
306
|
#
|
|
333
|
-
#
|
|
307
|
+
# Output:
|
|
334
308
|
#
|
|
335
|
-
#
|
|
336
|
-
#
|
|
337
|
-
# mkdir -m 644 bar baz
|
|
338
|
-
# mkdir -m 644 bar baz
|
|
339
|
-
# ```
|
|
309
|
+
# mkdir tmp0 tmp1
|
|
310
|
+
# mkdir -m 700 tmp2 tmp3
|
|
340
311
|
#
|
|
341
|
-
#
|
|
342
|
-
#
|
|
312
|
+
# Raises an exception if any path points to an existing
|
|
313
|
+
# file or directory, or if for any reason a directory cannot be created.
|
|
343
314
|
#
|
|
344
315
|
# Related: Bundler::FileUtils.mkdir_p.
|
|
345
316
|
#
|
|
@@ -715,7 +686,7 @@ module Bundler::FileUtils
|
|
|
715
686
|
# Keyword arguments:
|
|
716
687
|
#
|
|
717
688
|
# - <tt>force: true</tt> - overwrites +dest+ if it exists.
|
|
718
|
-
# - <tt>relative:
|
|
689
|
+
# - <tt>relative: false</tt> - create links relative to +dest+.
|
|
719
690
|
# - <tt>noop: true</tt> - does not create links.
|
|
720
691
|
# - <tt>verbose: true</tt> - prints an equivalent command:
|
|
721
692
|
#
|
|
@@ -783,7 +754,7 @@ module Bundler::FileUtils
|
|
|
783
754
|
n = real_ddirs.size - i
|
|
784
755
|
n -= 1 unless target_directory
|
|
785
756
|
link2 = fu_clean_components(*Array.new([n, 0].max, '..'), *real_sdirs[i..-1])
|
|
786
|
-
link1 = link2 if
|
|
757
|
+
link1 = link2 if link1.size > link2.size
|
|
787
758
|
end
|
|
788
759
|
s = File.join(link1)
|
|
789
760
|
fu_output_message [cmd, s, d].flatten.join(' ') if verbose
|
|
@@ -2066,6 +2037,10 @@ module Bundler::FileUtils
|
|
|
2066
2037
|
def fu_windows?; false end #:nodoc:
|
|
2067
2038
|
end
|
|
2068
2039
|
|
|
2040
|
+
def fu_copy_stream0(src, dest, blksize = nil) #:nodoc:
|
|
2041
|
+
IO.copy_stream(src, dest)
|
|
2042
|
+
end
|
|
2043
|
+
|
|
2069
2044
|
def fu_stream_blksize(*streams) #:nodoc:
|
|
2070
2045
|
streams.each do |s|
|
|
2071
2046
|
next unless s.respond_to?(:stat)
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
# Reuse RubyGems' vendored PubGrub (Gem::PubGrub). The Bundler gem ships a copy
|
|
4
|
+
# under lib/rubygems/vendor, so this resolves even on RubyGems versions that
|
|
5
|
+
# predate it.
|
|
6
|
+
|
|
7
|
+
require "rubygems/vendor/pub_grub/lib/pub_grub"
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
3
|
+
# Reuse RubyGems' vendored SecureRandom (Gem::SecureRandom). The Bundler gem
|
|
4
|
+
# ships a copy under lib/rubygems/vendor, so this resolves even on RubyGems
|
|
5
|
+
# versions that predate it. Fall back to the stdlib only when no vendored copy
|
|
6
|
+
# is available at all.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
unless defined?(Gem::SecureRandom)
|
|
9
|
+
begin
|
|
10
|
+
require "rubygems/vendor/securerandom/lib/securerandom"
|
|
11
|
+
rescue LoadError
|
|
12
|
+
require "securerandom"
|
|
13
|
+
Gem::SecureRandom = SecureRandom
|
|
14
|
+
end
|
|
12
15
|
end
|
data/lib/bundler/vendored_uri.rb
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# Reuse RubyGems' vendored URI (Gem::URI). The Bundler gem ships a copy under
|
|
4
|
+
# lib/rubygems/vendor, so this resolves even on RubyGems versions that predate
|
|
5
|
+
# it. Fall back to the stdlib only when no vendored copy is available at all.
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
unless defined?(Gem::URI)
|
|
8
|
+
begin
|
|
9
|
+
require "rubygems/vendor/uri/lib/uri"
|
|
10
|
+
rescue LoadError
|
|
11
|
+
require "uri"
|
|
12
|
+
Gem::URI = URI
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
module Gem
|
|
16
|
-
def URI(uri) # rubocop:disable Naming/MethodName
|
|
17
|
-
Bundler::URI(uri)
|
|
14
|
+
module Gem
|
|
15
|
+
def URI(uri) # rubocop:disable Naming/MethodName
|
|
16
|
+
Kernel.URI(uri)
|
|
17
|
+
end
|
|
18
|
+
module_function :URI
|
|
18
19
|
end
|
|
19
|
-
module_function :URI
|
|
20
20
|
end
|
|
21
21
|
end
|
data/lib/bundler/version.rb
CHANGED
data/lib/bundler/worker.rb
CHANGED
|
@@ -19,11 +19,12 @@ module Bundler
|
|
|
19
19
|
# @param size [Integer] Size of pool
|
|
20
20
|
# @param name [String] name the name of the worker
|
|
21
21
|
# @param func [Proc] job to run in inside the worker pool
|
|
22
|
-
|
|
22
|
+
# @param response_queue [Thread::Queue] queue that receives completed jobs
|
|
23
|
+
def initialize(size, name, func, response_queue: Thread::Queue.new)
|
|
23
24
|
@name = name
|
|
24
25
|
@request_queue = Thread::Queue.new
|
|
25
26
|
@request_queue_with_priority = Thread::Queue.new
|
|
26
|
-
@response_queue =
|
|
27
|
+
@response_queue = response_queue
|
|
27
28
|
@func = func
|
|
28
29
|
@size = size
|
|
29
30
|
@threads = nil
|
data/lib/bundler.rb
CHANGED
|
@@ -41,7 +41,6 @@ module Bundler
|
|
|
41
41
|
autoload :Checksum, File.expand_path("bundler/checksum", __dir__)
|
|
42
42
|
autoload :CLI, File.expand_path("bundler/cli", __dir__)
|
|
43
43
|
autoload :CIDetector, File.expand_path("bundler/ci_detector", __dir__)
|
|
44
|
-
autoload :CompactIndexClient, File.expand_path("bundler/compact_index_client", __dir__)
|
|
45
44
|
autoload :Definition, File.expand_path("bundler/definition", __dir__)
|
|
46
45
|
autoload :Dependency, File.expand_path("bundler/dependency", __dir__)
|
|
47
46
|
autoload :Deprecate, File.expand_path("bundler/deprecate", __dir__)
|
|
@@ -62,6 +61,7 @@ module Bundler
|
|
|
62
61
|
autoload :MatchRemoteMetadata, File.expand_path("bundler/match_remote_metadata", __dir__)
|
|
63
62
|
autoload :Materialization, File.expand_path("bundler/materialization", __dir__)
|
|
64
63
|
autoload :NULL, File.expand_path("bundler/constants", __dir__)
|
|
64
|
+
autoload :Override, File.expand_path("bundler/override", __dir__)
|
|
65
65
|
autoload :ProcessLock, File.expand_path("bundler/process_lock", __dir__)
|
|
66
66
|
autoload :RemoteSpecification, File.expand_path("bundler/remote_specification", __dir__)
|
|
67
67
|
autoload :Resolver, File.expand_path("bundler/resolver", __dir__)
|
|
@@ -119,7 +119,9 @@ module Bundler
|
|
|
119
119
|
def bin_path
|
|
120
120
|
@bin_path ||= begin
|
|
121
121
|
path = Bundler.settings[:bin] || "bin"
|
|
122
|
-
Pathname.new(path).expand_path(root).expand_path
|
|
122
|
+
path = Pathname.new(path).expand_path(root).expand_path
|
|
123
|
+
mkdir_p(path)
|
|
124
|
+
path
|
|
123
125
|
end
|
|
124
126
|
end
|
|
125
127
|
|