bundler 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bundler might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3111 -0
- data/LICENSE.md +23 -0
- data/README.md +63 -0
- data/bundler.gemspec +65 -0
- data/exe/bundle +31 -0
- data/exe/bundle_ruby +60 -0
- data/exe/bundler +4 -0
- data/lib/bundler.rb +567 -0
- data/lib/bundler/build_metadata.rb +53 -0
- data/lib/bundler/capistrano.rb +22 -0
- data/lib/bundler/cli.rb +792 -0
- data/lib/bundler/cli/add.rb +35 -0
- data/lib/bundler/cli/binstubs.rb +49 -0
- data/lib/bundler/cli/cache.rb +36 -0
- data/lib/bundler/cli/check.rb +38 -0
- data/lib/bundler/cli/clean.rb +25 -0
- data/lib/bundler/cli/common.rb +102 -0
- data/lib/bundler/cli/config.rb +119 -0
- data/lib/bundler/cli/console.rb +43 -0
- data/lib/bundler/cli/doctor.rb +140 -0
- data/lib/bundler/cli/exec.rb +105 -0
- data/lib/bundler/cli/gem.rb +252 -0
- data/lib/bundler/cli/info.rb +50 -0
- data/lib/bundler/cli/init.rb +47 -0
- data/lib/bundler/cli/inject.rb +60 -0
- data/lib/bundler/cli/install.rb +218 -0
- data/lib/bundler/cli/issue.rb +40 -0
- data/lib/bundler/cli/list.rb +58 -0
- data/lib/bundler/cli/lock.rb +63 -0
- data/lib/bundler/cli/open.rb +26 -0
- data/lib/bundler/cli/outdated.rb +266 -0
- data/lib/bundler/cli/package.rb +49 -0
- data/lib/bundler/cli/platform.rb +46 -0
- data/lib/bundler/cli/plugin.rb +24 -0
- data/lib/bundler/cli/pristine.rb +47 -0
- data/lib/bundler/cli/remove.rb +18 -0
- data/lib/bundler/cli/show.rb +75 -0
- data/lib/bundler/cli/update.rb +91 -0
- data/lib/bundler/cli/viz.rb +31 -0
- data/lib/bundler/compact_index_client.rb +109 -0
- data/lib/bundler/compact_index_client/cache.rb +118 -0
- data/lib/bundler/compact_index_client/updater.rb +116 -0
- data/lib/bundler/compatibility_guard.rb +13 -0
- data/lib/bundler/constants.rb +7 -0
- data/lib/bundler/current_ruby.rb +94 -0
- data/lib/bundler/definition.rb +995 -0
- data/lib/bundler/dep_proxy.rb +48 -0
- data/lib/bundler/dependency.rb +139 -0
- data/lib/bundler/deployment.rb +69 -0
- data/lib/bundler/deprecate.rb +44 -0
- data/lib/bundler/dsl.rb +615 -0
- data/lib/bundler/endpoint_specification.rb +141 -0
- data/lib/bundler/env.rb +149 -0
- data/lib/bundler/environment_preserver.rb +59 -0
- data/lib/bundler/errors.rb +158 -0
- data/lib/bundler/feature_flag.rb +75 -0
- data/lib/bundler/fetcher.rb +312 -0
- data/lib/bundler/fetcher/base.rb +52 -0
- data/lib/bundler/fetcher/compact_index.rb +126 -0
- data/lib/bundler/fetcher/dependency.rb +82 -0
- data/lib/bundler/fetcher/downloader.rb +84 -0
- data/lib/bundler/fetcher/index.rb +52 -0
- data/lib/bundler/friendly_errors.rb +131 -0
- data/lib/bundler/gem_helper.rb +217 -0
- data/lib/bundler/gem_helpers.rb +101 -0
- data/lib/bundler/gem_remote_fetcher.rb +43 -0
- data/lib/bundler/gem_tasks.rb +7 -0
- data/lib/bundler/gem_version_promoter.rb +190 -0
- data/lib/bundler/gemdeps.rb +29 -0
- data/lib/bundler/graph.rb +152 -0
- data/lib/bundler/index.rb +213 -0
- data/lib/bundler/injector.rb +253 -0
- data/lib/bundler/inline.rb +74 -0
- data/lib/bundler/installer.rb +318 -0
- data/lib/bundler/installer/gem_installer.rb +85 -0
- data/lib/bundler/installer/parallel_installer.rb +229 -0
- data/lib/bundler/installer/standalone.rb +53 -0
- data/lib/bundler/lazy_specification.rb +123 -0
- data/lib/bundler/lockfile_generator.rb +95 -0
- data/lib/bundler/lockfile_parser.rb +256 -0
- data/lib/bundler/match_platform.rb +24 -0
- data/lib/bundler/mirror.rb +223 -0
- data/lib/bundler/plugin.rb +294 -0
- data/lib/bundler/plugin/api.rb +81 -0
- data/lib/bundler/plugin/api/source.rb +306 -0
- data/lib/bundler/plugin/dsl.rb +53 -0
- data/lib/bundler/plugin/events.rb +61 -0
- data/lib/bundler/plugin/index.rb +165 -0
- data/lib/bundler/plugin/installer.rb +96 -0
- data/lib/bundler/plugin/installer/git.rb +38 -0
- data/lib/bundler/plugin/installer/rubygems.rb +27 -0
- data/lib/bundler/plugin/source_list.rb +27 -0
- data/lib/bundler/process_lock.rb +24 -0
- data/lib/bundler/psyched_yaml.rb +37 -0
- data/lib/bundler/remote_specification.rb +114 -0
- data/lib/bundler/resolver.rb +373 -0
- data/lib/bundler/resolver/spec_group.rb +106 -0
- data/lib/bundler/retry.rb +66 -0
- data/lib/bundler/ruby_dsl.rb +18 -0
- data/lib/bundler/ruby_version.rb +152 -0
- data/lib/bundler/rubygems_ext.rb +209 -0
- data/lib/bundler/rubygems_gem_installer.rb +99 -0
- data/lib/bundler/rubygems_integration.rb +915 -0
- data/lib/bundler/runtime.rb +322 -0
- data/lib/bundler/settings.rb +464 -0
- data/lib/bundler/settings/validator.rb +102 -0
- data/lib/bundler/setup.rb +28 -0
- data/lib/bundler/shared_helpers.rb +386 -0
- data/lib/bundler/similarity_detector.rb +63 -0
- data/lib/bundler/source.rb +94 -0
- data/lib/bundler/source/gemspec.rb +18 -0
- data/lib/bundler/source/git.rb +329 -0
- data/lib/bundler/source/git/git_proxy.rb +262 -0
- data/lib/bundler/source/metadata.rb +62 -0
- data/lib/bundler/source/path.rb +249 -0
- data/lib/bundler/source/path/installer.rb +74 -0
- data/lib/bundler/source/rubygems.rb +539 -0
- data/lib/bundler/source/rubygems/remote.rb +69 -0
- data/lib/bundler/source_list.rb +186 -0
- data/lib/bundler/spec_set.rb +208 -0
- data/lib/bundler/ssl_certs/.document +1 -0
- data/lib/bundler/ssl_certs/certificate_manager.rb +66 -0
- data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +21 -0
- data/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem +23 -0
- data/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem +25 -0
- data/lib/bundler/stub_specification.rb +108 -0
- data/lib/bundler/templates/.document +1 -0
- data/lib/bundler/templates/Executable +29 -0
- data/lib/bundler/templates/Executable.bundler +105 -0
- data/lib/bundler/templates/Executable.standalone +14 -0
- data/lib/bundler/templates/Gemfile +7 -0
- data/lib/bundler/templates/gems.rb +8 -0
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +74 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +4 -0
- data/lib/bundler/templates/newgem/LICENSE.txt.tt +21 -0
- data/lib/bundler/templates/newgem/README.md.tt +47 -0
- data/lib/bundler/templates/newgem/Rakefile.tt +29 -0
- data/lib/bundler/templates/newgem/bin/console.tt +14 -0
- data/lib/bundler/templates/newgem/bin/setup.tt +8 -0
- data/lib/bundler/templates/newgem/exe/newgem.tt +3 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +3 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +9 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +6 -0
- data/lib/bundler/templates/newgem/gitignore.tt +20 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +13 -0
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +7 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +50 -0
- data/lib/bundler/templates/newgem/rspec.tt +3 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +9 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +14 -0
- data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +11 -0
- data/lib/bundler/templates/newgem/test/test_helper.rb.tt +8 -0
- data/lib/bundler/templates/newgem/travis.yml.tt +7 -0
- data/lib/bundler/ui.rb +9 -0
- data/lib/bundler/ui/rg_proxy.rb +19 -0
- data/lib/bundler/ui/shell.rb +146 -0
- data/lib/bundler/ui/silent.rb +69 -0
- data/lib/bundler/uri_credentials_filter.rb +37 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1741 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils/version.rb +5 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +12 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +223 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +136 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +143 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +101 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +67 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +837 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +46 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +58 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb +27 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1233 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb +129 -0
- data/lib/bundler/vendor/thor/lib/thor.rb +509 -0
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +331 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +104 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +60 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +118 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +143 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +373 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +109 -0
- data/lib/bundler/vendor/thor/lib/thor/base.rb +678 -0
- data/lib/bundler/vendor/thor/lib/thor/command.rb +135 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +97 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +129 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +114 -0
- data/lib/bundler/vendor/thor/lib/thor/group.rb +281 -0
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +177 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +17 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +37 -0
- data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +88 -0
- data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +70 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +175 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +146 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +226 -0
- data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +71 -0
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +324 -0
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +81 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +482 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +149 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +126 -0
- data/lib/bundler/vendor/thor/lib/thor/util.rb +268 -0
- data/lib/bundler/vendor/thor/lib/thor/version.rb +3 -0
- data/lib/bundler/vendored_fileutils.rb +9 -0
- data/lib/bundler/vendored_molinillo.rb +4 -0
- data/lib/bundler/vendored_persistent.rb +52 -0
- data/lib/bundler/vendored_thor.rb +8 -0
- data/lib/bundler/version.rb +28 -0
- data/lib/bundler/version_ranges.rb +76 -0
- data/lib/bundler/vlad.rb +17 -0
- data/lib/bundler/worker.rb +106 -0
- data/lib/bundler/yaml_serializer.rb +90 -0
- data/man/bundle-add.1 +58 -0
- data/man/bundle-add.1.txt +52 -0
- data/man/bundle-add.ronn +40 -0
- data/man/bundle-binstubs.1 +40 -0
- data/man/bundle-binstubs.1.txt +48 -0
- data/man/bundle-binstubs.ronn +43 -0
- data/man/bundle-check.1 +31 -0
- data/man/bundle-check.1.txt +33 -0
- data/man/bundle-check.ronn +26 -0
- data/man/bundle-clean.1 +24 -0
- data/man/bundle-clean.1.txt +26 -0
- data/man/bundle-clean.ronn +18 -0
- data/man/bundle-config.1 +497 -0
- data/man/bundle-config.1.txt +529 -0
- data/man/bundle-config.ronn +397 -0
- data/man/bundle-doctor.1 +44 -0
- data/man/bundle-doctor.1.txt +44 -0
- data/man/bundle-doctor.ronn +33 -0
- data/man/bundle-exec.1 +165 -0
- data/man/bundle-exec.1.txt +178 -0
- data/man/bundle-exec.ronn +152 -0
- data/man/bundle-gem.1 +80 -0
- data/man/bundle-gem.1.txt +91 -0
- data/man/bundle-gem.ronn +78 -0
- data/man/bundle-info.1 +20 -0
- data/man/bundle-info.1.txt +21 -0
- data/man/bundle-info.ronn +17 -0
- data/man/bundle-init.1 +25 -0
- data/man/bundle-init.1.txt +34 -0
- data/man/bundle-init.ronn +29 -0
- data/man/bundle-inject.1 +33 -0
- data/man/bundle-inject.1.txt +32 -0
- data/man/bundle-inject.ronn +22 -0
- data/man/bundle-install.1 +308 -0
- data/man/bundle-install.1.txt +396 -0
- data/man/bundle-install.ronn +378 -0
- data/man/bundle-list.1 +50 -0
- data/man/bundle-list.1.txt +43 -0
- data/man/bundle-list.ronn +33 -0
- data/man/bundle-lock.1 +84 -0
- data/man/bundle-lock.1.txt +93 -0
- data/man/bundle-lock.ronn +94 -0
- data/man/bundle-open.1 +32 -0
- data/man/bundle-open.1.txt +29 -0
- data/man/bundle-open.ronn +19 -0
- data/man/bundle-outdated.1 +155 -0
- data/man/bundle-outdated.1.txt +131 -0
- data/man/bundle-outdated.ronn +111 -0
- data/man/bundle-package.1 +55 -0
- data/man/bundle-package.1.txt +79 -0
- data/man/bundle-package.ronn +72 -0
- data/man/bundle-platform.1 +61 -0
- data/man/bundle-platform.1.txt +57 -0
- data/man/bundle-platform.ronn +42 -0
- data/man/bundle-pristine.1 +34 -0
- data/man/bundle-pristine.1.txt +44 -0
- data/man/bundle-pristine.ronn +34 -0
- data/man/bundle-remove.1 +31 -0
- data/man/bundle-remove.1.txt +34 -0
- data/man/bundle-remove.ronn +23 -0
- data/man/bundle-show.1 +23 -0
- data/man/bundle-show.1.txt +27 -0
- data/man/bundle-show.ronn +21 -0
- data/man/bundle-update.1 +394 -0
- data/man/bundle-update.1.txt +391 -0
- data/man/bundle-update.ronn +350 -0
- data/man/bundle-viz.1 +39 -0
- data/man/bundle-viz.1.txt +39 -0
- data/man/bundle-viz.ronn +30 -0
- data/man/bundle.1 +136 -0
- data/man/bundle.1.txt +116 -0
- data/man/bundle.ronn +111 -0
- data/man/gemfile.5 +689 -0
- data/man/gemfile.5.ronn +521 -0
- data/man/gemfile.5.txt +653 -0
- data/man/index.txt +25 -0
- metadata +463 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
class Source
|
5
|
+
class Rubygems
|
6
|
+
class Remote
|
7
|
+
attr_reader :uri, :anonymized_uri, :original_uri
|
8
|
+
|
9
|
+
def initialize(uri)
|
10
|
+
orig_uri = uri
|
11
|
+
uri = Bundler.settings.mirror_for(uri)
|
12
|
+
@original_uri = orig_uri if orig_uri != uri
|
13
|
+
fallback_auth = Bundler.settings.credentials_for(uri)
|
14
|
+
|
15
|
+
@uri = apply_auth(uri, fallback_auth).freeze
|
16
|
+
@anonymized_uri = remove_auth(@uri).freeze
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [String] A slug suitable for use as a cache key for this
|
20
|
+
# remote.
|
21
|
+
#
|
22
|
+
def cache_slug
|
23
|
+
@cache_slug ||= begin
|
24
|
+
return nil unless SharedHelpers.md5_available?
|
25
|
+
|
26
|
+
cache_uri = original_uri || uri
|
27
|
+
|
28
|
+
# URI::File of Ruby 2.6 returns empty string when given "file://".
|
29
|
+
host = defined?(URI::File) && cache_uri.is_a?(URI::File) ? nil : cache_uri.host
|
30
|
+
|
31
|
+
uri_parts = [host, cache_uri.user, cache_uri.port, cache_uri.path]
|
32
|
+
uri_digest = SharedHelpers.digest(:MD5).hexdigest(uri_parts.compact.join("."))
|
33
|
+
|
34
|
+
uri_parts[-1] = uri_digest
|
35
|
+
uri_parts.compact.join(".")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_s
|
40
|
+
"rubygems remote at #{anonymized_uri}"
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def apply_auth(uri, auth)
|
46
|
+
if auth && uri.userinfo.nil?
|
47
|
+
uri = uri.dup
|
48
|
+
uri.userinfo = auth
|
49
|
+
end
|
50
|
+
|
51
|
+
uri
|
52
|
+
rescue URI::InvalidComponentError
|
53
|
+
error_message = "Please CGI escape your usernames and passwords before " \
|
54
|
+
"setting them for authentication."
|
55
|
+
raise HTTPError.new(error_message)
|
56
|
+
end
|
57
|
+
|
58
|
+
def remove_auth(uri)
|
59
|
+
if uri.userinfo
|
60
|
+
uri = uri.dup
|
61
|
+
uri.user = uri.password = nil
|
62
|
+
end
|
63
|
+
|
64
|
+
uri
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
class SourceList
|
5
|
+
attr_reader :path_sources,
|
6
|
+
:git_sources,
|
7
|
+
:plugin_sources,
|
8
|
+
:global_rubygems_source,
|
9
|
+
:metadata_source
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@path_sources = []
|
13
|
+
@git_sources = []
|
14
|
+
@plugin_sources = []
|
15
|
+
@global_rubygems_source = nil
|
16
|
+
@rubygems_aggregate = rubygems_aggregate_class.new
|
17
|
+
@rubygems_sources = []
|
18
|
+
@metadata_source = Source::Metadata.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_path_source(options = {})
|
22
|
+
if options["gemspec"]
|
23
|
+
add_source_to_list Source::Gemspec.new(options), path_sources
|
24
|
+
else
|
25
|
+
add_source_to_list Source::Path.new(options), path_sources
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_git_source(options = {})
|
30
|
+
add_source_to_list(Source::Git.new(options), git_sources).tap do |source|
|
31
|
+
warn_on_git_protocol(source)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_rubygems_source(options = {})
|
36
|
+
add_source_to_list Source::Rubygems.new(options), @rubygems_sources
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_plugin_source(source, options = {})
|
40
|
+
add_source_to_list Plugin.source(source).new(options), @plugin_sources
|
41
|
+
end
|
42
|
+
|
43
|
+
def global_rubygems_source=(uri)
|
44
|
+
if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
|
45
|
+
@global_rubygems_source ||= rubygems_aggregate_class.new("remotes" => uri)
|
46
|
+
end
|
47
|
+
add_rubygems_remote(uri)
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_rubygems_remote(uri)
|
51
|
+
if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
|
52
|
+
return if Bundler.feature_flag.disable_multisource?
|
53
|
+
raise InvalidOption, "`lockfile_uses_separate_rubygems_sources` cannot be set without `disable_multisource` being set"
|
54
|
+
end
|
55
|
+
@rubygems_aggregate.add_remote(uri)
|
56
|
+
@rubygems_aggregate
|
57
|
+
end
|
58
|
+
|
59
|
+
def default_source
|
60
|
+
global_rubygems_source || @rubygems_aggregate
|
61
|
+
end
|
62
|
+
|
63
|
+
def rubygems_sources
|
64
|
+
@rubygems_sources + [default_source]
|
65
|
+
end
|
66
|
+
|
67
|
+
def rubygems_remotes
|
68
|
+
rubygems_sources.map(&:remotes).flatten.uniq
|
69
|
+
end
|
70
|
+
|
71
|
+
def all_sources
|
72
|
+
path_sources + git_sources + plugin_sources + rubygems_sources + [metadata_source]
|
73
|
+
end
|
74
|
+
|
75
|
+
def get(source)
|
76
|
+
source_list_for(source).find {|s| equal_source?(source, s) || equivalent_source?(source, s) }
|
77
|
+
end
|
78
|
+
|
79
|
+
def lock_sources
|
80
|
+
if Bundler.feature_flag.lockfile_uses_separate_rubygems_sources?
|
81
|
+
[[default_source], @rubygems_sources, git_sources, path_sources, plugin_sources].map do |sources|
|
82
|
+
sources.sort_by(&:to_s)
|
83
|
+
end.flatten(1)
|
84
|
+
else
|
85
|
+
lock_sources = (path_sources + git_sources + plugin_sources).sort_by(&:to_s)
|
86
|
+
lock_sources << combine_rubygems_sources
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns true if there are changes
|
91
|
+
def replace_sources!(replacement_sources)
|
92
|
+
return true if replacement_sources.empty?
|
93
|
+
|
94
|
+
[path_sources, git_sources, plugin_sources].each do |source_list|
|
95
|
+
source_list.map! do |source|
|
96
|
+
replacement_sources.find {|s| s == source } || source
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
replacement_rubygems = !Bundler.feature_flag.lockfile_uses_separate_rubygems_sources? &&
|
101
|
+
replacement_sources.detect {|s| s.is_a?(Source::Rubygems) }
|
102
|
+
@rubygems_aggregate = replacement_rubygems if replacement_rubygems
|
103
|
+
|
104
|
+
return true if !equal_sources?(lock_sources, replacement_sources) && !equivalent_sources?(lock_sources, replacement_sources)
|
105
|
+
return true if replacement_rubygems && rubygems_remotes.to_set != replacement_rubygems.remotes.to_set
|
106
|
+
|
107
|
+
false
|
108
|
+
end
|
109
|
+
|
110
|
+
def cached!
|
111
|
+
all_sources.each(&:cached!)
|
112
|
+
end
|
113
|
+
|
114
|
+
def remote!
|
115
|
+
all_sources.each(&:remote!)
|
116
|
+
end
|
117
|
+
|
118
|
+
def rubygems_primary_remotes
|
119
|
+
@rubygems_aggregate.remotes
|
120
|
+
end
|
121
|
+
|
122
|
+
private
|
123
|
+
|
124
|
+
def rubygems_aggregate_class
|
125
|
+
Source::Rubygems
|
126
|
+
end
|
127
|
+
|
128
|
+
def add_source_to_list(source, list)
|
129
|
+
list.unshift(source).uniq!
|
130
|
+
source
|
131
|
+
end
|
132
|
+
|
133
|
+
def source_list_for(source)
|
134
|
+
case source
|
135
|
+
when Source::Git then git_sources
|
136
|
+
when Source::Path then path_sources
|
137
|
+
when Source::Rubygems then rubygems_sources
|
138
|
+
when Plugin::API::Source then plugin_sources
|
139
|
+
else raise ArgumentError, "Invalid source: #{source.inspect}"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def combine_rubygems_sources
|
144
|
+
Source::Rubygems.new("remotes" => rubygems_remotes)
|
145
|
+
end
|
146
|
+
|
147
|
+
def warn_on_git_protocol(source)
|
148
|
+
return if Bundler.settings["git.allow_insecure"]
|
149
|
+
|
150
|
+
if source.uri =~ /^git\:/
|
151
|
+
Bundler.ui.warn "The git source `#{source.uri}` uses the `git` protocol, " \
|
152
|
+
"which transmits data without encryption. Disable this warning with " \
|
153
|
+
"`bundle config git.allow_insecure true`, or switch to the `https` " \
|
154
|
+
"protocol to keep your data secure."
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def equal_sources?(lock_sources, replacement_sources)
|
159
|
+
lock_sources.to_set == replacement_sources.to_set
|
160
|
+
end
|
161
|
+
|
162
|
+
def equal_source?(source, other_source)
|
163
|
+
source == other_source
|
164
|
+
end
|
165
|
+
|
166
|
+
def equivalent_source?(source, other_source)
|
167
|
+
return false unless Bundler.settings[:allow_deployment_source_credential_changes] && source.is_a?(Source::Rubygems)
|
168
|
+
|
169
|
+
equivalent_rubygems_sources?([source], [other_source])
|
170
|
+
end
|
171
|
+
|
172
|
+
def equivalent_sources?(lock_sources, replacement_sources)
|
173
|
+
return false unless Bundler.settings[:allow_deployment_source_credential_changes]
|
174
|
+
|
175
|
+
lock_rubygems_sources, lock_other_sources = lock_sources.partition {|s| s.is_a?(Source::Rubygems) }
|
176
|
+
replacement_rubygems_sources, replacement_other_sources = replacement_sources.partition {|s| s.is_a?(Source::Rubygems) }
|
177
|
+
|
178
|
+
equivalent_rubygems_sources?(lock_rubygems_sources, replacement_rubygems_sources) && equal_sources?(lock_other_sources, replacement_other_sources)
|
179
|
+
end
|
180
|
+
|
181
|
+
def equivalent_rubygems_sources?(lock_sources, replacement_sources)
|
182
|
+
actual_remotes = replacement_sources.map(&:remotes).flatten.uniq
|
183
|
+
lock_sources.all? {|s| s.equivalent_remotes?(actual_remotes) }
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "tsort"
|
4
|
+
require "set"
|
5
|
+
|
6
|
+
module Bundler
|
7
|
+
class SpecSet
|
8
|
+
include Enumerable
|
9
|
+
include TSort
|
10
|
+
|
11
|
+
def initialize(specs)
|
12
|
+
@specs = specs
|
13
|
+
end
|
14
|
+
|
15
|
+
def for(dependencies, skip = [], check = false, match_current_platform = false, raise_on_missing = true)
|
16
|
+
handled = Set.new
|
17
|
+
deps = dependencies.dup
|
18
|
+
specs = []
|
19
|
+
skip += ["bundler"]
|
20
|
+
|
21
|
+
loop do
|
22
|
+
break unless dep = deps.shift
|
23
|
+
next if !handled.add?(dep) || skip.include?(dep.name)
|
24
|
+
|
25
|
+
if spec = spec_for_dependency(dep, match_current_platform)
|
26
|
+
specs << spec
|
27
|
+
|
28
|
+
spec.dependencies.each do |d|
|
29
|
+
next if d.type == :development
|
30
|
+
d = DepProxy.new(d, dep.__platform) unless match_current_platform
|
31
|
+
deps << d
|
32
|
+
end
|
33
|
+
elsif check
|
34
|
+
return false
|
35
|
+
elsif raise_on_missing
|
36
|
+
others = lookup[dep.name] if match_current_platform
|
37
|
+
message = "Unable to find a spec satisfying #{dep} in the set. Perhaps the lockfile is corrupted?"
|
38
|
+
message += " Found #{others.join(", ")} that did not match the current platform." if others && !others.empty?
|
39
|
+
raise GemNotFound, message
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
if spec = lookup["bundler"].first
|
44
|
+
specs << spec
|
45
|
+
end
|
46
|
+
|
47
|
+
check ? true : SpecSet.new(specs)
|
48
|
+
end
|
49
|
+
|
50
|
+
def valid_for?(deps)
|
51
|
+
self.for(deps, [], true)
|
52
|
+
end
|
53
|
+
|
54
|
+
def [](key)
|
55
|
+
key = key.name if key.respond_to?(:name)
|
56
|
+
lookup[key].reverse
|
57
|
+
end
|
58
|
+
|
59
|
+
def []=(key, value)
|
60
|
+
@specs << value
|
61
|
+
@lookup = nil
|
62
|
+
@sorted = nil
|
63
|
+
value
|
64
|
+
end
|
65
|
+
|
66
|
+
def sort!
|
67
|
+
self
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_a
|
71
|
+
sorted.dup
|
72
|
+
end
|
73
|
+
|
74
|
+
def to_hash
|
75
|
+
lookup.dup
|
76
|
+
end
|
77
|
+
|
78
|
+
def materialize(deps, missing_specs = nil)
|
79
|
+
materialized = self.for(deps, [], false, true, !missing_specs).to_a
|
80
|
+
deps = materialized.map(&:name).uniq
|
81
|
+
materialized.map! do |s|
|
82
|
+
next s unless s.is_a?(LazySpecification)
|
83
|
+
s.source.dependency_names = deps if s.source.respond_to?(:dependency_names=)
|
84
|
+
spec = s.__materialize__
|
85
|
+
unless spec
|
86
|
+
unless missing_specs
|
87
|
+
raise GemNotFound, "Could not find #{s.full_name} in any of the sources"
|
88
|
+
end
|
89
|
+
missing_specs << s
|
90
|
+
end
|
91
|
+
spec
|
92
|
+
end
|
93
|
+
SpecSet.new(missing_specs ? materialized.compact : materialized)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Materialize for all the specs in the spec set, regardless of what platform they're for
|
97
|
+
# This is in contrast to how for does platform filtering (and specifically different from how `materialize` calls `for` only for the current platform)
|
98
|
+
# @return [Array<Gem::Specification>]
|
99
|
+
def materialized_for_all_platforms
|
100
|
+
names = @specs.map(&:name).uniq
|
101
|
+
@specs.map do |s|
|
102
|
+
next s unless s.is_a?(LazySpecification)
|
103
|
+
s.source.dependency_names = names if s.source.respond_to?(:dependency_names=)
|
104
|
+
spec = s.__materialize__
|
105
|
+
raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
|
106
|
+
spec
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def merge(set)
|
111
|
+
arr = sorted.dup
|
112
|
+
set.each do |set_spec|
|
113
|
+
full_name = set_spec.full_name
|
114
|
+
next if arr.any? {|spec| spec.full_name == full_name }
|
115
|
+
arr << set_spec
|
116
|
+
end
|
117
|
+
SpecSet.new(arr)
|
118
|
+
end
|
119
|
+
|
120
|
+
def find_by_name_and_platform(name, platform)
|
121
|
+
@specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
|
122
|
+
end
|
123
|
+
|
124
|
+
def what_required(spec)
|
125
|
+
unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } }
|
126
|
+
return [spec]
|
127
|
+
end
|
128
|
+
what_required(req) << spec
|
129
|
+
end
|
130
|
+
|
131
|
+
def <<(spec)
|
132
|
+
@specs << spec
|
133
|
+
end
|
134
|
+
|
135
|
+
def length
|
136
|
+
@specs.length
|
137
|
+
end
|
138
|
+
|
139
|
+
def size
|
140
|
+
@specs.size
|
141
|
+
end
|
142
|
+
|
143
|
+
def empty?
|
144
|
+
@specs.empty?
|
145
|
+
end
|
146
|
+
|
147
|
+
def each(&b)
|
148
|
+
sorted.each(&b)
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
def sorted
|
154
|
+
rake = @specs.find {|s| s.name == "rake" }
|
155
|
+
begin
|
156
|
+
@sorted ||= ([rake] + tsort).compact.uniq
|
157
|
+
rescue TSort::Cyclic => error
|
158
|
+
cgems = extract_circular_gems(error)
|
159
|
+
raise CyclicDependencyError, "Your bundle requires gems that depend" \
|
160
|
+
" on each other, creating an infinite loop. Please remove either" \
|
161
|
+
" gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again."
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def extract_circular_gems(error)
|
166
|
+
if Bundler.current_ruby.mri? && Bundler.current_ruby.on_19?
|
167
|
+
error.message.scan(/(\w+) \([^)]/).flatten
|
168
|
+
else
|
169
|
+
error.message.scan(/@name="(.*?)"/).flatten
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def lookup
|
174
|
+
@lookup ||= begin
|
175
|
+
lookup = Hash.new {|h, k| h[k] = [] }
|
176
|
+
Index.sort_specs(@specs).reverse_each do |s|
|
177
|
+
lookup[s.name] << s
|
178
|
+
end
|
179
|
+
lookup
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def tsort_each_node
|
184
|
+
# MUST sort by name for backwards compatibility
|
185
|
+
@specs.sort_by(&:name).each {|s| yield s }
|
186
|
+
end
|
187
|
+
|
188
|
+
def spec_for_dependency(dep, match_current_platform)
|
189
|
+
specs_for_platforms = lookup[dep.name]
|
190
|
+
if match_current_platform
|
191
|
+
Bundler.rubygems.platforms.reverse_each do |pl|
|
192
|
+
match = GemHelpers.select_best_platform_match(specs_for_platforms, pl)
|
193
|
+
return match if match
|
194
|
+
end
|
195
|
+
nil
|
196
|
+
else
|
197
|
+
GemHelpers.select_best_platform_match(specs_for_platforms, dep.__platform)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def tsort_each_child(s)
|
202
|
+
s.dependencies.sort_by(&:name).each do |d|
|
203
|
+
next if d.type == :development
|
204
|
+
lookup[d.name].each {|s2| yield s2 }
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|