bundler 2.4.19 → 2.4.22

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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +83 -2
  3. data/README.md +1 -2
  4. data/lib/bundler/build_metadata.rb +3 -3
  5. data/lib/bundler/cli/check.rb +1 -1
  6. data/lib/bundler/cli/gem.rb +4 -3
  7. data/lib/bundler/cli/info.rb +1 -1
  8. data/lib/bundler/cli/install.rb +2 -2
  9. data/lib/bundler/cli/lock.rb +26 -23
  10. data/lib/bundler/cli/open.rb +5 -7
  11. data/lib/bundler/cli/update.rb +1 -0
  12. data/lib/bundler/definition.rb +43 -26
  13. data/lib/bundler/endpoint_specification.rb +1 -1
  14. data/lib/bundler/env.rb +2 -2
  15. data/lib/bundler/errors.rb +15 -0
  16. data/lib/bundler/fetcher/base.rb +2 -2
  17. data/lib/bundler/fetcher/compact_index.rb +1 -5
  18. data/lib/bundler/fetcher/dependency.rb +1 -1
  19. data/lib/bundler/fetcher.rb +31 -30
  20. data/lib/bundler/gem_helpers.rb +7 -0
  21. data/lib/bundler/gem_version_promoter.rb +2 -2
  22. data/lib/bundler/index.rb +62 -31
  23. data/lib/bundler/injector.rb +1 -1
  24. data/lib/bundler/installer/gem_installer.rb +5 -5
  25. data/lib/bundler/installer/parallel_installer.rb +0 -26
  26. data/lib/bundler/installer/standalone.rb +15 -1
  27. data/lib/bundler/lazy_specification.rb +4 -0
  28. data/lib/bundler/lockfile_parser.rb +32 -39
  29. data/lib/bundler/man/bundle-add.1 +1 -1
  30. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  31. data/lib/bundler/man/bundle-cache.1 +1 -1
  32. data/lib/bundler/man/bundle-check.1 +1 -1
  33. data/lib/bundler/man/bundle-clean.1 +1 -1
  34. data/lib/bundler/man/bundle-config.1 +1 -1
  35. data/lib/bundler/man/bundle-console.1 +1 -1
  36. data/lib/bundler/man/bundle-doctor.1 +1 -1
  37. data/lib/bundler/man/bundle-exec.1 +2 -2
  38. data/lib/bundler/man/bundle-exec.1.ronn +2 -3
  39. data/lib/bundler/man/bundle-gem.1 +1 -1
  40. data/lib/bundler/man/bundle-help.1 +1 -1
  41. data/lib/bundler/man/bundle-info.1 +1 -1
  42. data/lib/bundler/man/bundle-init.1 +1 -1
  43. data/lib/bundler/man/bundle-inject.1 +1 -1
  44. data/lib/bundler/man/bundle-install.1 +1 -1
  45. data/lib/bundler/man/bundle-list.1 +1 -1
  46. data/lib/bundler/man/bundle-lock.1 +1 -1
  47. data/lib/bundler/man/bundle-open.1 +1 -1
  48. data/lib/bundler/man/bundle-outdated.1 +1 -1
  49. data/lib/bundler/man/bundle-platform.1 +1 -1
  50. data/lib/bundler/man/bundle-plugin.1 +17 -17
  51. data/lib/bundler/man/bundle-plugin.1.ronn +5 -5
  52. data/lib/bundler/man/bundle-pristine.1 +1 -1
  53. data/lib/bundler/man/bundle-remove.1 +1 -1
  54. data/lib/bundler/man/bundle-show.1 +1 -1
  55. data/lib/bundler/man/bundle-update.1 +1 -1
  56. data/lib/bundler/man/bundle-version.1 +1 -1
  57. data/lib/bundler/man/bundle-viz.1 +1 -1
  58. data/lib/bundler/man/bundle.1 +1 -1
  59. data/lib/bundler/man/gemfile.5 +12 -1
  60. data/lib/bundler/man/gemfile.5.ronn +5 -0
  61. data/lib/bundler/plugin/index.rb +8 -0
  62. data/lib/bundler/plugin.rb +10 -3
  63. data/lib/bundler/resolver/package.rb +5 -0
  64. data/lib/bundler/resolver.rb +45 -10
  65. data/lib/bundler/retry.rb +1 -1
  66. data/lib/bundler/ruby_dsl.rb +23 -2
  67. data/lib/bundler/ruby_version.rb +8 -1
  68. data/lib/bundler/rubygems_ext.rb +3 -4
  69. data/lib/bundler/rubygems_gem_installer.rb +23 -8
  70. data/lib/bundler/self_manager.rb +2 -0
  71. data/lib/bundler/settings.rb +86 -25
  72. data/lib/bundler/shared_helpers.rb +16 -1
  73. data/lib/bundler/source/git/git_proxy.rb +35 -6
  74. data/lib/bundler/source/metadata.rb +1 -1
  75. data/lib/bundler/source/rubygems.rb +22 -25
  76. data/lib/bundler/spec_set.rb +7 -4
  77. data/lib/bundler/stub_specification.rb +4 -2
  78. data/lib/bundler/templates/newgem/Rakefile.tt +6 -2
  79. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +1 -1
  80. data/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  81. data/lib/bundler/ui/shell.rb +1 -1
  82. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +1 -0
  83. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +21 -9
  84. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  85. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  86. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
  87. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
  88. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +8 -10
  89. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +15 -4
  90. data/lib/bundler/vendor/thor/lib/thor/actions.rb +15 -15
  91. data/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
  92. data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
  93. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +4 -0
  94. data/lib/bundler/vendor/thor/lib/thor/error.rb +16 -25
  95. data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
  96. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
  97. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
  98. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
  99. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
  100. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
  101. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +44 -6
  102. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
  103. data/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
  104. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +26 -150
  105. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +4 -46
  106. data/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
  107. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +3 -45
  108. data/lib/bundler/vendor/thor/lib/thor/shell/lcs_diff.rb +49 -0
  109. data/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
  110. data/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
  111. data/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
  112. data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  113. data/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  114. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  115. data/lib/bundler/vendor/thor/lib/thor.rb +155 -8
  116. data/lib/bundler/version.rb +1 -1
  117. data/lib/bundler/yaml_serializer.rb +12 -8
  118. data/lib/bundler.rb +0 -8
  119. metadata +8 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a9e1ac32a1ea746c717048bdfc433edc9d61cd2184f6d07b24e6addb565c1693
4
- data.tar.gz: 95ab89a536022f9c642dd02683640819134441441dd0c4ae7b1cb0e9dd561a68
3
+ metadata.gz: 3f18e076341154326f22050b2bf57d7aa5f82278331f38079b4cb9ea53a13350
4
+ data.tar.gz: 5edcf31c166b6e65530b57c535c9e593a1cc24be7234a74b07eedbe448d775bf
5
5
  SHA512:
6
- metadata.gz: 1cda1a2dfbdf88aaf7627304dc8fc740d3e4343b6d4f0e97a6473dc168b3b78c1128973251625beeee479a0418c25972f7dedb0cbcc9e107666fcdad32c991c8
7
- data.tar.gz: e4589afe5650d8a937a2c56196221db8ce72d8cb91539ca0fceb9ad742d542ab4415b5253e6ffa3c8b03ccaac3dc6e8fe3b25d61cb17cd9155cc50d16dc44d4c
6
+ metadata.gz: 19f1201ce7d6a27379d5782373671a1fecfa6482bc699bdb89aa15ef9482f33659913874a5f22e8e3dece848350f411ebe96eb14f3fd3d6dc624455d85ba19de
7
+ data.tar.gz: 113401cf222bcf13bcda4424492b103f9bd9563c38f6dbdd7b7a7c4465e3971819a5ae77e1153987178d8353cf8d7aa79332484324bad00858a6f526b7f4a1b7
data/CHANGELOG.md CHANGED
@@ -1,3 +1,84 @@
1
+ # 2.4.22 (November 9, 2023)
2
+
3
+ ## Enhancements:
4
+
5
+ - Add Bundler::Plugin.loaded? helper [#6964](https://github.com/rubygems/rubygems/pull/6964)
6
+ - Give better error when previous installation folder is insecure to remove [#7030](https://github.com/rubygems/rubygems/pull/7030)
7
+ - Set file path when eval-ing local specification in EndpointSpecification [#7106](https://github.com/rubygems/rubygems/pull/7106)
8
+ - Git ignore the proper files for the CI service selected for `bundle gem` [#7101](https://github.com/rubygems/rubygems/pull/7101)
9
+ - Update vendored thor to v1.3.0 [#7078](https://github.com/rubygems/rubygems/pull/7078)
10
+ - Restore using old way of passing Ruby version to resolver [#7066](https://github.com/rubygems/rubygems/pull/7066)
11
+ - Bump vendored net-http-persistent to 4.0.2 [#6787](https://github.com/rubygems/rubygems/pull/6787)
12
+
13
+ ## Bug fixes:
14
+
15
+ - Fix regression when installing native extensions on universal rubies [#7077](https://github.com/rubygems/rubygems/pull/7077)
16
+ - Only remove bundler plugin gem when it's inside the cache [#7001](https://github.com/rubygems/rubygems/pull/7001)
17
+ - Don't show bug report template when GEM_HOME has no writable bit [#7113](https://github.com/rubygems/rubygems/pull/7113)
18
+ - Fix regression in old git versions [#7114](https://github.com/rubygems/rubygems/pull/7114)
19
+ - Handle empty array at built-in YAML serializer [#7099](https://github.com/rubygems/rubygems/pull/7099)
20
+ - Fix force_ruby_platform: when the lockfile only locks the ruby platform [#6936](https://github.com/rubygems/rubygems/pull/6936)
21
+
22
+ # 2.4.21 (October 17, 2023)
23
+
24
+ ## Enhancements:
25
+
26
+ - Avoid duplicates -rbundler/setup in RUBYOPT with Ruby preview [#7002](https://github.com/rubygems/rubygems/pull/7002)
27
+ - Prevent gem activation in standalone mode [#6925](https://github.com/rubygems/rubygems/pull/6925)
28
+ - Support Ruby's preview version format (Ex: 3.3.0-preview2) in Gemfile [#7016](https://github.com/rubygems/rubygems/pull/7016)
29
+ - Fix `bundle install` when older revisions of git source [#6980](https://github.com/rubygems/rubygems/pull/6980)
30
+ - Remove usage of Dir.chdir that only execute a subprocess [#6930](https://github.com/rubygems/rubygems/pull/6930)
31
+
32
+ ## Bug fixes:
33
+
34
+ - Don't delete the release version from pre-release string more than once [#7054](https://github.com/rubygems/rubygems/pull/7054)
35
+ - Make the `lock` command not be affected by the `frozen` setting [#7034](https://github.com/rubygems/rubygems/pull/7034)
36
+ - Raise an error when adding a gem incompatible with some locked platform [#7035](https://github.com/rubygems/rubygems/pull/7035)
37
+ - Re-resolve when lockfile is invalid [#7020](https://github.com/rubygems/rubygems/pull/7020)
38
+ - Don't re-resolve with prereleases if unlocked gem has no prereleases [#7021](https://github.com/rubygems/rubygems/pull/7021)
39
+ - Include gemspec in ExtensionTask for native gem tasks [#7015](https://github.com/rubygems/rubygems/pull/7015)
40
+ - Avoid error reporting relative path when validating frozen [#5128](https://github.com/rubygems/rubygems/pull/5128)
41
+ - Fix `bundle lock --minor --update <dep>` edge case [#6992](https://github.com/rubygems/rubygems/pull/6992)
42
+ - Stop bundler eagerly loading all specs with exts [#6945](https://github.com/rubygems/rubygems/pull/6945)
43
+
44
+ ## Performance:
45
+
46
+ - Reduce allocations when parsing lockfile [#6976](https://github.com/rubygems/rubygems/pull/6976)
47
+ - Stop allocating the same settings keys repeatedly [#6963](https://github.com/rubygems/rubygems/pull/6963)
48
+
49
+ ## Documentation:
50
+
51
+ - Improve formatting and global source information in `bundle plugin` man page [#7045](https://github.com/rubygems/rubygems/pull/7045)
52
+ - Update man page of `bundle exec` to reflect default true of flag `--keep-file-descriptors` [#7033](https://github.com/rubygems/rubygems/pull/7033)
53
+
54
+ # 2.4.20 (September 27, 2023)
55
+
56
+ ## Enhancements:
57
+
58
+ - Bump actions/checkout to v4 in bundler gem template [#6966](https://github.com/rubygems/rubygems/pull/6966)
59
+ - Add support for the `ruby-3.2.2` format in the `ruby file:` Gemfile directive, and explicitly test the `3.2.2@gemset` format as rejected [#6954](https://github.com/rubygems/rubygems/pull/6954)
60
+ - Support `ruby file: ".tool-versions"` in Gemfile [#6898](https://github.com/rubygems/rubygems/pull/6898)
61
+ - Unify LockfileParser loading of SPECS section [#6933](https://github.com/rubygems/rubygems/pull/6933)
62
+ - Only check circular deps when dependency api is available, not on full index sources [#6919](https://github.com/rubygems/rubygems/pull/6919)
63
+
64
+ ## Bug fixes:
65
+
66
+ - Allow standalone mode to work on a Windows edge case [#6989](https://github.com/rubygems/rubygems/pull/6989)
67
+ - Fix `bundle outdated` crashing when both `ref` and `branch` specified for a git gem in Gemfile [#6959](https://github.com/rubygems/rubygems/pull/6959)
68
+ - Fix `bundle update --redownload` [#6924](https://github.com/rubygems/rubygems/pull/6924)
69
+ - Fixed malformed bundler version in lockfile making Bundler crash [#6920](https://github.com/rubygems/rubygems/pull/6920)
70
+ - Fix standalone install crashing when using legacy gemfiles with multiple global sources [#6918](https://github.com/rubygems/rubygems/pull/6918)
71
+ - Resolve ruby version file relative to bundle root [#6892](https://github.com/rubygems/rubygems/pull/6892)
72
+
73
+ ## Performance:
74
+
75
+ - Lazily construct fetcher debug messages [#6973](https://github.com/rubygems/rubygems/pull/6973)
76
+ - Avoid allocating empty hashes in Index [#6962](https://github.com/rubygems/rubygems/pull/6962)
77
+ - Improve `Bundler::Index` efficiency by removing unnecessary creation and dups [#6931](https://github.com/rubygems/rubygems/pull/6931)
78
+ - (Further) Improve Bundler::Settings#[] performance and memory usage [#6923](https://github.com/rubygems/rubygems/pull/6923)
79
+ - Don't use full indexes unnecessarily on legacy Gemfiles [#6916](https://github.com/rubygems/rubygems/pull/6916)
80
+ - Improve memory usage in Bundler::Settings, and thus improve boot time [#6884](https://github.com/rubygems/rubygems/pull/6884)
81
+
1
82
  # 2.4.19 (August 17, 2023)
2
83
 
3
84
  ## Enhancements:
@@ -2153,7 +2234,7 @@ Changes
2153
2234
 
2154
2235
  - retry gem downloads ([#4846](https://github.com/rubygems/bundler/issues/4846), @jkeiser)
2155
2236
  - improve the CompactIndex to handle capitalized legacy gems ([#4867](https://github.com/rubygems/bundler/issues/4867), @segiddins)
2156
- - re-use persistent HTTP connections for CompactIndex (@NickLaMuro)
2237
+ - reuse persistent HTTP connections for CompactIndex (@NickLaMuro)
2157
2238
  - respect `required_ruby_version` when Gemfile contains `ruby` version (@indirect)
2158
2239
  - allow `rake release` to sign git tags ([#4743](https://github.com/rubygems/bundler/issues/4743), @eagletmt)
2159
2240
  - set process titles when using `#load` during `exec` (@yob)
@@ -3349,7 +3430,7 @@ Changes
3349
3430
  - `gem` option --test can generate rspec stubs (@MafcoCinco)
3350
3431
  - `gem` option --test can generate minitest stubs (@kcurtin)
3351
3432
  - `gem` command generates MIT license (@BrentWheeldon)
3352
- - gem rake task 'release' resuses existing tags (@shtirlic)
3433
+ - gem rake task 'release' reuses existing tags (@shtirlic)
3353
3434
 
3354
3435
  ## Bug fixes:
3355
3436
 
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
1
  [![Version ](https://img.shields.io/gem/v/bundler.svg?style=flat)](https://rubygems.org/gems/bundler)
2
- [![Slack ](https://bundler-slackin.herokuapp.com/badge.svg)](https://bundler-slackin.herokuapp.com)
3
2
 
4
3
  # Bundler: a gem to bundle gems
5
4
 
@@ -38,7 +37,7 @@ Still stuck? Try [filing an issue](https://github.com/rubygems/rubygems/issues/n
38
37
 
39
38
  To see what has changed in recent versions of Bundler, see the [CHANGELOG](CHANGELOG.md).
40
39
 
41
- To get in touch with the Bundler core team and other Bundler users, please join [the Bundler slack](https://slack.bundler.io).
40
+ To get in touch with the Bundler core team and other Bundler users, please join [the Bundler slack](https://join.slack.com/t/bundler/shared_invite/zt-1rrsuuv3m-OmXKWQf8K6iSla4~F1DBjQ).
42
41
 
43
42
  ### Contributing
44
43
 
@@ -4,8 +4,8 @@ module Bundler
4
4
  # Represents metadata from when the Bundler gem was built.
5
5
  module BuildMetadata
6
6
  # begin ivars
7
- @built_at = "2023-08-17".freeze
8
- @git_commit_sha = "86f98098e3".freeze
7
+ @built_at = "2023-11-09".freeze
8
+ @git_commit_sha = "ec2089640".freeze
9
9
  @release = true
10
10
  # end ivars
11
11
 
@@ -31,7 +31,7 @@ module Bundler
31
31
  # commit instance variable then we can't determine its commits SHA.
32
32
  git_dir = File.expand_path("../../../.git", __dir__)
33
33
  if File.directory?(git_dir)
34
- return @git_commit_sha = Dir.chdir(git_dir) { `git rev-parse --short HEAD`.strip.freeze }
34
+ return @git_commit_sha = IO.popen(%w[git rev-parse --short HEAD], { :chdir => git_dir }, &:read).strip.freeze
35
35
  end
36
36
 
37
37
  @git_commit_sha ||= "unknown"
@@ -29,7 +29,7 @@ module Bundler
29
29
  Bundler.ui.warn "Install missing gems with `bundle install`"
30
30
  exit 1
31
31
  elsif !Bundler.default_lockfile.file? && Bundler.frozen_bundle?
32
- Bundler.ui.error "This bundle has been frozen, but there is no #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} present"
32
+ Bundler.ui.error "This bundle has been frozen, but there is no #{SharedHelpers.relative_lockfile_path} present"
33
33
  exit 1
34
34
  else
35
35
  Bundler.load.lock(:preserve_unknown_sections => true) unless options[:"dry-run"]
@@ -137,10 +137,13 @@ module Bundler
137
137
  case config[:ci]
138
138
  when "github"
139
139
  templates.merge!("github/workflows/main.yml.tt" => ".github/workflows/main.yml")
140
+ config[:ci_config_path] = ".github "
140
141
  when "gitlab"
141
142
  templates.merge!("gitlab-ci.yml.tt" => ".gitlab-ci.yml")
143
+ config[:ci_config_path] = ".gitlab-ci.yml "
142
144
  when "circle"
143
145
  templates.merge!("circleci/config.yml.tt" => ".circleci/config.yml")
146
+ config[:ci_config_path] = ".circleci "
144
147
  end
145
148
 
146
149
  if ask_and_set(:mit, "Do you want to license your code permissively under the MIT license?",
@@ -233,9 +236,7 @@ module Bundler
233
236
  end
234
237
 
235
238
  if use_git
236
- Dir.chdir(target) do
237
- `git add .`
238
- end
239
+ IO.popen(%w[git add .], { :chdir => target }, &:read)
239
240
  end
240
241
 
241
242
  # Open gemspec in editor
@@ -33,7 +33,7 @@ module Bundler
33
33
  def default_gem_spec(gem_name)
34
34
  return unless Gem::Specification.respond_to?(:find_all_by_name)
35
35
  gem_spec = Gem::Specification.find_all_by_name(gem_name).last
36
- return gem_spec if gem_spec&.default_gem?
36
+ gem_spec if gem_spec&.default_gem?
37
37
  end
38
38
 
39
39
  def spec_not_found(gem_name)
@@ -28,8 +28,8 @@ module Bundler
28
28
  flag = "--deployment flag" if options[:deployment]
29
29
  flag ||= "--frozen flag" if options[:frozen]
30
30
  flag ||= "deployment setting"
31
- raise ProductionError, "The #{flag} requires a #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}. Please make " \
32
- "sure you have checked your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} into version control " \
31
+ raise ProductionError, "The #{flag} requires a lockfile. Please make " \
32
+ "sure you have checked your #{SharedHelpers.relative_lockfile_path} into version control " \
33
33
  "before deploying."
34
34
  end
35
35
 
@@ -32,36 +32,39 @@ module Bundler
32
32
  elsif update && bundler
33
33
  update = { :bundler => bundler }
34
34
  end
35
- definition = Bundler.definition(update)
36
35
 
37
- Bundler::CLI::Common.configure_gem_version_promoter(Bundler.definition, options) if options[:update]
36
+ Bundler.settings.temporary(:frozen => false) do
37
+ definition = Bundler.definition(update)
38
38
 
39
- options["remove-platform"].each do |platform|
40
- definition.remove_platform(platform)
41
- end
39
+ Bundler::CLI::Common.configure_gem_version_promoter(definition, options) if options[:update]
42
40
 
43
- options["add-platform"].each do |platform_string|
44
- platform = Gem::Platform.new(platform_string)
45
- if platform.to_s == "unknown"
46
- Bundler.ui.warn "The platform `#{platform_string}` is unknown to RubyGems " \
47
- "and adding it will likely lead to resolution errors"
41
+ options["remove-platform"].each do |platform|
42
+ definition.remove_platform(platform)
48
43
  end
49
- definition.add_platform(platform)
50
- end
51
44
 
52
- if definition.platforms.empty?
53
- raise InvalidOption, "Removing all platforms from the bundle is not allowed"
54
- end
45
+ options["add-platform"].each do |platform_string|
46
+ platform = Gem::Platform.new(platform_string)
47
+ if platform.to_s == "unknown"
48
+ Bundler.ui.warn "The platform `#{platform_string}` is unknown to RubyGems " \
49
+ "and adding it will likely lead to resolution errors"
50
+ end
51
+ definition.add_platform(platform)
52
+ end
55
53
 
56
- definition.resolve_remotely! unless options[:local]
54
+ if definition.platforms.empty?
55
+ raise InvalidOption, "Removing all platforms from the bundle is not allowed"
56
+ end
57
+
58
+ definition.resolve_remotely! unless options[:local]
57
59
 
58
- if print
59
- puts definition.to_lock
60
- else
61
- file = options[:lockfile]
62
- file = file ? File.expand_path(file) : Bundler.default_lockfile
63
- puts "Writing lockfile to #{file}"
64
- definition.lock(file)
60
+ if print
61
+ puts definition.to_lock
62
+ else
63
+ file = options[:lockfile]
64
+ file = file ? File.expand_path(file) : Bundler.default_lockfile
65
+ puts "Writing lockfile to #{file}"
66
+ definition.lock(file)
67
+ end
65
68
  end
66
69
 
67
70
  Bundler.ui.level = previous_ui_level
@@ -18,13 +18,11 @@ module Bundler
18
18
  Bundler.ui.info "Unable to open #{name} because it's a default gem, so the directory it would normally be installed to does not exist."
19
19
  else
20
20
  root_path = spec.full_gem_path
21
- Dir.chdir(root_path) do
22
- require "shellwords"
23
- command = Shellwords.split(editor) << File.join([root_path, path].compact)
24
- Bundler.with_original_env do
25
- system(*command)
26
- end || Bundler.ui.info("Could not run '#{command.join(" ")}'")
27
- end
21
+ require "shellwords"
22
+ command = Shellwords.split(editor) << File.join([root_path, path].compact)
23
+ Bundler.with_original_env do
24
+ system(*command, { :chdir => root_path })
25
+ end || Bundler.ui.info("Could not run '#{command.join(" ")}'")
28
26
  end
29
27
  end
30
28
  end
@@ -63,6 +63,7 @@ module Bundler
63
63
  opts = options.dup
64
64
  opts["update"] = true
65
65
  opts["local"] = options[:local]
66
+ opts["force"] = options[:redownload]
66
67
 
67
68
  Bundler.settings.set_command_option_if_given :jobs, opts["jobs"]
68
69
 
@@ -149,7 +149,7 @@ module Bundler
149
149
  @dependency_changes = converge_dependencies
150
150
  @local_changes = converge_locals
151
151
 
152
- @missing_lockfile_dep = check_missing_lockfile_dep
152
+ check_lockfile
153
153
  end
154
154
 
155
155
  def gem_version_promoter
@@ -405,13 +405,13 @@ module Bundler
405
405
  msg << "\n\nYou have added to the Gemfile:\n" << added.join("\n") if added.any?
406
406
  msg << "\n\nYou have deleted from the Gemfile:\n" << deleted.join("\n") if deleted.any?
407
407
  msg << "\n\nYou have changed in the Gemfile:\n" << changed.join("\n") if changed.any?
408
- msg << "\n\nRun `bundle install` elsewhere and add the updated #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} to version control.\n"
408
+ msg << "\n\nRun `bundle install` elsewhere and add the updated #{SharedHelpers.relative_gemfile_path} to version control.\n"
409
409
 
410
410
  unless explicit_flag
411
411
  suggested_command = unless Bundler.settings.locations("frozen").keys.include?(:env)
412
412
  "bundle config set frozen false"
413
413
  end
414
- msg << "If this is a development machine, remove the #{Bundler.default_gemfile.relative_path_from(SharedHelpers.pwd)} " \
414
+ msg << "If this is a development machine, remove the #{SharedHelpers.relative_lockfile_path} " \
415
415
  "freeze by running `#{suggested_command}`." if suggested_command
416
416
  end
417
417
 
@@ -452,8 +452,8 @@ module Bundler
452
452
  return if current_platform_locked?
453
453
 
454
454
  raise ProductionError, "Your bundle only supports platforms #{@platforms.map(&:to_s)} " \
455
- "but your local platform is #{Bundler.local_platform}. " \
456
- "Add the current platform to the lockfile with\n`bundle lock --add-platform #{Bundler.local_platform}` and try again."
455
+ "but your local platform is #{local_platform}. " \
456
+ "Add the current platform to the lockfile with\n`bundle lock --add-platform #{local_platform}` and try again."
457
457
  end
458
458
 
459
459
  def add_platform(platform)
@@ -478,7 +478,7 @@ module Bundler
478
478
  private :sources
479
479
 
480
480
  def nothing_changed?
481
- !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes && !@missing_lockfile_dep && !@unlocking_bundler
481
+ !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes && !@missing_lockfile_dep && !@unlocking_bundler && !@invalid_lockfile_dep
482
482
  end
483
483
 
484
484
  def no_resolve_needed?
@@ -509,7 +509,7 @@ module Bundler
509
509
  def resolution_packages
510
510
  @resolution_packages ||= begin
511
511
  last_resolve = converge_locked_specs
512
- remove_ruby_from_platforms_if_necessary!(current_dependencies)
512
+ remove_invalid_platforms!(current_dependencies)
513
513
  packages = Resolver::Base.new(source_requirements, expanded_dependencies, last_resolve, @platforms, :locked_specs => @originally_locked_specs, :unlock => @unlock[:gems], :prerelease => gem_version_promoter.pre?)
514
514
  additional_base_requirements_for_resolve(packages, last_resolve)
515
515
  end
@@ -600,7 +600,7 @@ module Bundler
600
600
 
601
601
  def current_platform_locked?
602
602
  @platforms.any? do |bundle_platform|
603
- MatchPlatform.platforms_match?(bundle_platform, Bundler.local_platform)
603
+ MatchPlatform.platforms_match?(bundle_platform, local_platform)
604
604
  end
605
605
  end
606
606
 
@@ -630,6 +630,7 @@ module Bundler
630
630
  [@local_changes, "the gemspecs for git local gems changed"],
631
631
  [@missing_lockfile_dep, "your lock file is missing \"#{@missing_lockfile_dep}\""],
632
632
  [@unlocking_bundler, "an update to the version of Bundler itself was requested"],
633
+ [@invalid_lockfile_dep, "your lock file has an invalid dependency \"#{@invalid_lockfile_dep}\""],
633
634
  ].select(&:first).map(&:last).join(", ")
634
635
  end
635
636
 
@@ -684,24 +685,38 @@ module Bundler
684
685
  !sources_with_changes.each {|source| @unlock[:sources] << source.name }.empty?
685
686
  end
686
687
 
687
- def check_missing_lockfile_dep
688
- all_locked_specs = @locked_specs.map(&:name) << "bundler"
688
+ def check_lockfile
689
+ @invalid_lockfile_dep = nil
690
+ @missing_lockfile_dep = nil
689
691
 
690
- missing = @locked_specs.select do |s|
691
- s.dependencies.any? {|dep| !all_locked_specs.include?(dep.name) }
692
+ locked_names = @locked_specs.map(&:name)
693
+ missing = []
694
+ invalid = []
695
+
696
+ @locked_specs.each do |s|
697
+ s.dependencies.each do |dep|
698
+ next if dep.name == "bundler"
699
+
700
+ missing << s unless locked_names.include?(dep.name)
701
+ invalid << s if @locked_specs.none? {|spec| dep.matches_spec?(spec) }
702
+ end
692
703
  end
693
704
 
694
705
  if missing.any?
695
706
  @locked_specs.delete(missing)
696
707
 
697
- return missing.first.name
708
+ @missing_lockfile_dep = missing.first.name
709
+ elsif !@dependency_changes
710
+ @missing_lockfile_dep = current_dependencies.find do |d|
711
+ @locked_specs[d.name].empty? && d.name != "bundler"
712
+ end&.name
698
713
  end
699
714
 
700
- return if @dependency_changes
715
+ if invalid.any?
716
+ @locked_specs.delete(invalid)
701
717
 
702
- current_dependencies.find do |d|
703
- @locked_specs[d.name].empty? && d.name != "bundler"
704
- end&.name
718
+ @invalid_lockfile_dep = invalid.first.name
719
+ end
705
720
  end
706
721
 
707
722
  def converge_paths
@@ -866,7 +881,7 @@ module Bundler
866
881
 
867
882
  def metadata_dependencies
868
883
  @metadata_dependencies ||= [
869
- Dependency.new("Ruby\0", Gem.ruby_version),
884
+ Dependency.new("Ruby\0", Bundler::RubyVersion.system.gem_version),
870
885
  Dependency.new("RubyGems\0", Gem::VERSION),
871
886
  ]
872
887
  end
@@ -941,17 +956,19 @@ module Bundler
941
956
  resolution_packages
942
957
  end
943
958
 
944
- def remove_ruby_from_platforms_if_necessary!(dependencies)
945
- return if Bundler.frozen_bundle? ||
946
- Bundler.local_platform == Gem::Platform::RUBY ||
947
- !platforms.include?(Gem::Platform::RUBY) ||
948
- (@new_platform && platforms.last == Gem::Platform::RUBY) ||
959
+ def remove_invalid_platforms!(dependencies)
960
+ return if Bundler.frozen_bundle?
961
+
962
+ platforms.each do |platform|
963
+ next if local_platform == platform ||
964
+ (@new_platform && platforms.last == platform) ||
949
965
  @path_changes ||
950
966
  @dependency_changes ||
951
- !@originally_locked_specs.incomplete_ruby_specs?(dependencies)
967
+ !@originally_locked_specs.incomplete_for_platform?(dependencies, platform)
952
968
 
953
- remove_platform(Gem::Platform::RUBY)
954
- add_current_platform
969
+ remove_platform(platform)
970
+ add_current_platform if platform == Gem::Platform::RUBY
971
+ end
955
972
  end
956
973
 
957
974
  def source_map
@@ -94,7 +94,7 @@ module Bundler
94
94
 
95
95
  def _local_specification
96
96
  return unless @loaded_from && File.exist?(local_specification_path)
97
- eval(File.read(local_specification_path)).tap do |spec|
97
+ eval(File.read(local_specification_path), nil, local_specification_path).tap do |spec|
98
98
  spec.loaded_from = @loaded_from
99
99
  end
100
100
  end
data/lib/bundler/env.rb CHANGED
@@ -40,11 +40,11 @@ module Bundler
40
40
 
41
41
  out << "\n## Gemfile\n"
42
42
  gemfiles.each do |gemfile|
43
- out << "\n### #{Pathname.new(gemfile).relative_path_from(SharedHelpers.pwd)}\n\n"
43
+ out << "\n### #{SharedHelpers.relative_path_to(gemfile)}\n\n"
44
44
  out << "```ruby\n" << read_file(gemfile).chomp << "\n```\n"
45
45
  end
46
46
 
47
- out << "\n### #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}\n\n"
47
+ out << "\n### #{SharedHelpers.relative_path_to(Bundler.default_lockfile)}\n\n"
48
48
  out << "```\n" << read_file(Bundler.default_lockfile).chomp << "\n```\n"
49
49
  end
50
50
 
@@ -172,4 +172,19 @@ module Bundler
172
172
 
173
173
  status_code(36)
174
174
  end
175
+
176
+ class InsecureInstallPathError < BundlerError
177
+ def initialize(path)
178
+ @path = path
179
+ end
180
+
181
+ def message
182
+ "The installation path is insecure. Bundler cannot continue.\n" \
183
+ "#{@path} is world-writable (without sticky bit).\n" \
184
+ "Bundler cannot safely replace gems in world-writeable directories due to potential vulnerabilities.\n" \
185
+ "Please change the permissions of this directory or choose a different install path."
186
+ end
187
+
188
+ status_code(38)
189
+ end
175
190
  end
@@ -38,9 +38,9 @@ module Bundler
38
38
 
39
39
  private
40
40
 
41
- def log_specs(debug_msg)
41
+ def log_specs(&block)
42
42
  if Bundler.ui.debug?
43
- Bundler.ui.debug debug_msg
43
+ Bundler.ui.debug yield
44
44
  else
45
45
  Bundler.ui.info ".", false
46
46
  end
@@ -35,7 +35,7 @@ module Bundler
35
35
  remaining_gems = gem_names.dup
36
36
 
37
37
  until remaining_gems.empty?
38
- log_specs "Looking up gems #{remaining_gems.inspect}"
38
+ log_specs { "Looking up gems #{remaining_gems.inspect}" }
39
39
 
40
40
  deps = begin
41
41
  parallel_compact_index_client.dependencies(remaining_gems)
@@ -60,10 +60,6 @@ module Bundler
60
60
  Bundler.ui.debug("FIPS mode is enabled, bundler can't use the CompactIndex API")
61
61
  return nil
62
62
  end
63
- if fetch_uri.scheme == "file"
64
- Bundler.ui.debug("Using a local server, bundler won't use the CompactIndex API")
65
- return false
66
- end
67
63
  # Read info file checksums out of /versions, so we can know if gems are up to date
68
64
  compact_index_client.update_and_parse_checksums!
69
65
  rescue CompactIndexClient::Updater::MisMatchedChecksumError => e
@@ -24,7 +24,7 @@ module Bundler
24
24
  def specs(gem_names, full_dependency_list = [], last_spec_list = [])
25
25
  query_list = gem_names.uniq - full_dependency_list
26
26
 
27
- log_specs "Query List: #{query_list.inspect}"
27
+ log_specs { "Query List: #{query_list.inspect}" }
28
28
 
29
29
  return last_spec_list if query_list.empty?
30
30
 
@@ -9,6 +9,7 @@ require "rubygems/request"
9
9
  module Bundler
10
10
  # Handles all the fetching with the rubygems server
11
11
  class Fetcher
12
+ autoload :Base, File.expand_path("fetcher/base", __dir__)
12
13
  autoload :CompactIndex, File.expand_path("fetcher/compact_index", __dir__)
13
14
  autoload :Downloader, File.expand_path("fetcher/downloader", __dir__)
14
15
  autoload :Dependency, File.expand_path("fetcher/dependency", __dir__)
@@ -134,18 +135,7 @@ module Bundler
134
135
  def specs(gem_names, source)
135
136
  index = Bundler::Index.new
136
137
 
137
- if Bundler::Fetcher.disable_endpoint
138
- @use_api = false
139
- specs = fetchers.last.specs(gem_names)
140
- else
141
- specs = []
142
- @fetchers = fetchers.drop_while do |f|
143
- !f.available? || (f.api_fetcher? && !gem_names) || !specs = f.specs(gem_names)
144
- end
145
- @use_api = false if fetchers.none?(&:api_fetcher?)
146
- end
147
-
148
- specs.each do |name, version, platform, dependencies, metadata|
138
+ fetch_specs(gem_names).each do |name, version, platform, dependencies, metadata|
149
139
  spec = if dependencies
150
140
  EndpointSpecification.new(name, version, platform, self, dependencies, metadata)
151
141
  else
@@ -158,22 +148,10 @@ module Bundler
158
148
 
159
149
  index
160
150
  rescue CertificateFailureError
161
- Bundler.ui.info "" if gem_names && use_api # newline after dots
151
+ Bundler.ui.info "" if gem_names && api_fetcher? # newline after dots
162
152
  raise
163
153
  end
164
154
 
165
- def use_api
166
- return @use_api if defined?(@use_api)
167
-
168
- fetchers.shift until fetchers.first.available?
169
-
170
- @use_api = if remote_uri.scheme == "file" || Bundler::Fetcher.disable_endpoint
171
- false
172
- else
173
- fetchers.first.api_fetcher?
174
- end
175
- end
176
-
177
155
  def user_agent
178
156
  @user_agent ||= begin
179
157
  ruby = Bundler::RubyVersion.system
@@ -209,10 +187,6 @@ module Bundler
209
187
  end
210
188
  end
211
189
 
212
- def fetchers
213
- @fetchers ||= FETCHERS.map {|f| f.new(downloader, @remote, uri) }
214
- end
215
-
216
190
  def http_proxy
217
191
  return unless uri = connection.proxy_uri
218
192
  uri.to_s
@@ -222,9 +196,36 @@ module Bundler
222
196
  "#<#{self.class}:0x#{object_id} uri=#{uri}>"
223
197
  end
224
198
 
199
+ def api_fetcher?
200
+ fetchers.first.api_fetcher?
201
+ end
202
+
225
203
  private
226
204
 
227
- FETCHERS = [CompactIndex, Dependency, Index].freeze
205
+ def available_fetchers
206
+ if Bundler::Fetcher.disable_endpoint
207
+ [Index]
208
+ elsif remote_uri.scheme == "file"
209
+ Bundler.ui.debug("Using a local server, bundler won't use the CompactIndex API")
210
+ [Index]
211
+ else
212
+ [CompactIndex, Dependency, Index]
213
+ end
214
+ end
215
+
216
+ def fetchers
217
+ @fetchers ||= available_fetchers.map {|f| f.new(downloader, @remote, uri) }.drop_while {|f| !f.available? }
218
+ end
219
+
220
+ def fetch_specs(gem_names)
221
+ fetchers.reject!(&:api_fetcher?) unless gem_names
222
+ fetchers.reject! do |f|
223
+ specs = f.specs(gem_names)
224
+ return specs if specs
225
+ true
226
+ end
227
+ []
228
+ end
228
229
 
229
230
  def cis
230
231
  env_cis = {