rubygems-update 3.4.20 → 3.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 (155) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -0
  3. data/Manifest.txt +1 -0
  4. data/bundler/CHANGELOG.md +34 -3
  5. data/bundler/lib/bundler/build_metadata.rb +3 -3
  6. data/bundler/lib/bundler/cli/check.rb +1 -1
  7. data/bundler/lib/bundler/cli/gem.rb +1 -3
  8. data/bundler/lib/bundler/cli/install.rb +2 -2
  9. data/bundler/lib/bundler/cli/lock.rb +26 -23
  10. data/bundler/lib/bundler/cli/open.rb +5 -7
  11. data/bundler/lib/bundler/definition.rb +42 -25
  12. data/bundler/lib/bundler/env.rb +2 -2
  13. data/bundler/lib/bundler/gem_version_promoter.rb +2 -2
  14. data/bundler/lib/bundler/injector.rb +1 -1
  15. data/bundler/lib/bundler/installer/parallel_installer.rb +0 -26
  16. data/bundler/lib/bundler/installer/standalone.rb +13 -6
  17. data/bundler/lib/bundler/lockfile_parser.rb +29 -24
  18. data/bundler/lib/bundler/man/bundle-add.1 +1 -1
  19. data/bundler/lib/bundler/man/bundle-binstubs.1 +1 -1
  20. data/bundler/lib/bundler/man/bundle-cache.1 +1 -1
  21. data/bundler/lib/bundler/man/bundle-check.1 +1 -1
  22. data/bundler/lib/bundler/man/bundle-clean.1 +1 -1
  23. data/bundler/lib/bundler/man/bundle-config.1 +1 -1
  24. data/bundler/lib/bundler/man/bundle-console.1 +1 -1
  25. data/bundler/lib/bundler/man/bundle-doctor.1 +1 -1
  26. data/bundler/lib/bundler/man/bundle-exec.1 +2 -2
  27. data/bundler/lib/bundler/man/bundle-exec.1.ronn +2 -3
  28. data/bundler/lib/bundler/man/bundle-gem.1 +1 -1
  29. data/bundler/lib/bundler/man/bundle-help.1 +1 -1
  30. data/bundler/lib/bundler/man/bundle-info.1 +1 -1
  31. data/bundler/lib/bundler/man/bundle-init.1 +1 -1
  32. data/bundler/lib/bundler/man/bundle-inject.1 +1 -1
  33. data/bundler/lib/bundler/man/bundle-install.1 +1 -1
  34. data/bundler/lib/bundler/man/bundle-list.1 +1 -1
  35. data/bundler/lib/bundler/man/bundle-lock.1 +1 -1
  36. data/bundler/lib/bundler/man/bundle-open.1 +1 -1
  37. data/bundler/lib/bundler/man/bundle-outdated.1 +1 -1
  38. data/bundler/lib/bundler/man/bundle-platform.1 +1 -1
  39. data/bundler/lib/bundler/man/bundle-plugin.1 +17 -17
  40. data/bundler/lib/bundler/man/bundle-plugin.1.ronn +5 -5
  41. data/bundler/lib/bundler/man/bundle-pristine.1 +1 -1
  42. data/bundler/lib/bundler/man/bundle-remove.1 +1 -1
  43. data/bundler/lib/bundler/man/bundle-show.1 +1 -1
  44. data/bundler/lib/bundler/man/bundle-update.1 +1 -1
  45. data/bundler/lib/bundler/man/bundle-version.1 +1 -1
  46. data/bundler/lib/bundler/man/bundle-viz.1 +1 -1
  47. data/bundler/lib/bundler/man/bundle.1 +1 -1
  48. data/bundler/lib/bundler/man/gemfile.5 +1 -1
  49. data/bundler/lib/bundler/resolver/package.rb +5 -0
  50. data/bundler/lib/bundler/resolver.rb +27 -7
  51. data/bundler/lib/bundler/ruby_version.rb +8 -1
  52. data/bundler/lib/bundler/settings.rb +53 -16
  53. data/bundler/lib/bundler/shared_helpers.rb +16 -1
  54. data/bundler/lib/bundler/source/git/git_proxy.rb +13 -4
  55. data/bundler/lib/bundler/spec_set.rb +2 -2
  56. data/bundler/lib/bundler/stub_specification.rb +4 -2
  57. data/bundler/lib/bundler/templates/newgem/Rakefile.tt +6 -2
  58. data/bundler/lib/bundler/version.rb +1 -1
  59. data/bundler/lib/bundler/yaml_serializer.rb +6 -7
  60. data/lib/rubygems/basic_specification.rb +1 -1
  61. data/lib/rubygems/command.rb +2 -2
  62. data/lib/rubygems/command_manager.rb +1 -1
  63. data/lib/rubygems/commands/cert_command.rb +2 -2
  64. data/lib/rubygems/commands/check_command.rb +5 -1
  65. data/lib/rubygems/commands/cleanup_command.rb +1 -1
  66. data/lib/rubygems/commands/contents_command.rb +1 -1
  67. data/lib/rubygems/commands/help_command.rb +2 -2
  68. data/lib/rubygems/commands/open_command.rb +1 -3
  69. data/lib/rubygems/commands/owner_command.rb +1 -1
  70. data/lib/rubygems/commands/setup_command.rb +8 -8
  71. data/lib/rubygems/commands/specification_command.rb +5 -1
  72. data/lib/rubygems/commands/stale_command.rb +1 -1
  73. data/lib/rubygems/commands/update_command.rb +3 -3
  74. data/lib/rubygems/commands/yank_command.rb +1 -1
  75. data/lib/rubygems/config_file.rb +60 -13
  76. data/lib/rubygems/core_ext/kernel_gem.rb +1 -1
  77. data/lib/rubygems/core_ext/kernel_require.rb +1 -1
  78. data/lib/rubygems/defaults.rb +6 -2
  79. data/lib/rubygems/deprecate.rb +2 -1
  80. data/lib/rubygems/doctor.rb +1 -1
  81. data/lib/rubygems/errors.rb +1 -1
  82. data/lib/rubygems/exceptions.rb +1 -1
  83. data/lib/rubygems/ext/builder.rb +5 -4
  84. data/lib/rubygems/ext/cargo_builder.rb +2 -2
  85. data/lib/rubygems/gem_runner.rb +5 -1
  86. data/lib/rubygems/gemcutter_utilities.rb +2 -2
  87. data/lib/rubygems/indexer.rb +1 -1
  88. data/lib/rubygems/install_update_options.rb +1 -1
  89. data/lib/rubygems/installer.rb +8 -8
  90. data/lib/rubygems/package/old.rb +1 -1
  91. data/lib/rubygems/package/tar_writer.rb +1 -1
  92. data/lib/rubygems/package.rb +8 -8
  93. data/lib/rubygems/platform.rb +6 -2
  94. data/lib/rubygems/query_utils.rb +4 -4
  95. data/lib/rubygems/remote_fetcher.rb +10 -2
  96. data/lib/rubygems/request_set.rb +2 -1
  97. data/lib/rubygems/requirement.rb +1 -1
  98. data/lib/rubygems/resolver/api_set.rb +2 -1
  99. data/lib/rubygems/resolver/api_specification.rb +1 -1
  100. data/lib/rubygems/security/signer.rb +10 -2
  101. data/lib/rubygems/security/trust_dir.rb +4 -4
  102. data/lib/rubygems/security.rb +1 -1
  103. data/lib/rubygems/security_option.rb +1 -1
  104. data/lib/rubygems/source.rb +5 -1
  105. data/lib/rubygems/specification.rb +9 -10
  106. data/lib/rubygems/specification_policy.rb +5 -5
  107. data/lib/rubygems/uninstaller.rb +1 -1
  108. data/lib/rubygems/update_suggestion.rb +1 -1
  109. data/lib/rubygems/util.rb +5 -1
  110. data/lib/rubygems/version.rb +3 -2
  111. data/lib/rubygems/yaml_serializer.rb +88 -0
  112. data/lib/rubygems.rb +4 -4
  113. data/rubygems-update.gemspec +1 -1
  114. data/setup.rb +2 -0
  115. data/test/rubygems/bundler_test_gem.rb +6 -3
  116. data/test/rubygems/helper.rb +23 -15
  117. data/test/rubygems/package/tar_test_case.rb +2 -2
  118. data/test/rubygems/test_gem.rb +51 -26
  119. data/test/rubygems/test_gem_command.rb +3 -1
  120. data/test/rubygems/test_gem_commands_cert_command.rb +22 -22
  121. data/test/rubygems/test_gem_commands_cleanup_command.rb +2 -2
  122. data/test/rubygems/test_gem_commands_environment_command.rb +2 -1
  123. data/test/rubygems/test_gem_commands_exec_command.rb +5 -1
  124. data/test/rubygems/test_gem_commands_install_command.rb +3 -3
  125. data/test/rubygems/test_gem_commands_open_command.rb +5 -2
  126. data/test/rubygems/test_gem_commands_pristine_command.rb +2 -2
  127. data/test/rubygems/test_gem_commands_push_command.rb +7 -6
  128. data/test/rubygems/test_gem_commands_signin_command.rb +8 -8
  129. data/test/rubygems/test_gem_commands_uninstall_command.rb +1 -1
  130. data/test/rubygems/test_gem_commands_unpack_command.rb +2 -2
  131. data/test/rubygems/test_gem_config_file.rb +46 -12
  132. data/test/rubygems/test_gem_ext_cargo_builder.rb +2 -2
  133. data/test/rubygems/test_gem_gemcutter_utilities.rb +8 -5
  134. data/test/rubygems/test_gem_install_update_options.rb +3 -3
  135. data/test/rubygems/test_gem_installer.rb +15 -15
  136. data/test/rubygems/test_gem_package.rb +35 -34
  137. data/test/rubygems/test_gem_package_old.rb +1 -1
  138. data/test/rubygems/test_gem_package_tar_header.rb +3 -3
  139. data/test/rubygems/test_gem_package_tar_reader.rb +4 -4
  140. data/test/rubygems/test_gem_package_tar_writer.rb +28 -28
  141. data/test/rubygems/test_gem_rdoc.rb +2 -2
  142. data/test/rubygems/test_gem_remote_fetcher.rb +13 -9
  143. data/test/rubygems/test_gem_request.rb +5 -5
  144. data/test/rubygems/test_gem_request_connection_pools.rb +2 -1
  145. data/test/rubygems/test_gem_request_set_gem_dependency_api.rb +14 -7
  146. data/test/rubygems/test_gem_security.rb +2 -2
  147. data/test/rubygems/test_gem_security_signer.rb +2 -2
  148. data/test/rubygems/test_gem_security_trust_dir.rb +6 -6
  149. data/test/rubygems/test_gem_spec_fetcher.rb +2 -2
  150. data/test/rubygems/test_gem_specification.rb +29 -29
  151. data/test/rubygems/test_gem_update_suggestion.rb +12 -6
  152. data/test/rubygems/test_gem_util.rb +2 -2
  153. data/test/rubygems/test_gem_version.rb +4 -2
  154. data/test/rubygems/utilities.rb +2 -1
  155. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d7e2796bcbea4d90f69fc8e0b49f30ff512777fd1f72bfcace6618e01505a24
4
- data.tar.gz: 1921651535aec5214a2504f28c7b62b405e75b15f01130753543e059bbe3f4e0
3
+ metadata.gz: 1f05a0cda4ceecb0e1a71c9956e3e8597fcf627c352f6ee567790df40fddccac
4
+ data.tar.gz: fa139ca2d60133ee401e1b10a4ec477bd38264c49507b55b319299e26b77ab8d
5
5
  SHA512:
6
- metadata.gz: a8897e246b67854308c5bafd93f42d03bdc3290c63a1dc1c2d706aff9694c393059de946d75fd49c29a1db4d16fe317c6e418e1c93166e000c6a30635166d47f
7
- data.tar.gz: 479607e63ac5901ed8b904e0502fd26bb671d2700a5343a812e9120cfabfa08d199ce4098ebce337ab47df09cb4fb1e644a850b361467fd40c2d8242e2e6d566
6
+ metadata.gz: 69e38f7e11e4c39a32bfa5fc0f921c004128a2c283affa2dfe52b3fc12c326d4d32af6310aa9b364e4c6d0568f9c3cb71cf9162c5923738447250ff40dd6ad17
7
+ data.tar.gz: 1a4bf79c31e726474c4066e9b166562c81a84a02560f70f647e03f1bb41c988147837d65fac7238737493521643a75e9c75494932446faa16325ca923fb1b646
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ # 3.4.21 / 2023-10-17
2
+
3
+ ## Enhancements:
4
+
5
+ * Abort `setup.rb` if Ruby is too old. Pull request
6
+ [#7011](https://github.com/rubygems/rubygems/pull/7011) by
7
+ deivid-rodriguez
8
+ * Remove usage of Dir.chdir that only execute a subprocess. Pull request
9
+ [#6930](https://github.com/rubygems/rubygems/pull/6930) by segiddins
10
+ * Freeze more strings in generated gemspecs. Pull request
11
+ [#6974](https://github.com/rubygems/rubygems/pull/6974) by segiddins
12
+ * Use pure-ruby YAML parser for loading configuration at RubyGems. Pull
13
+ request [#6615](https://github.com/rubygems/rubygems/pull/6615) by hsbt
14
+ * Installs bundler 2.4.21 as a default gem.
15
+
16
+ ## Documentation:
17
+
18
+ * Update suggested variable for bindir. Pull request
19
+ [#7028](https://github.com/rubygems/rubygems/pull/7028) by hsbt
20
+ * Fix invalid links in documentation. Pull request
21
+ [#7008](https://github.com/rubygems/rubygems/pull/7008) by simi
22
+
1
23
  # 3.4.20 / 2023-09-27
2
24
 
3
25
  ## Enhancements:
data/Manifest.txt CHANGED
@@ -545,6 +545,7 @@ lib/rubygems/util/list.rb
545
545
  lib/rubygems/validator.rb
546
546
  lib/rubygems/version.rb
547
547
  lib/rubygems/version_option.rb
548
+ lib/rubygems/yaml_serializer.rb
548
549
  rubygems-update.gemspec
549
550
  setup.rb
550
551
  test/rubygems/alternate_cert.pem
data/bundler/CHANGELOG.md CHANGED
@@ -1,3 +1,35 @@
1
+ # 2.4.21 (October 17, 2023)
2
+
3
+ ## Enhancements:
4
+
5
+ - Avoid duplicates -rbundler/setup in RUBYOPT with Ruby preview [#7002](https://github.com/rubygems/rubygems/pull/7002)
6
+ - Prevent gem activation in standalone mode [#6925](https://github.com/rubygems/rubygems/pull/6925)
7
+ - Support Ruby's preview version format (Ex: 3.3.0-preview2) in Gemfile [#7016](https://github.com/rubygems/rubygems/pull/7016)
8
+ - Fix `bundle install` when older revisions of git source [#6980](https://github.com/rubygems/rubygems/pull/6980)
9
+ - Remove usage of Dir.chdir that only execute a subprocess [#6930](https://github.com/rubygems/rubygems/pull/6930)
10
+
11
+ ## Bug fixes:
12
+
13
+ - Don't delete the release version from pre-release string more than once [#7054](https://github.com/rubygems/rubygems/pull/7054)
14
+ - Make the `lock` command not be affected by the `frozen` setting [#7034](https://github.com/rubygems/rubygems/pull/7034)
15
+ - Raise an error when adding a gem incompatible with some locked platform [#7035](https://github.com/rubygems/rubygems/pull/7035)
16
+ - Re-resolve when lockfile is invalid [#7020](https://github.com/rubygems/rubygems/pull/7020)
17
+ - Don't re-resolve with prereleases if unlocked gem has no prereleases [#7021](https://github.com/rubygems/rubygems/pull/7021)
18
+ - Include gemspec in ExtensionTask for native gem tasks [#7015](https://github.com/rubygems/rubygems/pull/7015)
19
+ - Avoid error reporting relative path when validating frozen [#5128](https://github.com/rubygems/rubygems/pull/5128)
20
+ - Fix `bundle lock --minor --update <dep>` edge case [#6992](https://github.com/rubygems/rubygems/pull/6992)
21
+ - Stop bundler eagerly loading all specs with exts [#6945](https://github.com/rubygems/rubygems/pull/6945)
22
+
23
+ ## Performance:
24
+
25
+ - Reduce allocations when parsing lockfile [#6976](https://github.com/rubygems/rubygems/pull/6976)
26
+ - Stop allocating the same settings keys repeatedly [#6963](https://github.com/rubygems/rubygems/pull/6963)
27
+
28
+ ## Documentation:
29
+
30
+ - Improve formatting and global source information in `bundle plugin` man page [#7045](https://github.com/rubygems/rubygems/pull/7045)
31
+ - Update man page of `bundle exec` to reflect default true of flag `--keep-file-descriptors` [#7033](https://github.com/rubygems/rubygems/pull/7033)
32
+
1
33
  # 2.4.20 (September 27, 2023)
2
34
 
3
35
  ## Enhancements:
@@ -21,7 +53,6 @@
21
53
 
22
54
  - Lazily construct fetcher debug messages [#6973](https://github.com/rubygems/rubygems/pull/6973)
23
55
  - Avoid allocating empty hashes in Index [#6962](https://github.com/rubygems/rubygems/pull/6962)
24
- - Stop allocating the same settings keys repeatedly [#6963](https://github.com/rubygems/rubygems/pull/6963)
25
56
  - Improve `Bundler::Index` efficiency by removing unnecessary creation and dups [#6931](https://github.com/rubygems/rubygems/pull/6931)
26
57
  - (Further) Improve Bundler::Settings#[] performance and memory usage [#6923](https://github.com/rubygems/rubygems/pull/6923)
27
58
  - Don't use full indexes unnecessarily on legacy Gemfiles [#6916](https://github.com/rubygems/rubygems/pull/6916)
@@ -2182,7 +2213,7 @@ Changes
2182
2213
 
2183
2214
  - retry gem downloads ([#4846](https://github.com/rubygems/bundler/issues/4846), @jkeiser)
2184
2215
  - improve the CompactIndex to handle capitalized legacy gems ([#4867](https://github.com/rubygems/bundler/issues/4867), @segiddins)
2185
- - re-use persistent HTTP connections for CompactIndex (@NickLaMuro)
2216
+ - reuse persistent HTTP connections for CompactIndex (@NickLaMuro)
2186
2217
  - respect `required_ruby_version` when Gemfile contains `ruby` version (@indirect)
2187
2218
  - allow `rake release` to sign git tags ([#4743](https://github.com/rubygems/bundler/issues/4743), @eagletmt)
2188
2219
  - set process titles when using `#load` during `exec` (@yob)
@@ -3378,7 +3409,7 @@ Changes
3378
3409
  - `gem` option --test can generate rspec stubs (@MafcoCinco)
3379
3410
  - `gem` option --test can generate minitest stubs (@kcurtin)
3380
3411
  - `gem` command generates MIT license (@BrentWheeldon)
3381
- - gem rake task 'release' resuses existing tags (@shtirlic)
3412
+ - gem rake task 'release' reuses existing tags (@shtirlic)
3382
3413
 
3383
3414
  ## Bug fixes:
3384
3415
 
@@ -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-09-27".freeze
8
- @git_commit_sha = "de20c7e7b".freeze
7
+ @built_at = "2023-10-17".freeze
8
+ @git_commit_sha = "d10b46bd15".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"]
@@ -233,9 +233,7 @@ module Bundler
233
233
  end
234
234
 
235
235
  if use_git
236
- Dir.chdir(target) do
237
- `git add .`
238
- end
236
+ IO.popen(%w[git add .], { :chdir => target }, &:read)
239
237
  end
240
238
 
241
239
  # Open gemspec in editor
@@ -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
@@ -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
@@ -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
@@ -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
 
@@ -101,7 +101,7 @@ module Bundler
101
101
  next 1 if b_pre && !a_pre
102
102
  end
103
103
 
104
- if major?
104
+ if major? || locked_version.nil?
105
105
  a <=> b
106
106
  elsif either_version_older_than_locked?(a, b, locked_version)
107
107
  a <=> b
@@ -117,7 +117,7 @@ module Bundler
117
117
  end
118
118
 
119
119
  def either_version_older_than_locked?(a, b, locked_version)
120
- locked_version && (a.version < locked_version || b.version < locked_version)
120
+ a.version < locked_version || b.version < locked_version
121
121
  end
122
122
 
123
123
  def segments_do_not_match?(a, b, level)
@@ -86,7 +86,7 @@ module Bundler
86
86
  segments = version.segments
87
87
  seg_end_index = version >= Gem::Version.new("1.0") ? 1 : 2
88
88
 
89
- prerelease_suffix = version.to_s.gsub(version.release.to_s, "") if version.prerelease?
89
+ prerelease_suffix = version.to_s.delete_prefix(version.release.to_s) if version.prerelease?
90
90
  "#{version_prefix}#{segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
91
91
  end
92
92
 
@@ -91,38 +91,12 @@ module Bundler
91
91
  install_serially
92
92
  end
93
93
 
94
- check_for_unmet_dependencies
95
-
96
94
  handle_error if failed_specs.any?
97
95
  @specs
98
96
  ensure
99
97
  worker_pool&.stop
100
98
  end
101
99
 
102
- def check_for_unmet_dependencies
103
- unmet_dependencies = @specs.map do |s|
104
- [
105
- s,
106
- s.dependencies.reject {|dep| @specs.any? {|spec| dep.matches_spec?(spec.spec) } },
107
- ]
108
- end.reject {|a| a.last.empty? }
109
- return if unmet_dependencies.empty?
110
-
111
- warning = []
112
- warning << "Your lockfile doesn't include a valid resolution."
113
- warning << "You can fix this by regenerating your lockfile or manually editing the bad locked gems to a version that satisfies all dependencies."
114
- warning << "The unmet dependencies are:"
115
-
116
- unmet_dependencies.each do |spec, unmet_spec_dependencies|
117
- unmet_spec_dependencies.each do |unmet_spec_dependency|
118
- found = @specs.find {|s| s.name == unmet_spec_dependency.name && !unmet_spec_dependency.matches_spec?(s.spec) }
119
- warning << "* #{unmet_spec_dependency}, dependency of #{spec.full_name}, unsatisfied by #{found.full_name}"
120
- end
121
- end
122
-
123
- Bundler.ui.warn(warning.join("\n"))
124
- end
125
-
126
100
  private
127
101
 
128
102
  def failed_specs
@@ -12,6 +12,7 @@ module Bundler
12
12
  end
13
13
  File.open File.join(bundler_path, "setup.rb"), "w" do |file|
14
14
  file.puts "require 'rbconfig'"
15
+ file.puts prevent_gem_activation
15
16
  file.puts define_path_helpers
16
17
  file.puts reverse_rubygems_kernel_mixin
17
18
  paths.each do |path|
@@ -55,18 +56,24 @@ module Bundler
55
56
  if spec.source.instance_of?(Source::Path) && spec.source.path.absolute?
56
57
  full_path
57
58
  else
58
- relative_path_from(Bundler.root.join(bundler_path), :to => full_path) || full_path
59
+ SharedHelpers.relative_path_to(full_path, :from => Bundler.root.join(bundler_path))
59
60
  end
60
61
  rescue TypeError
61
62
  error_message = "#{spec.name} #{spec.version} has an invalid gemspec"
62
63
  raise Gem::InvalidSpecificationException.new(error_message)
63
64
  end
64
65
 
65
- def relative_path_from(source, to:)
66
- Pathname.new(to).relative_path_from(source).to_s
67
- rescue ArgumentError
68
- # on Windows, if source and destination are on different drivers, there's no relative path from one to the other
69
- nil
66
+ def prevent_gem_activation
67
+ <<~'END'
68
+ module Kernel
69
+ remove_method(:gem) if private_method_defined?(:gem)
70
+
71
+ def gem(*)
72
+ end
73
+
74
+ private :gem
75
+ end
76
+ END
70
77
  end
71
78
 
72
79
  def define_path_helpers
@@ -23,13 +23,15 @@ module Bundler
23
23
  Gem::Version.create("1.13") => [PLUGIN].freeze,
24
24
  }.freeze
25
25
 
26
- KNOWN_SECTIONS = SECTIONS_BY_VERSION_INTRODUCED.values.flatten.freeze
26
+ KNOWN_SECTIONS = SECTIONS_BY_VERSION_INTRODUCED.values.flatten!.freeze
27
27
 
28
28
  ENVIRONMENT_VERSION_SECTIONS = [BUNDLED, RUBY].freeze
29
29
  deprecate_constant(:ENVIRONMENT_VERSION_SECTIONS)
30
30
 
31
31
  def self.sections_in_lockfile(lockfile_contents)
32
- lockfile_contents.scan(/^\w[\w ]*$/).uniq
32
+ sections = lockfile_contents.scan(/^\w[\w ]*$/)
33
+ sections.uniq!
34
+ sections
33
35
  end
34
36
 
35
37
  def self.unknown_sections_in_lockfile(lockfile_contents)
@@ -38,7 +40,7 @@ module Bundler
38
40
 
39
41
  def self.sections_to_ignore(base_version = nil)
40
42
  base_version &&= base_version.release
41
- base_version ||= Gem::Version.create("1.0".dup)
43
+ base_version ||= Gem::Version.create("1.0")
42
44
  attributes = []
43
45
  SECTIONS_BY_VERSION_INTRODUCED.each do |version, introduced|
44
46
  next if version <= base_version
@@ -61,36 +63,36 @@ module Bundler
61
63
  @platforms = []
62
64
  @sources = []
63
65
  @dependencies = {}
64
- @state = nil
66
+ @parse_method = nil
65
67
  @specs = {}
66
68
 
67
69
  if lockfile.match?(/<<<<<<<|=======|>>>>>>>|\|\|\|\|\|\|\|/)
68
- raise LockfileError, "Your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} contains merge conflicts.\n" \
69
- "Run `git checkout HEAD -- #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` first to get a clean lock."
70
+ raise LockfileError, "Your lockfile contains merge conflicts.\n" \
71
+ "Run `git checkout HEAD -- #{SharedHelpers.relative_lockfile_path}` first to get a clean lock."
70
72
  end
71
73
 
72
- lockfile.split(/(?:\r?\n)+/).each do |line|
74
+ lockfile.split(/(?:\r?\n)+/) do |line|
73
75
  if SOURCE.include?(line)
74
- @state = :source
76
+ @parse_method = :parse_source
75
77
  parse_source(line)
76
78
  elsif line == DEPENDENCIES
77
- @state = :dependency
79
+ @parse_method = :parse_dependency
78
80
  elsif line == PLATFORMS
79
- @state = :platform
81
+ @parse_method = :parse_platform
80
82
  elsif line == RUBY
81
- @state = :ruby
83
+ @parse_method = :parse_ruby
82
84
  elsif line == BUNDLED
83
- @state = :bundled_with
85
+ @parse_method = :parse_bundled_with
84
86
  elsif /^[^\s]/.match?(line)
85
- @state = nil
86
- elsif @state
87
- send("parse_#{@state}", line)
87
+ @parse_method = nil
88
+ elsif @parse_method
89
+ send(@parse_method, line)
88
90
  end
89
91
  end
90
- @specs = @specs.values.sort_by(&:full_name)
92
+ @specs = @specs.values.sort_by!(&:full_name)
91
93
  rescue ArgumentError => e
92
94
  Bundler.ui.debug(e)
93
- raise LockfileError, "Your lockfile is unreadable. Run `rm #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` " \
95
+ raise LockfileError, "Your lockfile is unreadable. Run `rm #{SharedHelpers.relative_lockfile_path}` " \
94
96
  "and then `bundle install` to generate a new lockfile."
95
97
  end
96
98
 
@@ -149,11 +151,11 @@ module Bundler
149
151
  return unless line =~ NAME_VERSION
150
152
  spaces = $1
151
153
  return unless spaces.size == 2
152
- name = $2
154
+ name = -$2
153
155
  version = $3
154
156
  pinned = $5
155
157
 
156
- version = version.split(",").map(&:strip) if version
158
+ version = version.split(",").each(&:strip!) if version
157
159
 
158
160
  dep = Bundler::Dependency.new(name, version)
159
161
 
@@ -177,11 +179,13 @@ module Bundler
177
179
  def parse_spec(line)
178
180
  return unless line =~ NAME_VERSION
179
181
  spaces = $1
180
- name = $2
182
+ name = -$2
181
183
  version = $3
182
- platform = $4
183
184
 
184
185
  if spaces.size == 4
186
+ # only load platform for non-dependency (spec) line
187
+ platform = $4
188
+
185
189
  version = Gem::Version.new(version)
186
190
  platform = platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY
187
191
  @current_spec = LazySpecification.new(name, version, platform)
@@ -190,7 +194,7 @@ module Bundler
190
194
 
191
195
  @specs[@current_spec.full_name] = @current_spec
192
196
  elsif spaces.size == 6
193
- version = version.split(",").map(&:strip) if version
197
+ version = version.split(",").each(&:strip!) if version
194
198
  dep = Gem::Dependency.new(name, version)
195
199
  @current_spec.dependencies << dep
196
200
  end
@@ -201,13 +205,14 @@ module Bundler
201
205
  end
202
206
 
203
207
  def parse_bundled_with(line)
204
- line = line.strip
208
+ line.strip!
205
209
  return unless Gem::Version.correct?(line)
206
210
  @bundler_version = Gem::Version.create(line)
207
211
  end
208
212
 
209
213
  def parse_ruby(line)
210
- @ruby_version = line.strip
214
+ line.strip!
215
+ @ruby_version = line
211
216
  end
212
217
  end
213
218
  end