bundler 2.5.5 → 2.5.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +51 -0
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/cli/binstubs.rb +1 -1
- data/lib/bundler/cli/gem.rb +1 -1
- data/lib/bundler/cli/lock.rb +5 -4
- data/lib/bundler/cli/plugin.rb +3 -2
- data/lib/bundler/cli.rb +2 -2
- data/lib/bundler/definition.rb +54 -28
- data/lib/bundler/dsl.rb +16 -1
- data/lib/bundler/environment_preserver.rb +3 -3
- data/lib/bundler/fetcher/downloader.rb +1 -1
- data/lib/bundler/fetcher.rb +2 -2
- data/lib/bundler/gem_version_promoter.rb +42 -38
- data/lib/bundler/injector.rb +1 -1
- data/lib/bundler/installer.rb +2 -2
- data/lib/bundler/man/bundle-add.1 +1 -1
- data/lib/bundler/man/bundle-binstubs.1 +1 -1
- data/lib/bundler/man/bundle-cache.1 +1 -1
- 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 +1 -1
- data/lib/bundler/man/bundle-console.1 +1 -1
- data/lib/bundler/man/bundle-doctor.1 +1 -1
- data/lib/bundler/man/bundle-exec.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-inject.1 +1 -1
- data/lib/bundler/man/bundle-install.1 +3 -3
- data/lib/bundler/man/bundle-install.1.ronn +2 -2
- data/lib/bundler/man/bundle-list.1 +1 -1
- data/lib/bundler/man/bundle-lock.1 +1 -1
- data/lib/bundler/man/bundle-open.1 +1 -1
- data/lib/bundler/man/bundle-outdated.1 +1 -1
- data/lib/bundler/man/bundle-platform.1 +1 -1
- data/lib/bundler/man/bundle-plugin.1 +7 -4
- data/lib/bundler/man/bundle-plugin.1.ronn +7 -3
- 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 +1 -1
- data/lib/bundler/man/bundle-version.1 +1 -1
- data/lib/bundler/man/bundle-viz.1 +1 -1
- data/lib/bundler/man/bundle.1 +1 -1
- data/lib/bundler/man/gemfile.5 +3 -3
- data/lib/bundler/man/gemfile.5.ronn +2 -2
- data/lib/bundler/mirror.rb +3 -3
- data/lib/bundler/plugin/api/source.rb +2 -2
- data/lib/bundler/plugin/installer/path.rb +18 -0
- data/lib/bundler/plugin/installer.rb +36 -16
- data/lib/bundler/plugin/source_list.rb +4 -4
- data/lib/bundler/resolver/candidate.rb +1 -1
- data/lib/bundler/resolver.rb +54 -24
- data/lib/bundler/runtime.rb +1 -1
- data/lib/bundler/self_manager.rb +1 -1
- data/lib/bundler/settings.rb +14 -11
- data/lib/bundler/source/git/git_proxy.rb +1 -1
- data/lib/bundler/source/git.rb +1 -1
- data/lib/bundler/source/rubygems/remote.rb +1 -1
- data/lib/bundler/source/rubygems.rb +4 -4
- data/lib/bundler/source_list.rb +2 -2
- data/lib/bundler/spec_set.rb +1 -1
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +4 -3
- data/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
- data/lib/bundler/uri_credentials_filter.rb +2 -2
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +22 -22
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +1 -0
- data/lib/bundler/vendored_net_http.rb +7 -3
- data/lib/bundler/vendored_timeout.rb +7 -3
- data/lib/bundler/vendored_uri.rb +18 -1
- data/lib/bundler/version.rb +1 -1
- data/lib/bundler/yaml_serializer.rb +12 -0
- data/lib/bundler.rb +3 -2
- metadata +4 -3
@@ -379,5 +379,5 @@ does not work, run [bundle update(1)](bundle-update.1.html).
|
|
379
379
|
|
380
380
|
## SEE ALSO
|
381
381
|
|
382
|
-
* [Gem install docs](
|
383
|
-
* [Rubygems signing docs](
|
382
|
+
* [Gem install docs](https://guides.rubygems.org/rubygems-basics/#installing-gems)
|
383
|
+
* [Rubygems signing docs](https://guides.rubygems.org/security/)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.\" generated with nRonn/v0.11.1
|
2
2
|
.\" https://github.com/n-ronn/nronn/tree/0.11.1
|
3
|
-
.TH "BUNDLE\-LOCK" "1" "
|
3
|
+
.TH "BUNDLE\-LOCK" "1" "March 2024" ""
|
4
4
|
.SH "NAME"
|
5
5
|
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
|
6
6
|
.SH "SYNOPSIS"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.\" generated with nRonn/v0.11.1
|
2
2
|
.\" https://github.com/n-ronn/nronn/tree/0.11.1
|
3
|
-
.TH "BUNDLE\-OPEN" "1" "
|
3
|
+
.TH "BUNDLE\-OPEN" "1" "March 2024" ""
|
4
4
|
.SH "NAME"
|
5
5
|
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
|
6
6
|
.SH "SYNOPSIS"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.\" generated with nRonn/v0.11.1
|
2
2
|
.\" https://github.com/n-ronn/nronn/tree/0.11.1
|
3
|
-
.TH "BUNDLE\-OUTDATED" "1" "
|
3
|
+
.TH "BUNDLE\-OUTDATED" "1" "March 2024" ""
|
4
4
|
.SH "NAME"
|
5
5
|
\fBbundle\-outdated\fR \- List installed gems with newer versions available
|
6
6
|
.SH "SYNOPSIS"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.\" generated with nRonn/v0.11.1
|
2
2
|
.\" https://github.com/n-ronn/nronn/tree/0.11.1
|
3
|
-
.TH "BUNDLE\-PLATFORM" "1" "
|
3
|
+
.TH "BUNDLE\-PLATFORM" "1" "March 2024" ""
|
4
4
|
.SH "NAME"
|
5
5
|
\fBbundle\-platform\fR \- Displays platform compatibility information
|
6
6
|
.SH "SYNOPSIS"
|
@@ -1,10 +1,10 @@
|
|
1
1
|
.\" generated with nRonn/v0.11.1
|
2
2
|
.\" https://github.com/n-ronn/nronn/tree/0.11.1
|
3
|
-
.TH "BUNDLE\-PLUGIN" "1" "
|
3
|
+
.TH "BUNDLE\-PLUGIN" "1" "March 2024" ""
|
4
4
|
.SH "NAME"
|
5
5
|
\fBbundle\-plugin\fR \- Manage Bundler plugins
|
6
6
|
.SH "SYNOPSIS"
|
7
|
-
\fBbundle plugin\fR install PLUGINS [\-\-source=\fISOURCE\fR] [\-\-version=\fIversion\fR] [\-\-git
|
7
|
+
\fBbundle plugin\fR install PLUGINS [\-\-source=\fISOURCE\fR] [\-\-version=\fIversion\fR] [\-\-git=\fIgit\-url\fR] [\-\-branch=\fIbranch\fR|\-\-ref=\fIrev\fR] [\-\-path=\fIpath\fR]
|
8
8
|
.br
|
9
9
|
\fBbundle plugin\fR uninstall PLUGINS
|
10
10
|
.br
|
@@ -27,7 +27,7 @@ Install bundler\-graph gem from example\.com\. The global source, specified in s
|
|
27
27
|
You can specify the version of the gem via \fB\-\-version\fR\.
|
28
28
|
.TP
|
29
29
|
\fBbundle plugin install bundler\-graph \-\-git https://github\.com/rubygems/bundler\-graph\fR
|
30
|
-
Install bundler\-graph gem from Git repository\.
|
30
|
+
Install bundler\-graph gem from Git repository\. You can use standard Git URLs like:
|
31
31
|
.IP
|
32
32
|
\fBssh://[user@]host\.xz[:port]/path/to/repo\.git\fR
|
33
33
|
.br
|
@@ -37,7 +37,10 @@ Install bundler\-graph gem from Git repository\. \fB\-\-git\fR can be replaced w
|
|
37
37
|
.br
|
38
38
|
\fBfile:///path/to/repo\fR
|
39
39
|
.IP
|
40
|
-
When you specify \fB\-\-git\fR
|
40
|
+
When you specify \fB\-\-git\fR, you can use \fB\-\-branch\fR or \fB\-\-ref\fR to specify any branch, tag, or commit hash (revision) to use\.
|
41
|
+
.TP
|
42
|
+
\fBbundle plugin install bundler\-graph \-\-path \.\./bundler\-graph\fR
|
43
|
+
Install bundler\-graph gem from a local path\.
|
41
44
|
.SS "uninstall"
|
42
45
|
Uninstall the plugin(s) specified in PLUGINS\.
|
43
46
|
.SS "list"
|
@@ -4,7 +4,8 @@ bundle-plugin(1) -- Manage Bundler plugins
|
|
4
4
|
## SYNOPSIS
|
5
5
|
|
6
6
|
`bundle plugin` install PLUGINS [--source=<SOURCE>] [--version=<version>]
|
7
|
-
[--git
|
7
|
+
[--git=<git-url>] [--branch=<branch>|--ref=<rev>]
|
8
|
+
[--path=<path>]<br>
|
8
9
|
`bundle plugin` uninstall PLUGINS<br>
|
9
10
|
`bundle plugin` list<br>
|
10
11
|
`bundle plugin` help [COMMAND]
|
@@ -29,14 +30,17 @@ Install the given plugin(s).
|
|
29
30
|
You can specify the version of the gem via `--version`.
|
30
31
|
|
31
32
|
* `bundle plugin install bundler-graph --git https://github.com/rubygems/bundler-graph`:
|
32
|
-
Install bundler-graph gem from Git repository.
|
33
|
+
Install bundler-graph gem from Git repository. You can use standard Git URLs like:
|
33
34
|
|
34
35
|
`ssh://[user@]host.xz[:port]/path/to/repo.git`<br>
|
35
36
|
`http[s]://host.xz[:port]/path/to/repo.git`<br>
|
36
37
|
`/path/to/repo`<br>
|
37
38
|
`file:///path/to/repo`
|
38
39
|
|
39
|
-
When you specify `--git
|
40
|
+
When you specify `--git`, you can use `--branch` or `--ref` to specify any branch, tag, or commit hash (revision) to use.
|
41
|
+
|
42
|
+
* `bundle plugin install bundler-graph --path ../bundler-graph`:
|
43
|
+
Install bundler-graph gem from a local path.
|
40
44
|
|
41
45
|
### uninstall
|
42
46
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.\" generated with nRonn/v0.11.1
|
2
2
|
.\" https://github.com/n-ronn/nronn/tree/0.11.1
|
3
|
-
.TH "BUNDLE\-PRISTINE" "1" "
|
3
|
+
.TH "BUNDLE\-PRISTINE" "1" "March 2024" ""
|
4
4
|
.SH "NAME"
|
5
5
|
\fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
|
6
6
|
.SH "SYNOPSIS"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.\" generated with nRonn/v0.11.1
|
2
2
|
.\" https://github.com/n-ronn/nronn/tree/0.11.1
|
3
|
-
.TH "BUNDLE\-SHOW" "1" "
|
3
|
+
.TH "BUNDLE\-SHOW" "1" "March 2024" ""
|
4
4
|
.SH "NAME"
|
5
5
|
\fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
|
6
6
|
.SH "SYNOPSIS"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.\" generated with nRonn/v0.11.1
|
2
2
|
.\" https://github.com/n-ronn/nronn/tree/0.11.1
|
3
|
-
.TH "BUNDLE\-UPDATE" "1" "
|
3
|
+
.TH "BUNDLE\-UPDATE" "1" "March 2024" ""
|
4
4
|
.SH "NAME"
|
5
5
|
\fBbundle\-update\fR \- Update your gems to the latest available versions
|
6
6
|
.SH "SYNOPSIS"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.\" generated with nRonn/v0.11.1
|
2
2
|
.\" https://github.com/n-ronn/nronn/tree/0.11.1
|
3
|
-
.TH "BUNDLE\-VIZ" "1" "
|
3
|
+
.TH "BUNDLE\-VIZ" "1" "March 2024" ""
|
4
4
|
.SH "NAME"
|
5
5
|
\fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
|
6
6
|
.SH "SYNOPSIS"
|
data/lib/bundler/man/bundle.1
CHANGED
data/lib/bundler/man/gemfile.5
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
.\" generated with nRonn/v0.11.1
|
2
2
|
.\" https://github.com/n-ronn/nronn/tree/0.11.1
|
3
|
-
.TH "GEMFILE" "5" "
|
3
|
+
.TH "GEMFILE" "5" "March 2024" ""
|
4
4
|
.SH "NAME"
|
5
5
|
\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
|
6
6
|
.SH "SYNOPSIS"
|
@@ -72,7 +72,7 @@ A Ruby engine is an implementation of the Ruby language\.
|
|
72
72
|
.IP "\(bu" 4
|
73
73
|
For background: the reference or original implementation of the Ruby programming language is called Matz's Ruby Interpreter \fIhttps://en\.wikipedia\.org/wiki/Ruby_MRI\fR, or MRI for short\. This is named after Ruby creator Yukihiro Matsumoto, also known as Matz\. MRI is also known as CRuby, because it is written in C\. MRI is the most widely used Ruby engine\.
|
74
74
|
.IP "\(bu" 4
|
75
|
-
Other implementations \fIhttps://www\.ruby\-lang\.org/en/about/\fR of Ruby exist\. Some of the more well\-known implementations include JRuby \
|
75
|
+
Other implementations \fIhttps://www\.ruby\-lang\.org/en/about/\fR of Ruby exist\. Some of the more well\-known implementations include JRuby \fIhttps://www\.jruby\.org/\fR and TruffleRuby \fIhttps://www\.graalvm\.org/ruby/\fR\. Rubinius is an alternative implementation of Ruby written in Ruby\. JRuby is an implementation of Ruby on the JVM, short for Java Virtual Machine\. TruffleRuby is a Ruby implementation on the GraalVM, a language toolkit built on the JVM\.
|
76
76
|
.IP "" 0
|
77
77
|
.SS "ENGINE VERSION"
|
78
78
|
Each application \fImay\fR specify a Ruby engine version\. If an engine version is specified, an engine \fImust\fR also be specified\. If the engine is "ruby" the engine version specified \fImust\fR match the Ruby version\.
|
@@ -449,7 +449,7 @@ end
|
|
449
449
|
.fi
|
450
450
|
.IP "" 0
|
451
451
|
.SH "GEMSPEC"
|
452
|
-
The \fB\.gemspec\fR \
|
452
|
+
The \fB\.gemspec\fR \fIhttps://guides\.rubygems\.org/specification\-reference/\fR file is where you provide metadata about your gem to Rubygems\. Some required Gemspec attributes include the name, description, and homepage of your gem\. This is also where you specify the dependencies your gem needs to run\.
|
453
453
|
.P
|
454
454
|
If you wish to use Bundler to help install dependencies for a gem while it is being developed, use the \fBgemspec\fR method to pull in the dependencies listed in the \fB\.gemspec\fR file\.
|
455
455
|
.P
|
@@ -96,7 +96,7 @@ What exactly is an Engine?
|
|
96
96
|
|
97
97
|
- [Other implementations](https://www.ruby-lang.org/en/about/) of Ruby exist.
|
98
98
|
Some of the more well-known implementations include
|
99
|
-
[JRuby](
|
99
|
+
[JRuby](https://www.jruby.org/) and [TruffleRuby](https://www.graalvm.org/ruby/).
|
100
100
|
Rubinius is an alternative implementation of Ruby written in Ruby.
|
101
101
|
JRuby is an implementation of Ruby on the JVM, short for Java Virtual Machine.
|
102
102
|
TruffleRuby is a Ruby implementation on the GraalVM, a language toolkit built on the JVM.
|
@@ -509,7 +509,7 @@ software is installed or some other conditions are met.
|
|
509
509
|
|
510
510
|
## GEMSPEC
|
511
511
|
|
512
|
-
The [`.gemspec`](
|
512
|
+
The [`.gemspec`](https://guides.rubygems.org/specification-reference/) file is where
|
513
513
|
you provide metadata about your gem to Rubygems. Some required Gemspec
|
514
514
|
attributes include the name, description, and homepage of your gem. This is
|
515
515
|
also where you specify the dependencies your gem needs to run.
|
data/lib/bundler/mirror.rb
CHANGED
@@ -47,7 +47,7 @@ module Bundler
|
|
47
47
|
|
48
48
|
def fetch_valid_mirror_for(uri)
|
49
49
|
downcased = uri.to_s.downcase
|
50
|
-
mirror = @mirrors[downcased] || @mirrors[
|
50
|
+
mirror = @mirrors[downcased] || @mirrors[Gem::URI(downcased).host] || Mirror.new(uri)
|
51
51
|
mirror.validate!(@prober)
|
52
52
|
mirror = Mirror.new(uri) unless mirror.valid?
|
53
53
|
mirror
|
@@ -74,7 +74,7 @@ module Bundler
|
|
74
74
|
@uri = if uri.nil?
|
75
75
|
nil
|
76
76
|
else
|
77
|
-
|
77
|
+
Gem::URI(uri.to_s)
|
78
78
|
end
|
79
79
|
@valid = nil
|
80
80
|
end
|
@@ -126,7 +126,7 @@ module Bundler
|
|
126
126
|
if uri == "all"
|
127
127
|
@all = true
|
128
128
|
else
|
129
|
-
@uri =
|
129
|
+
@uri = Gem::URI(uri).absolute? ? Settings.normalize_uri(uri) : uri
|
130
130
|
end
|
131
131
|
@value = value
|
132
132
|
end
|
@@ -107,7 +107,7 @@ module Bundler
|
|
107
107
|
def install_path
|
108
108
|
@install_path ||=
|
109
109
|
begin
|
110
|
-
base_name = File.basename(
|
110
|
+
base_name = File.basename(Gem::URI.parse(uri).normalize.path)
|
111
111
|
|
112
112
|
gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}")
|
113
113
|
end
|
@@ -176,7 +176,7 @@ module Bundler
|
|
176
176
|
#
|
177
177
|
# This is used by `app_cache_path`
|
178
178
|
def app_cache_dirname
|
179
|
-
base_name = File.basename(
|
179
|
+
base_name = File.basename(Gem::URI.parse(uri).normalize.path)
|
180
180
|
"#{base_name}-#{uri_hash}"
|
181
181
|
end
|
182
182
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bundler
|
4
|
+
module Plugin
|
5
|
+
class Installer
|
6
|
+
class Path < Bundler::Source::Path
|
7
|
+
def root
|
8
|
+
SharedHelpers.in_bundle? ? Bundler.root : Plugin.root
|
9
|
+
end
|
10
|
+
|
11
|
+
def generate_bin(spec, disable_extensions = false)
|
12
|
+
# Need to find a way without code duplication
|
13
|
+
# For now, we can ignore this
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -10,6 +10,7 @@ module Bundler
|
|
10
10
|
class Installer
|
11
11
|
autoload :Rubygems, File.expand_path("installer/rubygems", __dir__)
|
12
12
|
autoload :Git, File.expand_path("installer/git", __dir__)
|
13
|
+
autoload :Path, File.expand_path("installer/path", __dir__)
|
13
14
|
|
14
15
|
def install(names, options)
|
15
16
|
check_sources_consistency!(options)
|
@@ -18,8 +19,8 @@ module Bundler
|
|
18
19
|
|
19
20
|
if options[:git]
|
20
21
|
install_git(names, version, options)
|
21
|
-
elsif options[:
|
22
|
-
|
22
|
+
elsif options[:path]
|
23
|
+
install_path(names, version, options[:path])
|
23
24
|
else
|
24
25
|
sources = options[:source] || Gem.sources
|
25
26
|
install_rubygems(names, version, sources)
|
@@ -45,20 +46,40 @@ module Bundler
|
|
45
46
|
if options.key?(:git) && options.key?(:local_git)
|
46
47
|
raise InvalidOption, "Remote and local plugin git sources can't be both specified"
|
47
48
|
end
|
49
|
+
|
50
|
+
# back-compat; local_git is an alias for git
|
51
|
+
if options.key?(:local_git)
|
52
|
+
Bundler::SharedHelpers.major_deprecation(2, "--local_git is deprecated, use --git")
|
53
|
+
options[:git] = options.delete(:local_git)
|
54
|
+
end
|
55
|
+
|
56
|
+
if (options.keys & [:source, :git, :path]).length > 1
|
57
|
+
raise InvalidOption, "Only one of --source, --git, or --path may be specified"
|
58
|
+
end
|
59
|
+
|
60
|
+
if (options.key?(:branch) || options.key?(:ref)) && !options.key?(:git)
|
61
|
+
raise InvalidOption, "--#{options.key?(:branch) ? "branch" : "ref"} can only be used with git sources"
|
62
|
+
end
|
63
|
+
|
64
|
+
if options.key?(:branch) && options.key?(:ref)
|
65
|
+
raise InvalidOption, "--branch and --ref can't be both specified"
|
66
|
+
end
|
48
67
|
end
|
49
68
|
|
50
69
|
def install_git(names, version, options)
|
51
|
-
|
52
|
-
|
70
|
+
source_list = SourceList.new
|
71
|
+
source = source_list.add_git_source({ "uri" => options[:git],
|
72
|
+
"branch" => options[:branch],
|
73
|
+
"ref" => options[:ref] })
|
53
74
|
|
54
|
-
install_all_sources(names, version,
|
75
|
+
install_all_sources(names, version, source_list, source)
|
55
76
|
end
|
56
77
|
|
57
|
-
def
|
58
|
-
|
59
|
-
|
78
|
+
def install_path(names, version, path)
|
79
|
+
source_list = SourceList.new
|
80
|
+
source = source_list.add_path_source({ "path" => path, "root_path" => SharedHelpers.pwd })
|
60
81
|
|
61
|
-
install_all_sources(names, version,
|
82
|
+
install_all_sources(names, version, source_list, source)
|
62
83
|
end
|
63
84
|
|
64
85
|
# Installs the plugin from rubygems source and returns the path where the
|
@@ -70,16 +91,15 @@ module Bundler
|
|
70
91
|
#
|
71
92
|
# @return [Hash] map of names to the specs of plugins installed
|
72
93
|
def install_rubygems(names, version, sources)
|
73
|
-
install_all_sources(names, version, nil, sources)
|
74
|
-
end
|
75
|
-
|
76
|
-
def install_all_sources(names, version, git_source_options, rubygems_source)
|
77
94
|
source_list = SourceList.new
|
78
95
|
|
79
|
-
source_list.
|
80
|
-
|
96
|
+
Array(sources).each {|remote| source_list.add_global_rubygems_remote(remote) }
|
97
|
+
|
98
|
+
install_all_sources(names, version, source_list)
|
99
|
+
end
|
81
100
|
|
82
|
-
|
101
|
+
def install_all_sources(names, version, source_list, source = nil)
|
102
|
+
deps = names.map {|name| Dependency.new(name, version, { "source" => source }) }
|
83
103
|
|
84
104
|
Bundler.configure_gem_home_and_path(Plugin.root)
|
85
105
|
|
@@ -9,6 +9,10 @@ module Bundler
|
|
9
9
|
add_source_to_list Plugin::Installer::Git.new(options), git_sources
|
10
10
|
end
|
11
11
|
|
12
|
+
def add_path_source(options = {})
|
13
|
+
add_source_to_list Plugin::Installer::Path.new(options), path_sources
|
14
|
+
end
|
15
|
+
|
12
16
|
def add_rubygems_source(options = {})
|
13
17
|
add_source_to_list Plugin::Installer::Rubygems.new(options), @rubygems_sources
|
14
18
|
end
|
@@ -17,10 +21,6 @@ module Bundler
|
|
17
21
|
path_sources + git_sources + rubygems_sources + [metadata_source]
|
18
22
|
end
|
19
23
|
|
20
|
-
def default_source
|
21
|
-
git_sources.first || global_rubygems_source
|
22
|
-
end
|
23
|
-
|
24
24
|
private
|
25
25
|
|
26
26
|
def rubygems_aggregate_class
|
@@ -15,7 +15,7 @@ module Bundler
|
|
15
15
|
# considered separately.
|
16
16
|
#
|
17
17
|
# Some candidates may also keep some information explicitly about the
|
18
|
-
# package
|
18
|
+
# package they refer to. These candidates are referred to as "canonical" and
|
19
19
|
# are used when materializing resolution results back into RubyGems
|
20
20
|
# specifications that can be installed, written to lock files, and so on.
|
21
21
|
#
|
data/lib/bundler/resolver.rb
CHANGED
@@ -50,26 +50,26 @@ module Bundler
|
|
50
50
|
specs[name] = matches.sort_by {|s| [s.version, s.platform.to_s] }
|
51
51
|
end
|
52
52
|
|
53
|
+
@all_versions = Hash.new do |candidates, package|
|
54
|
+
candidates[package] = all_versions_for(package)
|
55
|
+
end
|
56
|
+
|
53
57
|
@sorted_versions = Hash.new do |candidates, package|
|
54
|
-
candidates[package] =
|
55
|
-
[root_version]
|
56
|
-
else
|
57
|
-
all_versions_for(package).sort
|
58
|
-
end
|
58
|
+
candidates[package] = filtered_versions_for(package).sort
|
59
59
|
end
|
60
60
|
|
61
|
+
@sorted_versions[root] = [root_version]
|
62
|
+
|
61
63
|
root_dependencies = prepare_dependencies(@requirements, @packages)
|
62
64
|
|
63
65
|
@cached_dependencies = Hash.new do |dependencies, package|
|
64
|
-
dependencies[package] =
|
65
|
-
{
|
66
|
-
else
|
67
|
-
Hash.new do |versions, version|
|
68
|
-
versions[version] = to_dependency_hash(version.dependencies.reject {|d| d.name == package.name }, @packages)
|
69
|
-
end
|
66
|
+
dependencies[package] = Hash.new do |versions, version|
|
67
|
+
versions[version] = to_dependency_hash(version.dependencies.reject {|d| d.name == package.name }, @packages)
|
70
68
|
end
|
71
69
|
end
|
72
70
|
|
71
|
+
@cached_dependencies[root] = { root_version => root_dependencies }
|
72
|
+
|
73
73
|
logger = Bundler::UI::Shell.new
|
74
74
|
logger.level = debug? ? "debug" : "warn"
|
75
75
|
|
@@ -156,9 +156,15 @@ module Bundler
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def versions_for(package, range=VersionRange.any)
|
159
|
-
versions =
|
159
|
+
versions = select_sorted_versions(package, range)
|
160
160
|
|
161
|
-
|
161
|
+
# Conditional avoids (among other things) calling
|
162
|
+
# sort_versions_by_preferred with the root package
|
163
|
+
if versions.size > 1
|
164
|
+
sort_versions_by_preferred(package, versions)
|
165
|
+
else
|
166
|
+
versions
|
167
|
+
end
|
162
168
|
end
|
163
169
|
|
164
170
|
def no_versions_incompatibility_for(package, unsatisfied_term)
|
@@ -247,7 +253,7 @@ module Bundler
|
|
247
253
|
locked_requirement = base_requirements[name]
|
248
254
|
results = filter_matching_specs(results, locked_requirement) if locked_requirement
|
249
255
|
|
250
|
-
|
256
|
+
results.group_by(&:version).reduce([]) do |groups, (version, specs)|
|
251
257
|
platform_specs = package.platforms.map {|platform| select_best_platform_match(specs, platform) }
|
252
258
|
|
253
259
|
# If package is a top-level dependency,
|
@@ -274,8 +280,6 @@ module Bundler
|
|
274
280
|
|
275
281
|
groups
|
276
282
|
end
|
277
|
-
|
278
|
-
sort_versions(package, versions)
|
279
283
|
end
|
280
284
|
|
281
285
|
def source_for(name)
|
@@ -334,6 +338,21 @@ module Bundler
|
|
334
338
|
|
335
339
|
private
|
336
340
|
|
341
|
+
def filtered_versions_for(package)
|
342
|
+
@gem_version_promoter.filter_versions(package, @all_versions[package])
|
343
|
+
end
|
344
|
+
|
345
|
+
def raise_all_versions_filtered_out!(package)
|
346
|
+
level = @gem_version_promoter.level
|
347
|
+
name = package.name
|
348
|
+
locked_version = package.locked_version
|
349
|
+
requirement = package.dependency
|
350
|
+
|
351
|
+
raise GemNotFound,
|
352
|
+
"#{name} is locked to #{locked_version}, while Gemfile is requesting #{requirement}. " \
|
353
|
+
"--strict --#{level} was specified, but there are no #{level} level upgrades from #{locked_version} satisfying #{requirement}, so version solving has failed"
|
354
|
+
end
|
355
|
+
|
337
356
|
def filter_matching_specs(specs, requirements)
|
338
357
|
Array(requirements).flat_map do |requirement|
|
339
358
|
specs.select {| spec| requirement_satisfied_by?(requirement, spec) }
|
@@ -357,12 +376,8 @@ module Bundler
|
|
357
376
|
requirement.satisfied_by?(spec.version) || spec.source.is_a?(Source::Gemspec)
|
358
377
|
end
|
359
378
|
|
360
|
-
def
|
361
|
-
|
362
|
-
@gem_version_promoter.sort_versions(package, versions).reverse
|
363
|
-
else
|
364
|
-
versions
|
365
|
-
end
|
379
|
+
def sort_versions_by_preferred(package, versions)
|
380
|
+
@gem_version_promoter.sort_versions(package, versions)
|
366
381
|
end
|
367
382
|
|
368
383
|
def repository_for(package)
|
@@ -379,12 +394,19 @@ module Bundler
|
|
379
394
|
|
380
395
|
next [dep_package, dep_constraint] if name == "bundler"
|
381
396
|
|
382
|
-
|
397
|
+
dep_range = dep_constraint.range
|
398
|
+
versions = select_sorted_versions(dep_package, dep_range)
|
383
399
|
if versions.empty? && dep_package.ignores_prereleases?
|
400
|
+
@all_versions.delete(dep_package)
|
384
401
|
@sorted_versions.delete(dep_package)
|
385
402
|
dep_package.consider_prereleases!
|
386
|
-
versions =
|
403
|
+
versions = select_sorted_versions(dep_package, dep_range)
|
387
404
|
end
|
405
|
+
|
406
|
+
if versions.empty? && select_all_versions(dep_package, dep_range).any?
|
407
|
+
raise_all_versions_filtered_out!(dep_package)
|
408
|
+
end
|
409
|
+
|
388
410
|
next [dep_package, dep_constraint] unless versions.empty?
|
389
411
|
|
390
412
|
next unless dep_package.current_platform?
|
@@ -393,6 +415,14 @@ module Bundler
|
|
393
415
|
end.compact.to_h
|
394
416
|
end
|
395
417
|
|
418
|
+
def select_sorted_versions(package, range)
|
419
|
+
range.select_versions(@sorted_versions[package])
|
420
|
+
end
|
421
|
+
|
422
|
+
def select_all_versions(package, range)
|
423
|
+
range.select_versions(@all_versions[package])
|
424
|
+
end
|
425
|
+
|
396
426
|
def other_specs_matching_message(specs, requirement)
|
397
427
|
message = String.new("The source contains the following gems matching '#{requirement}':\n")
|
398
428
|
message << specs.map {|s| " * #{s.full_name}" }.join("\n")
|
data/lib/bundler/runtime.rb
CHANGED
@@ -95,7 +95,7 @@ module Bundler
|
|
95
95
|
|
96
96
|
def lock(opts = {})
|
97
97
|
return if @definition.no_resolve_needed?
|
98
|
-
@definition.lock(
|
98
|
+
@definition.lock(opts[:preserve_unknown_sections])
|
99
99
|
end
|
100
100
|
|
101
101
|
alias_method :gems, :specs
|
data/lib/bundler/self_manager.rb
CHANGED
@@ -113,7 +113,7 @@ module Bundler
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def local_specs
|
116
|
-
@local_specs ||= Bundler::Source::Rubygems.new("allow_local" => true).specs.select {|spec| spec.name == "bundler" }
|
116
|
+
@local_specs ||= Bundler::Source::Rubygems.new("allow_local" => true, "allow_cached" => true).specs.select {|spec| spec.name == "bundler" }
|
117
117
|
end
|
118
118
|
|
119
119
|
def remote_specs
|
data/lib/bundler/settings.rb
CHANGED
@@ -189,7 +189,7 @@ module Bundler
|
|
189
189
|
def mirror_for(uri)
|
190
190
|
if uri.is_a?(String)
|
191
191
|
require_relative "vendored_uri"
|
192
|
-
uri =
|
192
|
+
uri = Gem::URI(uri)
|
193
193
|
end
|
194
194
|
|
195
195
|
gem_mirrors.for(uri.to_s).uri
|
@@ -492,16 +492,19 @@ module Bundler
|
|
492
492
|
valid_file = file.exist? && !file.size.zero?
|
493
493
|
return {} unless valid_file
|
494
494
|
serializer_class.load(file.read).inject({}) do |config, (k, v)|
|
495
|
-
|
496
|
-
|
497
|
-
"
|
498
|
-
|
495
|
+
unless k.start_with?("#")
|
496
|
+
if k.include?("-")
|
497
|
+
Bundler.ui.warn "Your #{file} config includes `#{k}`, which contains the dash character (`-`).\n" \
|
498
|
+
"This is deprecated, because configuration through `ENV` should be possible, but `ENV` keys cannot include dashes.\n" \
|
499
|
+
"Please edit #{file} and replace any dashes in configuration keys with a triple underscore (`___`)."
|
499
500
|
|
500
|
-
|
501
|
-
|
501
|
+
# string hash keys are frozen
|
502
|
+
k = k.gsub("-", "___")
|
503
|
+
end
|
504
|
+
|
505
|
+
config[k] = v
|
502
506
|
end
|
503
507
|
|
504
|
-
config[k] = v
|
505
508
|
config
|
506
509
|
end
|
507
510
|
end
|
@@ -549,7 +552,7 @@ module Bundler
|
|
549
552
|
end
|
550
553
|
uri = URINormalizer.normalize_suffix(uri)
|
551
554
|
require_relative "vendored_uri"
|
552
|
-
uri =
|
555
|
+
uri = Gem::URI(uri)
|
553
556
|
unless uri.absolute?
|
554
557
|
raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri)
|
555
558
|
end
|
@@ -564,7 +567,7 @@ module Bundler
|
|
564
567
|
key
|
565
568
|
when Symbol
|
566
569
|
key.name
|
567
|
-
when
|
570
|
+
when Gem::URI::HTTP
|
568
571
|
key.to_s
|
569
572
|
else
|
570
573
|
raise ArgumentError, "Invalid key: #{key.inspect}"
|
@@ -577,7 +580,7 @@ module Bundler
|
|
577
580
|
key
|
578
581
|
when Symbol
|
579
582
|
key.to_s
|
580
|
-
when
|
583
|
+
when Gem::URI::HTTP
|
581
584
|
key.to_s
|
582
585
|
else
|
583
586
|
raise ArgumentError, "Invalid key: #{key.inspect}"
|