bundler 2.4.20 → 2.4.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -3
  3. data/lib/bundler/build_metadata.rb +3 -3
  4. data/lib/bundler/cli/check.rb +1 -1
  5. data/lib/bundler/cli/gem.rb +1 -3
  6. data/lib/bundler/cli/install.rb +2 -2
  7. data/lib/bundler/cli/lock.rb +26 -23
  8. data/lib/bundler/cli/open.rb +5 -7
  9. data/lib/bundler/definition.rb +42 -25
  10. data/lib/bundler/env.rb +2 -2
  11. data/lib/bundler/gem_version_promoter.rb +2 -2
  12. data/lib/bundler/injector.rb +1 -1
  13. data/lib/bundler/installer/parallel_installer.rb +0 -26
  14. data/lib/bundler/installer/standalone.rb +13 -6
  15. data/lib/bundler/lockfile_parser.rb +29 -24
  16. data/lib/bundler/man/bundle-add.1 +1 -1
  17. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  18. data/lib/bundler/man/bundle-cache.1 +1 -1
  19. data/lib/bundler/man/bundle-check.1 +1 -1
  20. data/lib/bundler/man/bundle-clean.1 +1 -1
  21. data/lib/bundler/man/bundle-config.1 +1 -1
  22. data/lib/bundler/man/bundle-console.1 +1 -1
  23. data/lib/bundler/man/bundle-doctor.1 +1 -1
  24. data/lib/bundler/man/bundle-exec.1 +2 -2
  25. data/lib/bundler/man/bundle-exec.1.ronn +2 -3
  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 +1 -1
  32. data/lib/bundler/man/bundle-list.1 +1 -1
  33. data/lib/bundler/man/bundle-lock.1 +1 -1
  34. data/lib/bundler/man/bundle-open.1 +1 -1
  35. data/lib/bundler/man/bundle-outdated.1 +1 -1
  36. data/lib/bundler/man/bundle-platform.1 +1 -1
  37. data/lib/bundler/man/bundle-plugin.1 +17 -17
  38. data/lib/bundler/man/bundle-plugin.1.ronn +5 -5
  39. data/lib/bundler/man/bundle-pristine.1 +1 -1
  40. data/lib/bundler/man/bundle-remove.1 +1 -1
  41. data/lib/bundler/man/bundle-show.1 +1 -1
  42. data/lib/bundler/man/bundle-update.1 +1 -1
  43. data/lib/bundler/man/bundle-version.1 +1 -1
  44. data/lib/bundler/man/bundle-viz.1 +1 -1
  45. data/lib/bundler/man/bundle.1 +1 -1
  46. data/lib/bundler/man/gemfile.5 +1 -1
  47. data/lib/bundler/resolver/package.rb +5 -0
  48. data/lib/bundler/resolver.rb +27 -7
  49. data/lib/bundler/ruby_version.rb +8 -1
  50. data/lib/bundler/settings.rb +53 -16
  51. data/lib/bundler/shared_helpers.rb +16 -1
  52. data/lib/bundler/source/git/git_proxy.rb +13 -4
  53. data/lib/bundler/spec_set.rb +2 -2
  54. data/lib/bundler/stub_specification.rb +4 -2
  55. data/lib/bundler/templates/newgem/Rakefile.tt +6 -2
  56. data/lib/bundler/version.rb +1 -1
  57. data/lib/bundler/yaml_serializer.rb +6 -7
  58. metadata +3 -3
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-CLEAN" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-CLEAN" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-CONFIG" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-CONFIG" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-config\fR \- Set bundler configuration options
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-CONSOLE" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-CONSOLE" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-console\fR \- Deprecated way to open an IRB session with the bundle pre\-loaded
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-DOCTOR" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-DOCTOR" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-doctor\fR \- Checks the bundle for common problems
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-EXEC" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-EXEC" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-exec\fR \- Execute a command in the context of the bundle
@@ -22,7 +22,7 @@ Note that \fBbundle exec\fR does not require that an executable is available on
22
22
  .
23
23
  .TP
24
24
  \fB\-\-keep\-file\-descriptors\fR
25
- Exec in Ruby 2\.0 began discarding non\-standard file descriptors\. When this flag is passed, exec will revert to the 1\.9 behaviour of passing all file descriptors to the new process\.
25
+ Passes all file descriptors to the new processes\. Default is true from bundler version 2\.2\.26\. Setting it to false is now deprecated\.
26
26
  .
27
27
  .SH "BUNDLE INSTALL \-\-BINSTUBS"
28
28
  If you use the \fB\-\-binstubs\fR flag in bundle install(1) \fIbundle\-install\.1\.html\fR, Bundler will automatically create a directory (which defaults to \fBapp_root/bin\fR) containing all of the executables available from gems in the bundle\.
@@ -21,9 +21,8 @@ available on your shell's `$PATH`.
21
21
  ## OPTIONS
22
22
 
23
23
  * `--keep-file-descriptors`:
24
- Exec in Ruby 2.0 began discarding non-standard file descriptors. When this
25
- flag is passed, exec will revert to the 1.9 behaviour of passing all file
26
- descriptors to the new process.
24
+ Passes all file descriptors to the new processes. Default is true from
25
+ bundler version 2.2.26. Setting it to false is now deprecated.
27
26
 
28
27
  ## BUNDLE INSTALL --BINSTUBS
29
28
 
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-GEM" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-GEM" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-HELP" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-HELP" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-help\fR \- Displays detailed help for each subcommand
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-INFO" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-INFO" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-info\fR \- Show information for the given gem in your bundle
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-INIT" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-INIT" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-init\fR \- Generates a Gemfile into the current working directory
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-INJECT" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-INJECT" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-INSTALL" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-INSTALL" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-LIST" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-LIST" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-list\fR \- List all the gems in the bundle
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-LOCK" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-LOCK" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-OPEN" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-OPEN" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-OUTDATED" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-OUTDATED" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-outdated\fR \- List installed gems with newer versions available
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-PLATFORM" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-PLATFORM" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-platform\fR \- Displays platform compatibility information
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-PLUGIN" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-PLUGIN" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-plugin\fR \- Manage Bundler plugins
@@ -26,37 +26,37 @@ You can install, uninstall, and list plugin(s) with this command to extend funct
26
26
  .SS "install"
27
27
  Install the given plugin(s)\.
28
28
  .
29
- .IP "\(bu" 4
30
- \fBbundle plugin install bundler\-graph\fR: Install bundler\-graph gem from RubyGems\.org\. The global source, specified in source in Gemfile is ignored\.
29
+ .TP
30
+ \fBbundle plugin install bundler\-graph\fR
31
+ Install bundler\-graph gem from globally configured sources (defaults to RubyGems\.org)\. The global source, specified in source in Gemfile is ignored\.
31
32
  .
32
- .IP "\(bu" 4
33
- \fBbundle plugin install bundler\-graph \-\-source https://example\.com\fR: Install bundler\-graph gem from example\.com\. The global source, specified in source in Gemfile is not considered\.
33
+ .TP
34
+ \fBbundle plugin install bundler\-graph \-\-source https://example\.com\fR
35
+ Install bundler\-graph gem from example\.com\. The global source, specified in source in Gemfile is not considered\.
34
36
  .
35
- .IP "\(bu" 4
36
- \fBbundle plugin install bundler\-graph \-\-version 0\.2\.1\fR: You can specify the version of the gem via \fB\-\-version\fR\.
37
+ .TP
38
+ \fBbundle plugin install bundler\-graph \-\-version 0\.2\.1\fR
39
+ You can specify the version of the gem via \fB\-\-version\fR\.
37
40
  .
38
- .IP "\(bu" 4
39
- \fBbundle plugin install bundler\-graph \-\-git https://github\.com/rubygems/bundler\-graph\fR: 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:
41
+ .TP
42
+ \fBbundle plugin install bundler\-graph \-\-git https://github\.com/rubygems/bundler\-graph\fR
43
+ 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:
40
44
  .
41
- .IP "\(bu" 4
45
+ .IP
42
46
  \fBssh://[user@]host\.xz[:port]/path/to/repo\.git\fR
43
47
  .
44
- .IP "\(bu" 4
48
+ .br
45
49
  \fBhttp[s]://host\.xz[:port]/path/to/repo\.git\fR
46
50
  .
47
- .IP "\(bu" 4
51
+ .br
48
52
  \fB/path/to/repo\fR
49
53
  .
50
- .IP "\(bu" 4
54
+ .br
51
55
  \fBfile:///path/to/repo\fR
52
56
  .
53
- .IP "" 0
54
- .
55
57
  .IP
56
58
  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\.
57
59
  .
58
- .IP "" 0
59
- .
60
60
  .SS "uninstall"
61
61
  Uninstall the plugin(s) specified in PLUGINS\.
62
62
  .
@@ -20,7 +20,7 @@ You can install, uninstall, and list plugin(s) with this command to extend funct
20
20
  Install the given plugin(s).
21
21
 
22
22
  * `bundle plugin install bundler-graph`:
23
- Install bundler-graph gem from RubyGems.org. The global source, specified in source in Gemfile is ignored.
23
+ Install bundler-graph gem from globally configured sources (defaults to RubyGems.org). The global source, specified in source in Gemfile is ignored.
24
24
 
25
25
  * `bundle plugin install bundler-graph --source https://example.com`:
26
26
  Install bundler-graph gem from example.com. The global source, specified in source in Gemfile is not considered.
@@ -31,10 +31,10 @@ Install the given plugin(s).
31
31
  * `bundle plugin install bundler-graph --git https://github.com/rubygems/bundler-graph`:
32
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
33
 
34
- * `ssh://[user@]host.xz[:port]/path/to/repo.git`
35
- * `http[s]://host.xz[:port]/path/to/repo.git`
36
- * `/path/to/repo`
37
- * `file:///path/to/repo`
34
+ `ssh://[user@]host.xz[:port]/path/to/repo.git`<br>
35
+ `http[s]://host.xz[:port]/path/to/repo.git`<br>
36
+ `/path/to/repo`<br>
37
+ `file:///path/to/repo`
38
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
40
 
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-PRISTINE" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-PRISTINE" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-REMOVE" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-REMOVE" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-remove\fR \- Removes gems from the Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-SHOW" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-SHOW" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-UPDATE" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-UPDATE" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-update\fR \- Update your gems to the latest available versions
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-VERSION" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-VERSION" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-version\fR \- Prints Bundler version information
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE\-VIZ" "1" "August 2023" "" ""
4
+ .TH "BUNDLE\-VIZ" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "BUNDLE" "1" "August 2023" "" ""
4
+ .TH "BUNDLE" "1" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBbundle\fR \- Ruby Dependency Management
@@ -1,7 +1,7 @@
1
1
  .\" generated with Ronn/v0.7.3
2
2
  .\" http://github.com/rtomayko/ronn/tree/0.7.3
3
3
  .
4
- .TH "GEMFILE" "5" "August 2023" "" ""
4
+ .TH "GEMFILE" "5" "October 2023" "" ""
5
5
  .
6
6
  .SH "NAME"
7
7
  \fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
@@ -21,6 +21,7 @@ module Bundler
21
21
  @locked_version = locked_specs[name].first&.version
22
22
  @unlock = unlock
23
23
  @dependency = dependency || Dependency.new(name, @locked_version)
24
+ @top_level = !dependency.nil?
24
25
  @prerelease = @dependency.prerelease? || @locked_version&.prerelease? || prerelease ? :consider_first : :ignore
25
26
  end
26
27
 
@@ -32,6 +33,10 @@ module Bundler
32
33
  false
33
34
  end
34
35
 
36
+ def top_level?
37
+ @top_level
38
+ end
39
+
35
40
  def meta?
36
41
  @name.end_with?("\0")
37
42
  end
@@ -131,7 +131,7 @@ module Bundler
131
131
 
132
132
  if base_requirements[name]
133
133
  names_to_unlock << name
134
- elsif package.ignores_prereleases?
134
+ elsif package.ignores_prereleases? && @all_specs[name].any? {|s| s.version.prerelease? }
135
135
  names_to_allow_prereleases_for << name
136
136
  end
137
137
 
@@ -248,8 +248,22 @@ module Bundler
248
248
  results = filter_matching_specs(results, locked_requirement) if locked_requirement
249
249
 
250
250
  versions = results.group_by(&:version).reduce([]) do |groups, (version, specs)|
251
- platform_specs = package.platforms.flat_map {|platform| select_best_platform_match(specs, platform) }
252
- next groups if platform_specs.empty?
251
+ platform_specs = package.platforms.map {|platform| select_best_platform_match(specs, platform) }
252
+
253
+ # If package is a top-level dependency,
254
+ # candidate is only valid if there are matching versions for all resolution platforms.
255
+ #
256
+ # If package is not a top-level deependency,
257
+ # then it's not necessary that it has matching versions for all platforms, since it may have been introduced only as
258
+ # a dependency for a platform specific variant, so it will only need to have a valid version for that platform.
259
+ #
260
+ if package.top_level?
261
+ next groups if platform_specs.any?(&:empty?)
262
+ else
263
+ next groups if platform_specs.all?(&:empty?)
264
+ end
265
+
266
+ platform_specs.flatten!
253
267
 
254
268
  ruby_specs = select_best_platform_match(specs, Gem::Platform::RUBY)
255
269
  groups << Resolver::Candidate.new(version, :specs => ruby_specs) if ruby_specs.any?
@@ -295,15 +309,21 @@ module Bundler
295
309
  end
296
310
  specs_matching_requirement = filter_matching_specs(specs, package.dependency.requirement)
297
311
 
298
- if specs_matching_requirement.any?
312
+ not_found_message = if specs_matching_requirement.any?
299
313
  specs = specs_matching_requirement
300
314
  matching_part = requirement_label
301
315
  platforms = package.platforms
302
- platform_label = platforms.size == 1 ? "platform '#{platforms.first}" : "platforms '#{platforms.join("', '")}"
303
- requirement_label = "#{requirement_label}' with #{platform_label}"
316
+
317
+ if platforms.size == 1
318
+ "Could not find gem '#{requirement_label}' with platform '#{platforms.first}'"
319
+ else
320
+ "Could not find gems matching '#{requirement_label}' valid for all resolution platforms (#{platforms.join(", ")})"
321
+ end
322
+ else
323
+ "Could not find gem '#{requirement_label}'"
304
324
  end
305
325
 
306
- message = String.new("Could not find gem '#{requirement_label}' in #{source}#{cache_message}.\n")
326
+ message = String.new("#{not_found_message} in #{source}#{cache_message}.\n")
307
327
 
308
328
  if specs.any?
309
329
  message << "\n#{other_specs_matching_message(specs, matching_part)}"
@@ -23,7 +23,7 @@ module Bundler
23
23
  # specified must match the version.
24
24
 
25
25
  @versions = Array(versions).map do |v|
26
- op, v = Gem::Requirement.parse(v)
26
+ op, v = Gem::Requirement.parse(normalize_version(v))
27
27
  op == "=" ? v.to_s : "#{op} #{v}"
28
28
  end
29
29
 
@@ -112,6 +112,13 @@ module Bundler
112
112
 
113
113
  private
114
114
 
115
+ # Ruby's official preview version format uses a `-`: Example: 3.3.0-preview2
116
+ # However, RubyGems recognizes preview version format with a `.`: Example: 3.3.0.preview2
117
+ # Returns version string after replacing `-` with `.`
118
+ def normalize_version(version)
119
+ version.tr("-", ".")
120
+ end
121
+
115
122
  def matches?(requirements, version)
116
123
  # Handles RUBY_PATCHLEVEL of -1 for instances like ruby-head
117
124
  return requirements == version if requirements.to_s == "-1" || version.to_s == "-1"
@@ -95,6 +95,8 @@ module Bundler
95
95
 
96
96
  @global_config = load_config(global_config_file)
97
97
  @temporary = {}
98
+
99
+ @key_cache = {}
98
100
  end
99
101
 
100
102
  def [](name)
@@ -310,7 +312,7 @@ module Bundler
310
312
  end
311
313
 
312
314
  def key_for(key)
313
- self.class.key_for(key)
315
+ @key_cache[key] ||= self.class.key_for(key)
314
316
  end
315
317
 
316
318
  private
@@ -342,12 +344,12 @@ module Bundler
342
344
  end
343
345
 
344
346
  def is_bool(name)
345
- name = name.to_s
347
+ name = self.class.key_to_s(name)
346
348
  BOOL_KEYS.include?(name) || BOOL_KEYS.include?(parent_setting_for(name))
347
349
  end
348
350
 
349
351
  def is_string(name)
350
- name = name.to_s
352
+ name = self.class.key_to_s(name)
351
353
  STRING_KEYS.include?(name) || name.start_with?("local.") || name.start_with?("mirror.") || name.start_with?("build.")
352
354
  end
353
355
 
@@ -363,11 +365,11 @@ module Bundler
363
365
  end
364
366
 
365
367
  def is_num(key)
366
- NUMBER_KEYS.include?(key.to_s)
368
+ NUMBER_KEYS.include?(self.class.key_to_s(key))
367
369
  end
368
370
 
369
371
  def is_array(key)
370
- ARRAY_KEYS.include?(key.to_s)
372
+ ARRAY_KEYS.include?(self.class.key_to_s(key))
371
373
  end
372
374
 
373
375
  def is_credential(key)
@@ -390,7 +392,7 @@ module Bundler
390
392
  end
391
393
 
392
394
  def set_key(raw_key, value, hash, file)
393
- raw_key = raw_key.to_s
395
+ raw_key = self.class.key_to_s(raw_key)
394
396
  value = array_to_s(value) if is_array(raw_key)
395
397
 
396
398
  key = key_for(raw_key)
@@ -405,13 +407,12 @@ module Bundler
405
407
  return unless file
406
408
  SharedHelpers.filesystem_access(file) do |p|
407
409
  FileUtils.mkdir_p(p.dirname)
408
- require_relative "yaml_serializer"
409
- p.open("w") {|f| f.write(YAMLSerializer.dump(hash)) }
410
+ p.open("w") {|f| f.write(serializer_class.dump(hash)) }
410
411
  end
411
412
  end
412
413
 
413
414
  def converted_value(value, key)
414
- key = key.to_s
415
+ key = self.class.key_to_s(key)
415
416
 
416
417
  if is_array(key)
417
418
  to_array(value)
@@ -470,24 +471,31 @@ module Bundler
470
471
  SharedHelpers.filesystem_access(config_file, :read) do |file|
471
472
  valid_file = file.exist? && !file.size.zero?
472
473
  return {} unless valid_file
473
- require_relative "yaml_serializer"
474
- YAMLSerializer.load(file.read).inject({}) do |config, (k, v)|
475
- new_k = k
476
-
474
+ serializer_class.load(file.read).inject({}) do |config, (k, v)|
477
475
  if k.include?("-")
478
476
  Bundler.ui.warn "Your #{file} config includes `#{k}`, which contains the dash character (`-`).\n" \
479
477
  "This is deprecated, because configuration through `ENV` should be possible, but `ENV` keys cannot include dashes.\n" \
480
478
  "Please edit #{file} and replace any dashes in configuration keys with a triple underscore (`___`)."
481
479
 
482
- new_k = k.gsub("-", "___")
480
+ # string hash keys are frozen
481
+ k = k.gsub("-", "___")
483
482
  end
484
483
 
485
- config[new_k] = v
484
+ config[k] = v
486
485
  config
487
486
  end
488
487
  end
489
488
  end
490
489
 
490
+ def serializer_class
491
+ require "rubygems/yaml_serializer"
492
+ Gem::YAMLSerializer
493
+ rescue LoadError
494
+ # TODO: Remove this when RubyGems 3.4 is EOL
495
+ require_relative "yaml_serializer"
496
+ YAMLSerializer
497
+ end
498
+
491
499
  PER_URI_OPTIONS = %w[
492
500
  fallback_timeout
493
501
  ].freeze
@@ -503,7 +511,7 @@ module Bundler
503
511
 
504
512
  def self.key_for(key)
505
513
  key = normalize_uri(key).to_s if key.is_a?(String) && key.start_with?("http", "mirror.http")
506
- key = key.to_s.gsub(".", "__")
514
+ key = key_to_s(key).gsub(".", "__")
507
515
  key.gsub!("-", "___")
508
516
  key.upcase!
509
517
 
@@ -527,5 +535,34 @@ module Bundler
527
535
  end
528
536
  "#{prefix}#{uri}#{suffix}"
529
537
  end
538
+
539
+ # This is a hot method, so avoid respond_to? checks on every invocation
540
+ if :read.respond_to?(:name)
541
+ def self.key_to_s(key)
542
+ case key
543
+ when String
544
+ key
545
+ when Symbol
546
+ key.name
547
+ when Bundler::URI::HTTP
548
+ key.to_s
549
+ else
550
+ raise ArgumentError, "Invalid key: #{key.inspect}"
551
+ end
552
+ end
553
+ else
554
+ def self.key_to_s(key)
555
+ case key
556
+ when String
557
+ key
558
+ when Symbol
559
+ key.to_s
560
+ when Bundler::URI::HTTP
561
+ key.to_s
562
+ else
563
+ raise ArgumentError, "Invalid key: #{key.inspect}"
564
+ end
565
+ end
566
+ end
530
567
  end
531
568
  end
@@ -197,6 +197,21 @@ module Bundler
197
197
  filesystem_access(gemfile_path) {|g| File.open(g, "w") {|file| file.puts contents } }
198
198
  end
199
199
 
200
+ def relative_gemfile_path
201
+ relative_path_to(Bundler.default_gemfile)
202
+ end
203
+
204
+ def relative_lockfile_path
205
+ relative_path_to(Bundler.default_lockfile)
206
+ end
207
+
208
+ def relative_path_to(destination, from: pwd)
209
+ Pathname.new(destination).relative_path_from(from).to_s
210
+ rescue ArgumentError
211
+ # on Windows, if source and destination are on different drivers, there's no relative path from one to the other
212
+ destination
213
+ end
214
+
200
215
  private
201
216
 
202
217
  def validate_bundle_path
@@ -297,7 +312,7 @@ module Bundler
297
312
  def set_rubyopt
298
313
  rubyopt = [ENV["RUBYOPT"]].compact
299
314
  setup_require = "-r#{File.expand_path("setup", __dir__)}"
300
- return if !rubyopt.empty? && rubyopt.first =~ /#{setup_require}/
315
+ return if !rubyopt.empty? && rubyopt.first =~ /#{Regexp.escape(setup_require)}/
301
316
  rubyopt.unshift setup_require
302
317
  Bundler::SharedHelpers.set_env "RUBYOPT", rubyopt.join(" ")
303
318
  end