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,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
module GemHelpers
|
5
|
+
GENERIC_CACHE = {} # rubocop:disable MutableConstant
|
6
|
+
GENERICS = [
|
7
|
+
[Gem::Platform.new("java"), Gem::Platform.new("java")],
|
8
|
+
[Gem::Platform.new("mswin32"), Gem::Platform.new("mswin32")],
|
9
|
+
[Gem::Platform.new("mswin64"), Gem::Platform.new("mswin64")],
|
10
|
+
[Gem::Platform.new("universal-mingw32"), Gem::Platform.new("universal-mingw32")],
|
11
|
+
[Gem::Platform.new("x64-mingw32"), Gem::Platform.new("x64-mingw32")],
|
12
|
+
[Gem::Platform.new("x86_64-mingw32"), Gem::Platform.new("x64-mingw32")],
|
13
|
+
[Gem::Platform.new("mingw32"), Gem::Platform.new("x86-mingw32")]
|
14
|
+
].freeze
|
15
|
+
|
16
|
+
def generic(p)
|
17
|
+
return p if p == Gem::Platform::RUBY
|
18
|
+
|
19
|
+
GENERIC_CACHE[p] ||= begin
|
20
|
+
_, found = GENERICS.find do |match, _generic|
|
21
|
+
p.os == match.os && (!match.cpu || p.cpu == match.cpu)
|
22
|
+
end
|
23
|
+
found || Gem::Platform::RUBY
|
24
|
+
end
|
25
|
+
end
|
26
|
+
module_function :generic
|
27
|
+
|
28
|
+
def generic_local_platform
|
29
|
+
generic(Bundler.local_platform)
|
30
|
+
end
|
31
|
+
module_function :generic_local_platform
|
32
|
+
|
33
|
+
def platform_specificity_match(spec_platform, user_platform)
|
34
|
+
spec_platform = Gem::Platform.new(spec_platform)
|
35
|
+
return PlatformMatch::EXACT_MATCH if spec_platform == user_platform
|
36
|
+
return PlatformMatch::WORST_MATCH if spec_platform.nil? || spec_platform == Gem::Platform::RUBY || user_platform == Gem::Platform::RUBY
|
37
|
+
|
38
|
+
PlatformMatch.new(
|
39
|
+
PlatformMatch.os_match(spec_platform, user_platform),
|
40
|
+
PlatformMatch.cpu_match(spec_platform, user_platform),
|
41
|
+
PlatformMatch.platform_version_match(spec_platform, user_platform)
|
42
|
+
)
|
43
|
+
end
|
44
|
+
module_function :platform_specificity_match
|
45
|
+
|
46
|
+
def select_best_platform_match(specs, platform)
|
47
|
+
specs.select {|spec| spec.match_platform(platform) }.
|
48
|
+
min_by {|spec| platform_specificity_match(spec.platform, platform) }
|
49
|
+
end
|
50
|
+
module_function :select_best_platform_match
|
51
|
+
|
52
|
+
PlatformMatch = Struct.new(:os_match, :cpu_match, :platform_version_match)
|
53
|
+
class PlatformMatch
|
54
|
+
def <=>(other)
|
55
|
+
return nil unless other.is_a?(PlatformMatch)
|
56
|
+
|
57
|
+
m = os_match <=> other.os_match
|
58
|
+
return m unless m.zero?
|
59
|
+
|
60
|
+
m = cpu_match <=> other.cpu_match
|
61
|
+
return m unless m.zero?
|
62
|
+
|
63
|
+
m = platform_version_match <=> other.platform_version_match
|
64
|
+
m
|
65
|
+
end
|
66
|
+
|
67
|
+
EXACT_MATCH = new(-1, -1, -1).freeze
|
68
|
+
WORST_MATCH = new(1_000_000, 1_000_000, 1_000_000).freeze
|
69
|
+
|
70
|
+
def self.os_match(spec_platform, user_platform)
|
71
|
+
if spec_platform.os == user_platform.os
|
72
|
+
0
|
73
|
+
else
|
74
|
+
1
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.cpu_match(spec_platform, user_platform)
|
79
|
+
if spec_platform.cpu == user_platform.cpu
|
80
|
+
0
|
81
|
+
elsif spec_platform.cpu == "arm" && user_platform.cpu.to_s.start_with?("arm")
|
82
|
+
0
|
83
|
+
elsif spec_platform.cpu.nil? || spec_platform.cpu == "universal"
|
84
|
+
1
|
85
|
+
else
|
86
|
+
2
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.platform_version_match(spec_platform, user_platform)
|
91
|
+
if spec_platform.version == user_platform.version
|
92
|
+
0
|
93
|
+
elsif spec_platform.version.nil?
|
94
|
+
1
|
95
|
+
else
|
96
|
+
2
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rubygems/remote_fetcher"
|
4
|
+
|
5
|
+
module Bundler
|
6
|
+
# Adds support for setting custom HTTP headers when fetching gems from the
|
7
|
+
# server.
|
8
|
+
#
|
9
|
+
# TODO: Get rid of this when and if gemstash only supports RubyGems versions
|
10
|
+
# that contain https://github.com/rubygems/rubygems/commit/3db265cc20b2f813.
|
11
|
+
class GemRemoteFetcher < Gem::RemoteFetcher
|
12
|
+
attr_accessor :headers
|
13
|
+
|
14
|
+
# Extracted from RubyGems 2.4.
|
15
|
+
def fetch_http(uri, last_modified = nil, head = false, depth = 0)
|
16
|
+
fetch_type = head ? Net::HTTP::Head : Net::HTTP::Get
|
17
|
+
# beginning of change
|
18
|
+
response = request uri, fetch_type, last_modified do |req|
|
19
|
+
headers.each {|k, v| req.add_field(k, v) } if headers
|
20
|
+
end
|
21
|
+
# end of change
|
22
|
+
|
23
|
+
case response
|
24
|
+
when Net::HTTPOK, Net::HTTPNotModified then
|
25
|
+
response.uri = uri if response.respond_to? :uri
|
26
|
+
head ? response : response.body
|
27
|
+
when Net::HTTPMovedPermanently, Net::HTTPFound, Net::HTTPSeeOther,
|
28
|
+
Net::HTTPTemporaryRedirect then
|
29
|
+
raise FetchError.new("too many redirects", uri) if depth > 10
|
30
|
+
|
31
|
+
location = URI.parse response["Location"]
|
32
|
+
|
33
|
+
if https?(uri) && !https?(location)
|
34
|
+
raise FetchError.new("redirecting to non-https resource: #{location}", uri)
|
35
|
+
end
|
36
|
+
|
37
|
+
fetch_http(location, last_modified, head, depth + 1)
|
38
|
+
else
|
39
|
+
raise FetchError.new("bad response #{response.message} #{response.code}", uri)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
# This class contains all of the logic for determining the next version of a
|
5
|
+
# Gem to update to based on the requested level (patch, minor, major).
|
6
|
+
# Primarily designed to work with Resolver which will provide it the list of
|
7
|
+
# available dependency versions as found in its index, before returning it to
|
8
|
+
# to the resolution engine to select the best version.
|
9
|
+
class GemVersionPromoter
|
10
|
+
DEBUG = ENV["DEBUG_RESOLVER"]
|
11
|
+
|
12
|
+
attr_reader :level, :locked_specs, :unlock_gems
|
13
|
+
|
14
|
+
# By default, strict is false, meaning every available version of a gem
|
15
|
+
# is returned from sort_versions. The order gives preference to the
|
16
|
+
# requested level (:patch, :minor, :major) but in complicated requirement
|
17
|
+
# cases some gems will by necessity by promoted past the requested level,
|
18
|
+
# or even reverted to older versions.
|
19
|
+
#
|
20
|
+
# If strict is set to true, the results from sort_versions will be
|
21
|
+
# truncated, eliminating any version outside the current level scope.
|
22
|
+
# This can lead to unexpected outcomes or even VersionConflict exceptions
|
23
|
+
# that report a version of a gem not existing for versions that indeed do
|
24
|
+
# existing in the referenced source.
|
25
|
+
attr_accessor :strict
|
26
|
+
|
27
|
+
attr_accessor :prerelease_specified
|
28
|
+
|
29
|
+
# Given a list of locked_specs and a list of gems to unlock creates a
|
30
|
+
# GemVersionPromoter instance.
|
31
|
+
#
|
32
|
+
# @param locked_specs [SpecSet] All current locked specs. Unlike Definition
|
33
|
+
# where this list is empty if all gems are being updated, this should
|
34
|
+
# always be populated for all gems so this class can properly function.
|
35
|
+
# @param unlock_gems [String] List of gem names being unlocked. If empty,
|
36
|
+
# all gems will be considered unlocked.
|
37
|
+
# @return [GemVersionPromoter]
|
38
|
+
def initialize(locked_specs = SpecSet.new([]), unlock_gems = [])
|
39
|
+
@level = :major
|
40
|
+
@strict = false
|
41
|
+
@locked_specs = locked_specs
|
42
|
+
@unlock_gems = unlock_gems
|
43
|
+
@sort_versions = {}
|
44
|
+
@prerelease_specified = {}
|
45
|
+
end
|
46
|
+
|
47
|
+
# @param value [Symbol] One of three Symbols: :major, :minor or :patch.
|
48
|
+
def level=(value)
|
49
|
+
v = case value
|
50
|
+
when String, Symbol
|
51
|
+
value.to_sym
|
52
|
+
end
|
53
|
+
|
54
|
+
raise ArgumentError, "Unexpected level #{v}. Must be :major, :minor or :patch" unless [:major, :minor, :patch].include?(v)
|
55
|
+
@level = v
|
56
|
+
end
|
57
|
+
|
58
|
+
# Given a Dependency and an Array of SpecGroups of available versions for a
|
59
|
+
# gem, this method will return the Array of SpecGroups sorted (and possibly
|
60
|
+
# truncated if strict is true) in an order to give preference to the current
|
61
|
+
# level (:major, :minor or :patch) when resolution is deciding what versions
|
62
|
+
# best resolve all dependencies in the bundle.
|
63
|
+
# @param dep [Dependency] The Dependency of the gem.
|
64
|
+
# @param spec_groups [SpecGroup] An array of SpecGroups for the same gem
|
65
|
+
# named in the @dep param.
|
66
|
+
# @return [SpecGroup] A new instance of the SpecGroup Array sorted and
|
67
|
+
# possibly filtered.
|
68
|
+
def sort_versions(dep, spec_groups)
|
69
|
+
before_result = "before sort_versions: #{debug_format_result(dep, spec_groups).inspect}" if DEBUG
|
70
|
+
|
71
|
+
@sort_versions[dep] ||= begin
|
72
|
+
gem_name = dep.name
|
73
|
+
|
74
|
+
# An Array per version returned, different entries for different platforms.
|
75
|
+
# We only need the version here so it's ok to hard code this to the first instance.
|
76
|
+
locked_spec = locked_specs[gem_name].first
|
77
|
+
|
78
|
+
if strict
|
79
|
+
filter_dep_specs(spec_groups, locked_spec)
|
80
|
+
else
|
81
|
+
sort_dep_specs(spec_groups, locked_spec)
|
82
|
+
end.tap do |specs|
|
83
|
+
if DEBUG
|
84
|
+
STDERR.puts before_result
|
85
|
+
STDERR.puts " after sort_versions: #{debug_format_result(dep, specs).inspect}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# @return [bool] Convenience method for testing value of level variable.
|
92
|
+
def major?
|
93
|
+
level == :major
|
94
|
+
end
|
95
|
+
|
96
|
+
# @return [bool] Convenience method for testing value of level variable.
|
97
|
+
def minor?
|
98
|
+
level == :minor
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def filter_dep_specs(spec_groups, locked_spec)
|
104
|
+
res = spec_groups.select do |spec_group|
|
105
|
+
if locked_spec && !major?
|
106
|
+
gsv = spec_group.version
|
107
|
+
lsv = locked_spec.version
|
108
|
+
|
109
|
+
must_match = minor? ? [0] : [0, 1]
|
110
|
+
|
111
|
+
matches = must_match.map {|idx| gsv.segments[idx] == lsv.segments[idx] }
|
112
|
+
(matches.uniq == [true]) ? (gsv >= lsv) : false
|
113
|
+
else
|
114
|
+
true
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
sort_dep_specs(res, locked_spec)
|
119
|
+
end
|
120
|
+
|
121
|
+
def sort_dep_specs(spec_groups, locked_spec)
|
122
|
+
return spec_groups unless locked_spec
|
123
|
+
@gem_name = locked_spec.name
|
124
|
+
@locked_version = locked_spec.version
|
125
|
+
|
126
|
+
result = spec_groups.sort do |a, b|
|
127
|
+
@a_ver = a.version
|
128
|
+
@b_ver = b.version
|
129
|
+
|
130
|
+
unless @prerelease_specified[@gem_name]
|
131
|
+
a_pre = @a_ver.prerelease?
|
132
|
+
b_pre = @b_ver.prerelease?
|
133
|
+
|
134
|
+
next -1 if a_pre && !b_pre
|
135
|
+
next 1 if b_pre && !a_pre
|
136
|
+
end
|
137
|
+
|
138
|
+
if major?
|
139
|
+
@a_ver <=> @b_ver
|
140
|
+
elsif either_version_older_than_locked
|
141
|
+
@a_ver <=> @b_ver
|
142
|
+
elsif segments_do_not_match(:major)
|
143
|
+
@b_ver <=> @a_ver
|
144
|
+
elsif !minor? && segments_do_not_match(:minor)
|
145
|
+
@b_ver <=> @a_ver
|
146
|
+
else
|
147
|
+
@a_ver <=> @b_ver
|
148
|
+
end
|
149
|
+
end
|
150
|
+
post_sort(result)
|
151
|
+
end
|
152
|
+
|
153
|
+
def either_version_older_than_locked
|
154
|
+
@a_ver < @locked_version || @b_ver < @locked_version
|
155
|
+
end
|
156
|
+
|
157
|
+
def segments_do_not_match(level)
|
158
|
+
index = [:major, :minor].index(level)
|
159
|
+
@a_ver.segments[index] != @b_ver.segments[index]
|
160
|
+
end
|
161
|
+
|
162
|
+
def unlocking_gem?
|
163
|
+
unlock_gems.empty? || unlock_gems.include?(@gem_name)
|
164
|
+
end
|
165
|
+
|
166
|
+
# Specific version moves can't always reliably be done during sorting
|
167
|
+
# as not all elements are compared against each other.
|
168
|
+
def post_sort(result)
|
169
|
+
# default :major behavior in Bundler does not do this
|
170
|
+
return result if major?
|
171
|
+
if unlocking_gem?
|
172
|
+
result
|
173
|
+
else
|
174
|
+
move_version_to_end(result, @locked_version)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def move_version_to_end(result, version)
|
179
|
+
move, keep = result.partition {|s| s.version.to_s == version.to_s }
|
180
|
+
keep.concat(move)
|
181
|
+
end
|
182
|
+
|
183
|
+
def debug_format_result(dep, spec_groups)
|
184
|
+
a = [dep.to_s,
|
185
|
+
spec_groups.map {|sg| [sg.version, sg.dependencies_for_activated_platforms.map {|dp| [dp.name, dp.requirement.to_s] }] }]
|
186
|
+
last_map = a.last.map {|sg_data| [sg_data.first.version, sg_data.last.map {|aa| aa.join(" ") }] }
|
187
|
+
[a.first, last_map, level, strict ? :strict : :not_strict]
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
class Gemdeps
|
5
|
+
def initialize(runtime)
|
6
|
+
@runtime = runtime
|
7
|
+
end
|
8
|
+
|
9
|
+
def requested_specs
|
10
|
+
@runtime.requested_specs
|
11
|
+
end
|
12
|
+
|
13
|
+
def specs
|
14
|
+
@runtime.specs
|
15
|
+
end
|
16
|
+
|
17
|
+
def dependencies
|
18
|
+
@runtime.dependencies
|
19
|
+
end
|
20
|
+
|
21
|
+
def current_dependencies
|
22
|
+
@runtime.current_dependencies
|
23
|
+
end
|
24
|
+
|
25
|
+
def requires
|
26
|
+
@runtime.requires
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "set"
|
4
|
+
module Bundler
|
5
|
+
class Graph
|
6
|
+
GRAPH_NAME = :Gemfile
|
7
|
+
|
8
|
+
def initialize(env, output_file, show_version = false, show_requirements = false, output_format = "png", without = [])
|
9
|
+
@env = env
|
10
|
+
@output_file = output_file
|
11
|
+
@show_version = show_version
|
12
|
+
@show_requirements = show_requirements
|
13
|
+
@output_format = output_format
|
14
|
+
@without_groups = without.map(&:to_sym)
|
15
|
+
|
16
|
+
@groups = []
|
17
|
+
@relations = Hash.new {|h, k| h[k] = Set.new }
|
18
|
+
@node_options = {}
|
19
|
+
@edge_options = {}
|
20
|
+
|
21
|
+
_populate_relations
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :groups, :relations, :node_options, :edge_options, :output_file, :output_format
|
25
|
+
|
26
|
+
def viz
|
27
|
+
GraphVizClient.new(self).run
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def _populate_relations
|
33
|
+
parent_dependencies = _groups.values.to_set.flatten
|
34
|
+
loop do
|
35
|
+
break if parent_dependencies.empty?
|
36
|
+
|
37
|
+
tmp = Set.new
|
38
|
+
parent_dependencies.each do |dependency|
|
39
|
+
child_dependencies = spec_for_dependency(dependency).runtime_dependencies.to_set
|
40
|
+
@relations[dependency.name] += child_dependencies.map(&:name).to_set
|
41
|
+
tmp += child_dependencies
|
42
|
+
|
43
|
+
@node_options[dependency.name] = _make_label(dependency, :node)
|
44
|
+
child_dependencies.each do |c_dependency|
|
45
|
+
@edge_options["#{dependency.name}_#{c_dependency.name}"] = _make_label(c_dependency, :edge)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
parent_dependencies = tmp
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def _groups
|
53
|
+
relations = Hash.new {|h, k| h[k] = Set.new }
|
54
|
+
@env.current_dependencies.each do |dependency|
|
55
|
+
dependency.groups.each do |group|
|
56
|
+
next if @without_groups.include?(group)
|
57
|
+
|
58
|
+
relations[group.to_s].add(dependency)
|
59
|
+
@relations[group.to_s].add(dependency.name)
|
60
|
+
|
61
|
+
@node_options[group.to_s] ||= _make_label(group, :node)
|
62
|
+
@edge_options["#{group}_#{dependency.name}"] = _make_label(dependency, :edge)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
@groups = relations.keys
|
66
|
+
relations
|
67
|
+
end
|
68
|
+
|
69
|
+
def _make_label(symbol_or_string_or_dependency, element_type)
|
70
|
+
case element_type.to_sym
|
71
|
+
when :node
|
72
|
+
if symbol_or_string_or_dependency.is_a?(Gem::Dependency)
|
73
|
+
label = symbol_or_string_or_dependency.name.dup
|
74
|
+
label << "\n#{spec_for_dependency(symbol_or_string_or_dependency).version}" if @show_version
|
75
|
+
else
|
76
|
+
label = symbol_or_string_or_dependency.to_s
|
77
|
+
end
|
78
|
+
when :edge
|
79
|
+
label = nil
|
80
|
+
if symbol_or_string_or_dependency.respond_to?(:requirements_list) && @show_requirements
|
81
|
+
tmp = symbol_or_string_or_dependency.requirements_list.join(", ")
|
82
|
+
label = tmp if tmp != ">= 0"
|
83
|
+
end
|
84
|
+
else
|
85
|
+
raise ArgumentError, "2nd argument is invalid"
|
86
|
+
end
|
87
|
+
label.nil? ? {} : { :label => label }
|
88
|
+
end
|
89
|
+
|
90
|
+
def spec_for_dependency(dependency)
|
91
|
+
@env.requested_specs.find {|s| s.name == dependency.name }
|
92
|
+
end
|
93
|
+
|
94
|
+
class GraphVizClient
|
95
|
+
def initialize(graph_instance)
|
96
|
+
@graph_name = graph_instance.class::GRAPH_NAME
|
97
|
+
@groups = graph_instance.groups
|
98
|
+
@relations = graph_instance.relations
|
99
|
+
@node_options = graph_instance.node_options
|
100
|
+
@edge_options = graph_instance.edge_options
|
101
|
+
@output_file = graph_instance.output_file
|
102
|
+
@output_format = graph_instance.output_format
|
103
|
+
end
|
104
|
+
|
105
|
+
def g
|
106
|
+
@g ||= ::GraphViz.digraph(@graph_name, :concentrate => true, :normalize => true, :nodesep => 0.55) do |g|
|
107
|
+
g.edge[:weight] = 2
|
108
|
+
g.edge[:fontname] = g.node[:fontname] = "Arial, Helvetica, SansSerif"
|
109
|
+
g.edge[:fontsize] = 12
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def run
|
114
|
+
@groups.each do |group|
|
115
|
+
g.add_nodes(
|
116
|
+
group, {
|
117
|
+
:style => "filled",
|
118
|
+
:fillcolor => "#B9B9D5",
|
119
|
+
:shape => "box3d",
|
120
|
+
:fontsize => 16
|
121
|
+
}.merge(@node_options[group])
|
122
|
+
)
|
123
|
+
end
|
124
|
+
|
125
|
+
@relations.each do |parent, children|
|
126
|
+
children.each do |child|
|
127
|
+
if @groups.include?(parent)
|
128
|
+
g.add_nodes(child, { :style => "filled", :fillcolor => "#B9B9D5" }.merge(@node_options[child]))
|
129
|
+
g.add_edges(parent, child, { :constraint => false }.merge(@edge_options["#{parent}_#{child}"]))
|
130
|
+
else
|
131
|
+
g.add_nodes(child, @node_options[child])
|
132
|
+
g.add_edges(parent, child, @edge_options["#{parent}_#{child}"])
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
if @output_format.to_s == "debug"
|
138
|
+
$stdout.puts g.output :none => String
|
139
|
+
Bundler.ui.info "debugging bundle viz..."
|
140
|
+
else
|
141
|
+
begin
|
142
|
+
g.output @output_format.to_sym => "#{@output_file}.#{@output_format}"
|
143
|
+
Bundler.ui.info "#{@output_file}.#{@output_format}"
|
144
|
+
rescue ArgumentError => e
|
145
|
+
$stderr.puts "Unsupported output format. See Ruby-Graphviz/lib/graphviz/constants.rb"
|
146
|
+
raise e
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|