bundler 2.5.5 → 2.5.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -0
  3. data/lib/bundler/build_metadata.rb +2 -2
  4. data/lib/bundler/cli/binstubs.rb +1 -1
  5. data/lib/bundler/cli/gem.rb +1 -1
  6. data/lib/bundler/cli/lock.rb +5 -4
  7. data/lib/bundler/cli/plugin.rb +3 -2
  8. data/lib/bundler/cli.rb +2 -2
  9. data/lib/bundler/definition.rb +54 -28
  10. data/lib/bundler/dsl.rb +16 -1
  11. data/lib/bundler/environment_preserver.rb +3 -3
  12. data/lib/bundler/fetcher/downloader.rb +1 -1
  13. data/lib/bundler/fetcher.rb +2 -2
  14. data/lib/bundler/gem_version_promoter.rb +42 -38
  15. data/lib/bundler/injector.rb +1 -1
  16. data/lib/bundler/installer.rb +2 -2
  17. data/lib/bundler/man/bundle-add.1 +1 -1
  18. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  19. data/lib/bundler/man/bundle-cache.1 +1 -1
  20. data/lib/bundler/man/bundle-check.1 +1 -1
  21. data/lib/bundler/man/bundle-clean.1 +1 -1
  22. data/lib/bundler/man/bundle-config.1 +1 -1
  23. data/lib/bundler/man/bundle-console.1 +1 -1
  24. data/lib/bundler/man/bundle-doctor.1 +1 -1
  25. data/lib/bundler/man/bundle-exec.1 +1 -1
  26. data/lib/bundler/man/bundle-gem.1 +1 -1
  27. data/lib/bundler/man/bundle-help.1 +1 -1
  28. data/lib/bundler/man/bundle-info.1 +1 -1
  29. data/lib/bundler/man/bundle-init.1 +1 -1
  30. data/lib/bundler/man/bundle-inject.1 +1 -1
  31. data/lib/bundler/man/bundle-install.1 +3 -3
  32. data/lib/bundler/man/bundle-install.1.ronn +2 -2
  33. data/lib/bundler/man/bundle-list.1 +1 -1
  34. data/lib/bundler/man/bundle-lock.1 +1 -1
  35. data/lib/bundler/man/bundle-open.1 +1 -1
  36. data/lib/bundler/man/bundle-outdated.1 +1 -1
  37. data/lib/bundler/man/bundle-platform.1 +1 -1
  38. data/lib/bundler/man/bundle-plugin.1 +7 -4
  39. data/lib/bundler/man/bundle-plugin.1.ronn +7 -3
  40. data/lib/bundler/man/bundle-pristine.1 +1 -1
  41. data/lib/bundler/man/bundle-remove.1 +1 -1
  42. data/lib/bundler/man/bundle-show.1 +1 -1
  43. data/lib/bundler/man/bundle-update.1 +1 -1
  44. data/lib/bundler/man/bundle-version.1 +1 -1
  45. data/lib/bundler/man/bundle-viz.1 +1 -1
  46. data/lib/bundler/man/bundle.1 +1 -1
  47. data/lib/bundler/man/gemfile.5 +3 -3
  48. data/lib/bundler/man/gemfile.5.ronn +2 -2
  49. data/lib/bundler/mirror.rb +3 -3
  50. data/lib/bundler/plugin/api/source.rb +2 -2
  51. data/lib/bundler/plugin/installer/path.rb +18 -0
  52. data/lib/bundler/plugin/installer.rb +36 -16
  53. data/lib/bundler/plugin/source_list.rb +4 -4
  54. data/lib/bundler/resolver/candidate.rb +1 -1
  55. data/lib/bundler/resolver.rb +54 -24
  56. data/lib/bundler/runtime.rb +1 -1
  57. data/lib/bundler/self_manager.rb +1 -1
  58. data/lib/bundler/settings.rb +14 -11
  59. data/lib/bundler/source/git/git_proxy.rb +1 -1
  60. data/lib/bundler/source/git.rb +1 -1
  61. data/lib/bundler/source/rubygems/remote.rb +1 -1
  62. data/lib/bundler/source/rubygems.rb +4 -4
  63. data/lib/bundler/source_list.rb +2 -2
  64. data/lib/bundler/spec_set.rb +1 -1
  65. data/lib/bundler/templates/newgem/newgem.gemspec.tt +4 -3
  66. data/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
  67. data/lib/bundler/uri_credentials_filter.rb +2 -2
  68. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +22 -22
  69. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +1 -0
  70. data/lib/bundler/vendored_net_http.rb +7 -3
  71. data/lib/bundler/vendored_timeout.rb +7 -3
  72. data/lib/bundler/vendored_uri.rb +18 -1
  73. data/lib/bundler/version.rb +1 -1
  74. data/lib/bundler/yaml_serializer.rb +12 -0
  75. data/lib/bundler.rb +3 -2
  76. 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](http://guides.rubygems.org/rubygems-basics/#installing-gems)
383
- * [Rubygems signing docs](http://guides.rubygems.org/security/)
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\-LIST" "1" "December 2023" ""
3
+ .TH "BUNDLE\-LIST" "1" "March 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-list\fR \- List all the gems in the 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\-LOCK" "1" "December 2023" ""
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" "December 2023" ""
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" "December 2023" ""
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" "December 2023" ""
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" "December 2023" ""
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|\-\-local_git=\fIgit\-url\fR] [\-\-branch=\fIbranch\fR|\-\-ref=\fIrev\fR]
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\. \fB\-\-git\fR can be replaced with \fB\-\-local\-git\fR\. You cannot use both \fB\-\-git\fR and \fB\-\-local\-git\fR\. You can use standard Git URLs like:
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/\fB\-\-local\-git\fR, you can use \fB\-\-branch\fR or \fB\-\-ref\fR to specify any branch, tag, or commit hash (revision) to use\. When you specify both, only the latter is used\.
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|--local_git=<git-url>] [--branch=<branch>|--ref=<rev>]<br>
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. `--git` can be replaced with `--local-git`. You cannot use both `--git` and `--local-git`. You can use standard Git URLs like:
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`/`--local-git`, you can use `--branch` or `--ref` to specify any branch, tag, or commit hash (revision) to use. When you specify both, only the latter is used.
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" "December 2023" ""
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\-REMOVE" "1" "December 2023" ""
3
+ .TH "BUNDLE\-REMOVE" "1" "March 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-remove\fR \- Removes gems from the Gemfile
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" "December 2023" ""
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" "December 2023" ""
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\-VERSION" "1" "December 2023" ""
3
+ .TH "BUNDLE\-VERSION" "1" "March 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\-version\fR \- Prints Bundler version information
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" "December 2023" ""
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"
@@ -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" "1" "December 2023" ""
3
+ .TH "BUNDLE" "1" "March 2024" ""
4
4
  .SH "NAME"
5
5
  \fBbundle\fR \- Ruby Dependency Management
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 "GEMFILE" "5" "December 2023" ""
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 \fIhttp://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\.
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 \fIhttp://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\.
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](http://jruby.org/) and [TruffleRuby](https://www.graalvm.org/ruby/).
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`](http://guides.rubygems.org/specification-reference/) file is where
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.
@@ -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[Bundler::URI(downcased).host] || Mirror.new(uri)
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
- Bundler::URI(uri.to_s)
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 = Bundler::URI(uri).absolute? ? Settings.normalize_uri(uri) : 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(Bundler::URI.parse(uri).normalize.path)
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(Bundler::URI.parse(uri).normalize.path)
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[:local_git]
22
- install_local_git(names, version, options)
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
- uri = options.delete(:git)
52
- options["uri"] = uri
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, options, options[:source])
75
+ install_all_sources(names, version, source_list, source)
55
76
  end
56
77
 
57
- def install_local_git(names, version, options)
58
- uri = options.delete(:local_git)
59
- options["uri"] = uri
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, options, options[:source])
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.add_git_source(git_source_options) if git_source_options
80
- Array(rubygems_source).each {|remote| source_list.add_global_rubygems_remote(remote) } if rubygems_source
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
- deps = names.map {|name| Dependency.new name, version }
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 the refer to. These candidates are referred to as "canonical" and
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
  #
@@ -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] = if package.root?
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] = if package.root?
65
- { root_version => root_dependencies }
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 = range.select_versions(@sorted_versions[package])
159
+ versions = select_sorted_versions(package, range)
160
160
 
161
- sort_versions(package, versions)
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
- versions = results.group_by(&:version).reduce([]) do |groups, (version, specs)|
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 sort_versions(package, versions)
361
- if versions.size > 1
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
- versions = versions_for(dep_package, dep_constraint.range)
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 = versions_for(dep_package, dep_constraint.range)
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")
@@ -95,7 +95,7 @@ module Bundler
95
95
 
96
96
  def lock(opts = {})
97
97
  return if @definition.no_resolve_needed?
98
- @definition.lock(Bundler.default_lockfile, opts[:preserve_unknown_sections])
98
+ @definition.lock(opts[:preserve_unknown_sections])
99
99
  end
100
100
 
101
101
  alias_method :gems, :specs
@@ -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
@@ -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 = Bundler::URI(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
- if k.include?("-")
496
- Bundler.ui.warn "Your #{file} config includes `#{k}`, which contains the dash character (`-`).\n" \
497
- "This is deprecated, because configuration through `ENV` should be possible, but `ENV` keys cannot include dashes.\n" \
498
- "Please edit #{file} and replace any dashes in configuration keys with a triple underscore (`___`)."
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
- # string hash keys are frozen
501
- k = k.gsub("-", "___")
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 = Bundler::URI(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 Bundler::URI::HTTP
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 Bundler::URI::HTTP
583
+ when Gem::URI::HTTP
581
584
  key.to_s
582
585
  else
583
586
  raise ArgumentError, "Invalid key: #{key.inspect}"