bundler 2.2.32 → 2.3.2

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 (106) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -0
  3. data/exe/bundle +7 -8
  4. data/lib/bundler/.document +1 -0
  5. data/lib/bundler/build_metadata.rb +2 -2
  6. data/lib/bundler/cli/doctor.rb +3 -2
  7. data/lib/bundler/cli/gem.rb +2 -1
  8. data/lib/bundler/cli/info.rb +6 -1
  9. data/lib/bundler/cli/install.rb +2 -0
  10. data/lib/bundler/cli/update.rb +2 -2
  11. data/lib/bundler/cli.rb +6 -0
  12. data/lib/bundler/compact_index_client/updater.rb +0 -5
  13. data/lib/bundler/definition.rb +29 -53
  14. data/lib/bundler/dependency.rb +5 -7
  15. data/lib/bundler/dsl.rb +18 -30
  16. data/lib/bundler/endpoint_specification.rb +0 -8
  17. data/lib/bundler/environment_preserver.rb +4 -1
  18. data/lib/bundler/fetcher/compact_index.rb +9 -4
  19. data/lib/bundler/fetcher.rb +2 -5
  20. data/lib/bundler/injector.rb +10 -1
  21. data/lib/bundler/installer/gem_installer.rb +1 -6
  22. data/lib/bundler/installer.rb +1 -4
  23. data/lib/bundler/lazy_specification.rb +17 -1
  24. data/lib/bundler/lockfile_parser.rb +10 -13
  25. data/lib/bundler/man/bundle-add.1 +10 -2
  26. data/lib/bundler/man/bundle-add.1.ronn +7 -1
  27. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  28. data/lib/bundler/man/bundle-cache.1 +1 -1
  29. data/lib/bundler/man/bundle-check.1 +1 -1
  30. data/lib/bundler/man/bundle-clean.1 +1 -1
  31. data/lib/bundler/man/bundle-config.1 +3 -3
  32. data/lib/bundler/man/bundle-config.1.ronn +3 -3
  33. data/lib/bundler/man/bundle-doctor.1 +1 -1
  34. data/lib/bundler/man/bundle-exec.1 +1 -1
  35. data/lib/bundler/man/bundle-gem.1 +1 -1
  36. data/lib/bundler/man/bundle-info.1 +1 -1
  37. data/lib/bundler/man/bundle-init.1 +1 -1
  38. data/lib/bundler/man/bundle-inject.1 +1 -1
  39. data/lib/bundler/man/bundle-install.1 +2 -2
  40. data/lib/bundler/man/bundle-install.1.ronn +2 -2
  41. data/lib/bundler/man/bundle-list.1 +1 -1
  42. data/lib/bundler/man/bundle-lock.1 +1 -1
  43. data/lib/bundler/man/bundle-open.1 +1 -1
  44. data/lib/bundler/man/bundle-outdated.1 +1 -1
  45. data/lib/bundler/man/bundle-platform.1 +1 -1
  46. data/lib/bundler/man/bundle-pristine.1 +1 -1
  47. data/lib/bundler/man/bundle-remove.1 +1 -1
  48. data/lib/bundler/man/bundle-show.1 +1 -1
  49. data/lib/bundler/man/bundle-update.1 +2 -2
  50. data/lib/bundler/man/bundle-update.1.ronn +2 -1
  51. data/lib/bundler/man/bundle-viz.1 +1 -1
  52. data/lib/bundler/man/bundle.1 +1 -1
  53. data/lib/bundler/man/gemfile.5 +28 -2
  54. data/lib/bundler/man/gemfile.5.ronn +9 -1
  55. data/lib/bundler/plugin/api/source.rb +1 -0
  56. data/lib/bundler/plugin/installer.rb +1 -1
  57. data/lib/bundler/process_lock.rb +1 -1
  58. data/lib/bundler/psyched_yaml.rb +1 -13
  59. data/lib/bundler/resolver.rb +34 -31
  60. data/lib/bundler/rubygems_ext.rb +2 -0
  61. data/lib/bundler/rubygems_gem_installer.rb +1 -1
  62. data/lib/bundler/rubygems_integration.rb +11 -48
  63. data/lib/bundler/self_manager.rb +76 -0
  64. data/lib/bundler/shared_helpers.rb +4 -12
  65. data/lib/bundler/source/git/git_proxy.rb +2 -2
  66. data/lib/bundler/source/metadata.rb +1 -1
  67. data/lib/bundler/source/rubygems.rb +16 -12
  68. data/lib/bundler/source/rubygems_aggregate.rb +1 -1
  69. data/lib/bundler/source.rb +1 -1
  70. data/lib/bundler/source_list.rb +7 -29
  71. data/lib/bundler/templates/Executable.bundler +1 -1
  72. data/lib/bundler/templates/Gemfile +0 -2
  73. data/lib/bundler/templates/gems.rb +0 -3
  74. data/lib/bundler/templates/newgem/Rakefile.tt +10 -1
  75. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +2 -2
  76. data/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  77. data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  78. data/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
  79. data/lib/bundler/ui/shell.rb +1 -1
  80. data/lib/bundler/vendor/.document +1 -0
  81. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +6 -6
  82. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +5 -3
  83. data/lib/bundler/vendor/thor/lib/thor/actions.rb +6 -2
  84. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +6 -0
  85. data/lib/bundler/vendor/thor/lib/thor/error.rb +9 -4
  86. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +19 -1
  87. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +22 -4
  88. data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  89. data/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
  90. data/lib/bundler/vendor/uri/lib/uri/common.rb +17 -80
  91. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -1
  92. data/lib/bundler/vendor/uri/lib/uri/generic.rb +5 -6
  93. data/lib/bundler/vendor/uri/lib/uri/http.rb +0 -1
  94. data/lib/bundler/vendor/uri/lib/uri/https.rb +0 -1
  95. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  96. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -1
  97. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +1 -14
  98. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +1 -12
  99. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  100. data/lib/bundler/vendor/uri/lib/uri/ws.rb +84 -0
  101. data/lib/bundler/vendor/uri/lib/uri/wss.rb +22 -0
  102. data/lib/bundler/vendor/uri/lib/uri.rb +0 -1
  103. data/lib/bundler/version.rb +1 -1
  104. data/lib/bundler.rb +9 -3
  105. metadata +10 -5
  106. data/lib/bundler/gemdeps.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71d34e0696d7d7121b9bf4db66aca17c0e0b115a1099fa8879e509784ee62e4d
4
- data.tar.gz: 0a68018b980b5e28358609b632a3b5bbf738ec2fd664aa34c4cc7c3d3ff207ec
3
+ metadata.gz: b01d3406cc29cfbbd031854220cc941849c39690b72aefedaa9a16afd288f3b9
4
+ data.tar.gz: 16dc9a02e52d5e1ea558fd6896f8e15073dcc580550e4ba53ae0fca62fcc32c1
5
5
  SHA512:
6
- metadata.gz: 2f0bc7ca02e4e2972c004cd40f4fb01c23ba52fdd8d0420733e2d4d0fe2afcc0a706f4985720c5ab8c9828821329f3e2b11328a2b61fe749833c1e8ba0d3edc7
7
- data.tar.gz: 39220087ca48d38cb1980593607946da010cdf74e3a039e493d848c46eff798539aec4267e95e9d03807e143cc7cfcaa29a36f5118bb6e09bbc60b00fa77fe03
6
+ metadata.gz: e1a3df279ba3c7e8bb7ae61b33ded9b8b860f24cc4e999a7eeb6fed136ba8c21961ebc6cd1b66f6b8fb258d02c44e50682c3bf8486d00ac73f6d0a58744985cf
7
+ data.tar.gz: 620e60cba4783cca36f9d446a3df424696139c2d89181d303486e9d9bca0bf28c080ae94ddb6138e42316437fc8ff6a1da28cb1dd47f47cab6f02c97a924dfa7
data/CHANGELOG.md CHANGED
@@ -1,3 +1,73 @@
1
+ # 2.3.2 (December 23, 2021)
2
+
3
+ ## Enhancements:
4
+
5
+ - Remove unnecessary lockfile upgrade warning [#5209](https://github.com/rubygems/rubygems/pull/5209)
6
+
7
+ # 2.3.1 (December 22, 2021)
8
+
9
+ ## Enhancements:
10
+
11
+ - Vendor latest `thor` with fixes for latest `did_you_mean` deprecations [#5202](https://github.com/rubygems/rubygems/pull/5202)
12
+ - Avoid unnecessary `shellwords` require on newer rubygems [#5195](https://github.com/rubygems/rubygems/pull/5195)
13
+ - Re-exec prepending command with `Gem.ruby` if `$PROGRAM_NAME` is not executable [#5193](https://github.com/rubygems/rubygems/pull/5193)
14
+
15
+ # 2.3.0 (December 21, 2021)
16
+
17
+ ## Features:
18
+
19
+ - Change `bundle install` with a lockfile to respect the `BUNDLED WITH` bundler version [#4076](https://github.com/rubygems/rubygems/pull/4076)
20
+
21
+ ## Enhancements:
22
+
23
+ - Print warning when running Bundler on potentially problematic RubyGems & Ruby combinations [#5177](https://github.com/rubygems/rubygems/pull/5177)
24
+ - Error tracing should be printed to stderr [#5179](https://github.com/rubygems/rubygems/pull/5179)
25
+ - Add `github` and `ref` options to `bundle add` [#5159](https://github.com/rubygems/rubygems/pull/5159)
26
+ - Add require parameter to `bundle add` [#5021](https://github.com/rubygems/rubygems/pull/5021)
27
+ - Enable parallel installation on Windows by default [#4822](https://github.com/rubygems/rubygems/pull/4822)
28
+ - More logging when compact index is not used and we fallback to other APIs [#4546](https://github.com/rubygems/rubygems/pull/4546)
29
+ - `bundle gem` generated MiniTest file and class now start with 'test' [#3893](https://github.com/rubygems/rubygems/pull/3893)
30
+ - Add `Bundler::Definition.no_lock` accessor for skipping lock file creation/update [#3401](https://github.com/rubygems/rubygems/pull/3401)
31
+
32
+ ## Bug fixes:
33
+
34
+ - Fix crash when when no platform specific matches exist and show a proper error [#5168](https://github.com/rubygems/rubygems/pull/5168)
35
+ - Ignore dependencies not actually locked from frozen check [#5152](https://github.com/rubygems/rubygems/pull/5152)
36
+ - Fix `bundle cache --all-platforms` on Windows [#4552](https://github.com/rubygems/rubygems/pull/4552)
37
+
38
+ ## Documentation:
39
+
40
+ - Fix gemspec template typo [#4545](https://github.com/rubygems/rubygems/pull/4545)
41
+
42
+ # 2.2.33 (December 7, 2021)
43
+
44
+ ## Security fixes:
45
+
46
+ - Pass "--" to git commands to separate positional and optional args [#5142](https://github.com/rubygems/rubygems/pull/5142)
47
+
48
+ ## Enhancements:
49
+
50
+ - Accept pull request URLs as github source [#5126](https://github.com/rubygems/rubygems/pull/5126)
51
+ - Add `--version` parameter to `bundle info` command [#5137](https://github.com/rubygems/rubygems/pull/5137)
52
+ - Let original `Errno::EACCES` error be raised in compact index updater [#5110](https://github.com/rubygems/rubygems/pull/5110)
53
+ - Improve gemfile-lockfile source equivalence errors [#5120](https://github.com/rubygems/rubygems/pull/5120)
54
+ - Avoid float-to-string loss of characters in GitHub Actions configuration labels in new gem template [#5089](https://github.com/rubygems/rubygems/pull/5089)
55
+ - Add an initial rbs template to `bundle gem` skeleton [#5041](https://github.com/rubygems/rubygems/pull/5041)
56
+ - Avoid shared libraries not getting environment passed right after argv in memory when `bundle exec` is used [#4815](https://github.com/rubygems/rubygems/pull/4815)
57
+
58
+ ## Bug fixes:
59
+
60
+ - Don't cleanup paths from gems already activated from `$LOAD_PATH` [#5111](https://github.com/rubygems/rubygems/pull/5111)
61
+ - Fix handling prereleases of 0 versions, like 0.0.0.dev or 0.0.0.SNAPSHOT [#5116](https://github.com/rubygems/rubygems/pull/5116)
62
+ - Fix escape of filenames in `bundle doctor` [#5102](https://github.com/rubygems/rubygems/pull/5102)
63
+ - Don't unlock dependencies when running `bundle install` after changing global source [#5090](https://github.com/rubygems/rubygems/pull/5090)
64
+ - Fix missing locked specs when depended on another platform [#5092](https://github.com/rubygems/rubygems/pull/5092)
65
+ - Fix `bundle info` sometimes claiming that bundler has been deleted [#5097](https://github.com/rubygems/rubygems/pull/5097)
66
+
67
+ ## Documentation:
68
+
69
+ - Ignore to generate the documentation from vendored libraries [#5118](https://github.com/rubygems/rubygems/pull/5118)
70
+
1
71
  # 2.2.32 (November 23, 2021)
2
72
 
3
73
  ## Enhancements:
data/exe/bundle CHANGED
@@ -18,14 +18,13 @@ end
18
18
  # Workaround for non-activated bundler spec due to missing https://github.com/rubygems/rubygems/commit/4e306d7bcdee924b8d80ca9db6125aa59ee4e5a3
19
19
  gem "bundler", Bundler::VERSION if Gem.rubygems_version < Gem::Version.new("2.6.2")
20
20
 
21
- # Check if an older version of bundler is installed
22
- $LOAD_PATH.each do |path|
23
- next unless path =~ %r{/bundler-0\.(\d+)} && $1.to_i < 9
24
- err = String.new
25
- err << "Looks like you have a version of bundler that's older than 0.9.\n"
26
- err << "Please remove your old versions.\n"
27
- err << "An easy way to do this is by running `gem cleanup bundler`."
28
- abort(err)
21
+ if Gem.rubygems_version < Gem::Version.new("3.2.3") && Gem.ruby_version < Gem::Version.new("2.6.a") && !ENV["BUNDLER_NO_OLD_RUBYGEMS_WARNING"]
22
+ Bundler.ui.warn \
23
+ "Your RubyGems version (#{Gem::VERSION})) has a bug that prevents " \
24
+ "`required_ruby_version` from working for Bundler. Any scripts that use " \
25
+ "`gem install bundler` will break as soon as Bundler drops support for " \
26
+ "your Ruby version. Please upgrade RubyGems to avoid future breakage " \
27
+ "and silence this warning by running `gem update --system 3.2.3`"
29
28
  end
30
29
 
31
30
  if File.exist?(base_path)
@@ -0,0 +1 @@
1
+ # not in RDoc
@@ -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 = "2021-11-23".freeze
8
- @git_commit_sha = "20d4957649".freeze
7
+ @built_at = "2021-12-24".freeze
8
+ @git_commit_sha = "c3c71e7434".freeze
9
9
  @release = true
10
10
  # end ivars
11
11
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rbconfig"
4
+ require "shellwords"
4
5
 
5
6
  module Bundler
6
7
  class CLI::Doctor
@@ -22,14 +23,14 @@ module Bundler
22
23
  end
23
24
 
24
25
  def dylibs_darwin(path)
25
- output = `/usr/bin/otool -L "#{path}"`.chomp
26
+ output = `/usr/bin/otool -L #{path.shellescape}`.chomp
26
27
  dylibs = output.split("\n")[1..-1].map {|l| l.match(DARWIN_REGEX).captures[0] }.uniq
27
28
  # ignore @rpath and friends
28
29
  dylibs.reject {|dylib| dylib.start_with? "@" }
29
30
  end
30
31
 
31
32
  def dylibs_ldd(path)
32
- output = `/usr/bin/ldd "#{path}"`.chomp
33
+ output = `/usr/bin/ldd #{path.shellescape}`.chomp
33
34
  output.split("\n").map do |l|
34
35
  match = l.match(LDD_REGEX)
35
36
  next if match.nil?
@@ -76,6 +76,7 @@ module Bundler
76
76
  "#{Bundler.preferred_gemfile_name}.tt" => Bundler.preferred_gemfile_name,
77
77
  "lib/newgem.rb.tt" => "lib/#{namespaced_path}.rb",
78
78
  "lib/newgem/version.rb.tt" => "lib/#{namespaced_path}/version.rb",
79
+ "sig/newgem.rbs.tt" => "sig/#{namespaced_path}.rbs",
79
80
  "newgem.gemspec.tt" => "#{name}.gemspec",
80
81
  "Rakefile.tt" => "Rakefile",
81
82
  "README.md.tt" => "README.md",
@@ -105,7 +106,7 @@ module Bundler
105
106
  when "minitest"
106
107
  templates.merge!(
107
108
  "test/minitest/test_helper.rb.tt" => "test/test_helper.rb",
108
- "test/minitest/newgem_test.rb.tt" => "test/#{namespaced_path}_test.rb"
109
+ "test/minitest/test_newgem.rb.tt" => "test/test_#{namespaced_path}.rb"
109
110
  )
110
111
  config[:test_task] = :test
111
112
  when "test-unit"
@@ -18,6 +18,7 @@ module Bundler
18
18
 
19
19
  if spec
20
20
  return print_gem_path(spec) if @options[:path]
21
+ return print_gem_version(spec) if @options[:version]
21
22
  print_gem_info(spec)
22
23
  end
23
24
  end
@@ -39,6 +40,10 @@ module Bundler
39
40
  raise GemNotFound, Bundler::CLI::Common.gem_not_found_message(gem_name, Bundler.definition.dependencies)
40
41
  end
41
42
 
43
+ def print_gem_version(spec)
44
+ Bundler.ui.info spec.version.to_s
45
+ end
46
+
42
47
  def print_gem_path(spec)
43
48
  name = spec.name
44
49
  if name == "bundler"
@@ -70,7 +75,7 @@ module Bundler
70
75
  gem_info << "\tPath: #{spec.full_gem_path}\n"
71
76
  gem_info << "\tDefault Gem: yes" if spec.respond_to?(:default_gem?) && spec.default_gem?
72
77
 
73
- if spec.deleted_gem?
78
+ if name != "bundler" && spec.deleted_gem?
74
79
  return Bundler.ui.warn "The gem #{name} has been deleted. Gemspec information is still available though:\n#{gem_info}"
75
80
  end
76
81
 
@@ -12,6 +12,8 @@ module Bundler
12
12
 
13
13
  warn_if_root
14
14
 
15
+ Bundler.self_manager.install_locked_bundler_and_restart_with_it_if_needed
16
+
15
17
  Bundler::SharedHelpers.set_env "RB_USER_INSTALL", "1" if Bundler::FREEBSD
16
18
 
17
19
  # Disable color in deployment mode
@@ -66,7 +66,7 @@ module Bundler
66
66
 
67
67
  if locked_gems = Bundler.definition.locked_gems
68
68
  previous_locked_info = locked_gems.specs.reduce({}) do |h, s|
69
- h[s.name] = { :spec => s, :version => s.version, :source => s.source.to_s }
69
+ h[s.name] = { :spec => s, :version => s.version, :source => s.source.identifier }
70
70
  h
71
71
  end
72
72
  end
@@ -95,7 +95,7 @@ module Bundler
95
95
  end
96
96
 
97
97
  locked_source = locked_info[:source]
98
- new_source = new_spec.source.to_s
98
+ new_source = new_spec.source.identifier
99
99
  next if locked_source != new_source
100
100
 
101
101
  new_version = new_spec.version
data/lib/bundler/cli.rb CHANGED
@@ -61,6 +61,8 @@ module Bundler
61
61
  Bundler.reset_settings_and_root!
62
62
  end
63
63
 
64
+ Bundler.self_manager.restart_with_locked_bundler_if_needed
65
+
64
66
  Bundler.settings.set_command_option_if_given :retry, options[:retry]
65
67
 
66
68
  current_cmd = args.last[:current_command].name
@@ -331,6 +333,7 @@ module Bundler
331
333
 
332
334
  desc "info GEM [OPTIONS]", "Show information for the given gem"
333
335
  method_option "path", :type => :boolean, :banner => "Print full path to gem"
336
+ method_option "version", :type => :boolean, :banner => "Print gem version"
334
337
  def info(gem_name)
335
338
  require_relative "cli/info"
336
339
  Info.new(options, gem_name).run
@@ -366,8 +369,11 @@ module Bundler
366
369
  method_option "version", :aliases => "-v", :type => :string
367
370
  method_option "group", :aliases => "-g", :type => :string
368
371
  method_option "source", :aliases => "-s", :type => :string
372
+ method_option "require", :aliases => "-r", :type => :string, :banner => "Adds require path to gem. Provide false, or a path as a string."
369
373
  method_option "git", :type => :string
374
+ method_option "github", :type => :string
370
375
  method_option "branch", :type => :string
376
+ method_option "ref", :type => :string
371
377
  method_option "skip-install", :type => :boolean, :banner =>
372
378
  "Adds gem to the Gemfile but does not install it"
373
379
  method_option "optimistic", :type => :boolean, :banner => "Adds optimistic declaration of version to gem"
@@ -76,11 +76,6 @@ module Bundler
76
76
 
77
77
  update(local_path, remote_path, :retrying)
78
78
  end
79
- rescue Errno::EACCES
80
- raise Bundler::PermissionError,
81
- "Bundler does not have write access to create a temp directory " \
82
- "within #{Dir.tmpdir}. Bundler must have write access to your " \
83
- "systems temp directory to function properly. "
84
79
  rescue Zlib::GzipFile::Error
85
80
  raise Bundler::HTTPError
86
81
  end
@@ -6,6 +6,11 @@ module Bundler
6
6
  class Definition
7
7
  include GemHelpers
8
8
 
9
+ class << self
10
+ # Do not create or modify a lockfile (Makes #lock a noop)
11
+ attr_accessor :no_lock
12
+ end
13
+
9
14
  attr_reader(
10
15
  :dependencies,
11
16
  :locked_deps,
@@ -158,10 +163,6 @@ module Bundler
158
163
  end
159
164
  end
160
165
 
161
- def multisource_allowed?
162
- @multisource_allowed
163
- end
164
-
165
166
  def resolve_only_locally!
166
167
  @remote = false
167
168
  sources.local_only!
@@ -279,6 +280,8 @@ module Bundler
279
280
  end
280
281
 
281
282
  def lock(file, preserve_unknown_sections = false)
283
+ return if Definition.no_lock
284
+
282
285
  contents = to_lock
283
286
 
284
287
  # Convert to \r\n if the existing lock has them
@@ -289,10 +292,7 @@ module Bundler
289
292
  locked_major = @locked_bundler_version.segments.first
290
293
  current_major = Gem::Version.create(Bundler::VERSION).segments.first
291
294
 
292
- if updating_major = locked_major < current_major
293
- Bundler.ui.warn "Warning: the lockfile is being updated to Bundler #{current_major}, " \
294
- "after which you will be unable to return to Bundler #{@locked_bundler_version.segments.first}."
295
- end
295
+ updating_major = locked_major < current_major
296
296
  end
297
297
 
298
298
  preserve_unknown_sections ||= !updating_major && (Bundler.frozen_bundle? || !(unlocking? || @unlocking_bundler))
@@ -368,44 +368,31 @@ module Bundler
368
368
  added.concat new_platforms.map {|p| "* platform: #{p}" }
369
369
  deleted.concat deleted_platforms.map {|p| "* platform: #{p}" }
370
370
 
371
- gemfile_sources = sources.lock_sources
372
-
373
- new_sources = gemfile_sources - @locked_sources
374
- deleted_sources = @locked_sources - gemfile_sources
375
-
376
371
  new_deps = @dependencies - locked_dependencies
377
372
  deleted_deps = locked_dependencies - @dependencies
378
373
 
379
- # Check if it is possible that the source is only changed thing
380
- if (new_deps.empty? && deleted_deps.empty?) && (!new_sources.empty? && !deleted_sources.empty?)
381
- new_sources.reject! {|source| (source.path? && source.path.exist?) || equivalent_rubygems_remotes?(source) }
382
- deleted_sources.reject! {|source| (source.path? && source.path.exist?) || equivalent_rubygems_remotes?(source) }
383
- end
374
+ added.concat new_deps.map {|d| "* #{pretty_dep(d)}" } if new_deps.any?
375
+ deleted.concat deleted_deps.map {|d| "* #{pretty_dep(d)}" } if deleted_deps.any?
384
376
 
385
- if @locked_sources != gemfile_sources
386
- if new_sources.any?
387
- added.concat new_sources.map {|source| "* source: #{source}" }
388
- end
377
+ both_sources = Hash.new {|h, k| h[k] = [] }
378
+ @dependencies.each {|d| both_sources[d.name][0] = d }
389
379
 
390
- if deleted_sources.any?
391
- deleted.concat deleted_sources.map {|source| "* source: #{source}" }
392
- end
393
- end
380
+ locked_dependencies.each do |d|
381
+ next if !Bundler.feature_flag.bundler_3_mode? && @locked_specs[d.name].empty?
394
382
 
395
- added.concat new_deps.map {|d| "* #{pretty_dep(d)}" } if new_deps.any?
396
- if deleted_deps.any?
397
- deleted.concat deleted_deps.map {|d| "* #{pretty_dep(d)}" }
383
+ both_sources[d.name][1] = d
398
384
  end
399
385
 
400
- both_sources = Hash.new {|h, k| h[k] = [] }
401
- @dependencies.each {|d| both_sources[d.name][0] = d }
402
- @locked_deps.each {|name, d| both_sources[name][1] = d.source }
386
+ both_sources.each do |name, (dep, lock_dep)|
387
+ next if dep.nil? || lock_dep.nil?
388
+
389
+ gemfile_source = dep.source || sources.default_source
390
+ lock_source = lock_dep.source || sources.default_source
391
+ next if lock_source.include?(gemfile_source)
403
392
 
404
- both_sources.each do |name, (dep, lock_source)|
405
- next if lock_source.nil? || (dep && lock_source.can_lock?(dep))
406
- gemfile_source_name = (dep && dep.source) || "no specified source"
407
- lockfile_source_name = lock_source
408
- changed << "* #{name} from `#{gemfile_source_name}` to `#{lockfile_source_name}`"
393
+ gemfile_source_name = dep.source ? gemfile_source.identifier : "no specified source"
394
+ lockfile_source_name = lock_dep.source ? lock_source.identifier : "no specified source"
395
+ changed << "* #{name} from `#{lockfile_source_name}` to `#{gemfile_source_name}`"
409
396
  end
410
397
 
411
398
  reason = change_reason
@@ -649,15 +636,13 @@ module Bundler
649
636
  end
650
637
 
651
638
  def converge_dependencies
652
- (@dependencies + locked_dependencies).each do |dep|
639
+ changes = false
640
+
641
+ @dependencies.each do |dep|
653
642
  if dep.source
654
643
  dep.source = sources.get(dep.source)
655
644
  end
656
- end
657
-
658
- changes = false
659
645
 
660
- @dependencies.each do |dep|
661
646
  unless locked_dep = @locked_deps[dep.name]
662
647
  changes = true
663
648
  next
@@ -711,11 +696,8 @@ module Bundler
711
696
  deps << dep
712
697
  end
713
698
 
714
- s.source = (dep && dep.source) || sources.get(s.source) unless multisource_allowed?
699
+ s.source = (dep && dep.source) || sources.get(s.source) || sources.default_source unless Bundler.frozen_bundle?
715
700
 
716
- # Don't add a spec to the list if its source is expired. For example,
717
- # if you change a Git gem to RubyGems.
718
- next if s.source.nil?
719
701
  next if @unlock[:sources].include?(s.source.name)
720
702
 
721
703
  # If the spec is from a path source and it doesn't exist anymore
@@ -744,7 +726,7 @@ module Bundler
744
726
  s.dependencies.replace(new_spec.dependencies)
745
727
  end
746
728
 
747
- if dep.nil? && @dependencies.find {|d| s.name == d.name }
729
+ if dep.nil? && requested_dependencies.find {|d| s.name == d.name }
748
730
  @unlock[:gems] << s.name
749
731
  else
750
732
  converged << s
@@ -852,12 +834,6 @@ module Bundler
852
834
  end
853
835
  end
854
836
 
855
- def equivalent_rubygems_remotes?(source)
856
- return false unless source.is_a?(Source::Rubygems)
857
-
858
- Bundler.settings[:allow_deployment_source_credential_changes] && source.equivalent_remotes?(sources.rubygems_remotes)
859
- end
860
-
861
837
  def source_map
862
838
  @source_map ||= SourceMap.new(sources, dependencies)
863
839
  end
@@ -7,7 +7,7 @@ require_relative "rubygems_ext"
7
7
  module Bundler
8
8
  class Dependency < Gem::Dependency
9
9
  attr_reader :autorequire
10
- attr_reader :groups, :platforms, :gemfile, :git, :branch
10
+ attr_reader :groups, :platforms, :gemfile, :git, :github, :branch, :ref
11
11
 
12
12
  PLATFORM_MAP = {
13
13
  :ruby => Gem::Platform::RUBY,
@@ -82,7 +82,9 @@ module Bundler
82
82
  @groups = Array(options["group"] || :default).map(&:to_sym)
83
83
  @source = options["source"]
84
84
  @git = options["git"]
85
+ @github = options["github"]
85
86
  @branch = options["branch"]
87
+ @ref = options["ref"]
86
88
  @platforms = Array(options["platforms"])
87
89
  @env = options["env"]
88
90
  @should_include = options.fetch("should_include", true)
@@ -96,15 +98,11 @@ module Bundler
96
98
  def gem_platforms(valid_platforms)
97
99
  return valid_platforms if @platforms.empty?
98
100
 
99
- valid_generic_platforms = valid_platforms.map {|p| [p, GemHelpers.generic(p)] }.to_h
100
- @gem_platforms ||= expanded_platforms.compact.uniq
101
-
102
- filtered_generic_platforms = valid_generic_platforms.values & @gem_platforms
103
- valid_generic_platforms.select {|_, v| filtered_generic_platforms.include?(v) }.keys
101
+ valid_platforms.select {|p| expanded_platforms.include?(GemHelpers.generic(p)) }
104
102
  end
105
103
 
106
104
  def expanded_platforms
107
- @platforms.map {|pl| PLATFORM_MAP[pl] }
105
+ @expanded_platforms ||= @platforms.map {|pl| PLATFORM_MAP[pl] }.compact.uniq
108
106
  end
109
107
 
110
108
  def should_include?
data/lib/bundler/dsl.rb CHANGED
@@ -18,6 +18,8 @@ module Bundler
18
18
  VALID_KEYS = %w[group groups git path glob name branch ref tag require submodules
19
19
  platform platforms type source install_if gemfile].freeze
20
20
 
21
+ GITHUB_PULL_REQUEST_URL = %r{\Ahttps://github\.com/([A-Za-z0-9_\-\.]+/[A-Za-z0-9_\-\.]+)/pull/(\d+)\z}.freeze
22
+
21
23
  attr_reader :gemspecs
22
24
  attr_accessor :dependencies
23
25
 
@@ -275,26 +277,24 @@ module Bundler
275
277
 
276
278
  def add_git_sources
277
279
  git_source(:github) do |repo_name|
278
- warn_deprecated_git_source(:github, <<-'RUBY'.strip, 'Change any "reponame" :github sources to "username/reponame".')
279
- "https://github.com/#{repo_name}.git"
280
- RUBY
281
- repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
282
- "https://github.com/#{repo_name}.git"
280
+ if repo_name =~ GITHUB_PULL_REQUEST_URL
281
+ {
282
+ "git" => "https://github.com/#{$1}.git",
283
+ "branch" => "refs/pull/#{$2}/head",
284
+ "ref" => nil,
285
+ "tag" => nil,
286
+ }
287
+ else
288
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
289
+ "https://github.com/#{repo_name}.git"
290
+ end
283
291
  end
284
292
 
285
293
  git_source(:gist) do |repo_name|
286
- warn_deprecated_git_source(:gist, '"https://gist.github.com/#{repo_name}.git"')
287
-
288
294
  "https://gist.github.com/#{repo_name}.git"
289
295
  end
290
296
 
291
297
  git_source(:bitbucket) do |repo_name|
292
- warn_deprecated_git_source(:bitbucket, <<-'RUBY'.strip)
293
- user_name, repo_name = repo_name.split("/")
294
- repo_name ||= user_name
295
- "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
296
- RUBY
297
-
298
298
  user_name, repo_name = repo_name.split("/")
299
299
  repo_name ||= user_name
300
300
  "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
@@ -365,7 +365,11 @@ repo_name ||= user_name
365
365
 
366
366
  git_name = (git_names & opts.keys).last
367
367
  if @git_sources[git_name]
368
- opts["git"] = @git_sources[git_name].call(opts[git_name])
368
+ git_opts = @git_sources[git_name].call(opts[git_name])
369
+ git_opts = { "git" => git_opts } if git_opts.is_a?(String)
370
+ opts.merge!(git_opts) do |key, _gemfile_value, _git_source_value|
371
+ raise GemfileError, %(The :#{key} option can't be used with `#{git_name}: #{opts[git_name].inspect}`)
372
+ end
369
373
  end
370
374
 
371
375
  %w[git path].each do |type|
@@ -475,22 +479,6 @@ repo_name ||= user_name
475
479
  end
476
480
  end
477
481
 
478
- def warn_deprecated_git_source(name, replacement, additional_message = nil)
479
- additional_message &&= " #{additional_message}"
480
- replacement = if replacement.count("\n").zero?
481
- "{|repo_name| #{replacement} }"
482
- else
483
- "do |repo_name|\n#{replacement.to_s.gsub(/^/, " ")}\n end"
484
- end
485
-
486
- Bundler::SharedHelpers.major_deprecation 3, <<-EOS
487
- The :#{name} git source is deprecated, and will be removed in the future.#{additional_message} Add this code to the top of your Gemfile to ensure it continues to work:
488
-
489
- git_source(:#{name}) #{replacement}
490
-
491
- EOS
492
- end
493
-
494
482
  class DSLError < GemfileError
495
483
  # @return [String] the description that should be presented to the user.
496
484
  #
@@ -3,7 +3,6 @@
3
3
  module Bundler
4
4
  # used for Creating Specifications from the Gemcutter Endpoint
5
5
  class EndpointSpecification < Gem::Specification
6
- ILLFORMED_MESSAGE = 'Ill-formed requirement ["#<YAML::Syck::DefaultKey'.freeze
7
6
  include MatchPlatform
8
7
 
9
8
  attr_reader :name, :version, :platform, :required_rubygems_version, :required_ruby_version, :checksum
@@ -129,13 +128,6 @@ module Bundler
129
128
 
130
129
  def build_dependency(name, requirements)
131
130
  Gem::Dependency.new(name, requirements)
132
- rescue ArgumentError => e
133
- raise unless e.message.include?(ILLFORMED_MESSAGE)
134
- puts # we shouldn't print the error message on the "fetching info" status line
135
- raise GemspecError,
136
- "Unfortunately, the gem #{name} (#{version}) has an invalid " \
137
- "gemspec.\nPlease ask the gem author to yank the bad version to fix " \
138
- "this issue. For more information, see http://bit.ly/syck-defaultkey."
139
131
  end
140
132
  end
141
133
  end
@@ -38,7 +38,10 @@ module Bundler
38
38
 
39
39
  # Replaces `ENV` with the bundler environment variables backed up
40
40
  def replace_with_backup
41
- ENV.replace(backup) unless Gem.win_platform?
41
+ unless Gem.win_platform?
42
+ ENV.replace(backup)
43
+ return
44
+ end
42
45
 
43
46
  # Fallback logic for Windows below to workaround
44
47
  # https://bugs.ruby-lang.org/issues/16798. Can be dropped once all
@@ -68,11 +68,16 @@ module Bundler
68
68
  compact_index_request :fetch_spec
69
69
 
70
70
  def available?
71
- return nil unless SharedHelpers.md5_available?
72
- user_home = Bundler.user_home
73
- return nil unless user_home.directory? && user_home.writable?
71
+ unless SharedHelpers.md5_available?
72
+ Bundler.ui.debug("FIPS mode is enabled, bundler can't use the CompactIndex API")
73
+ return nil
74
+ end
75
+ if fetch_uri.scheme == "file"
76
+ Bundler.ui.debug("Using a local server, bundler won't use the CompactIndex API")
77
+ return false
78
+ end
74
79
  # Read info file checksums out of /versions, so we can know if gems are up to date
75
- fetch_uri.scheme != "file" && compact_index_client.update_and_parse_checksums!
80
+ compact_index_client.update_and_parse_checksums!
76
81
  rescue CompactIndexClient::Updater::MisMatchedChecksumError => e
77
82
  Bundler.ui.debug(e.message)
78
83
  nil
@@ -71,8 +71,8 @@ module Bundler
71
71
  :HTTPUnsupportedMediaType, :HTTPVersionNotSupported].freeze
72
72
  FAIL_ERRORS = begin
73
73
  fail_errors = [AuthenticationRequiredError, BadAuthenticationError, FallbackError]
74
- fail_errors << Gem::Requirement::BadRequirementError if defined?(Gem::Requirement::BadRequirementError)
75
- fail_errors.concat(NET_ERRORS.map {|e| SharedHelpers.const_get_safely(e, Net) }.compact)
74
+ fail_errors << Gem::Requirement::BadRequirementError
75
+ fail_errors.concat(NET_ERRORS.map {|e| Net.const_get(e) })
76
76
  end.freeze
77
77
 
78
78
  class << self
@@ -122,7 +122,6 @@ module Bundler
122
122
 
123
123
  # return the specs in the bundler format as an index
124
124
  def specs(gem_names, source)
125
- old = Bundler.rubygems.sources
126
125
  index = Bundler::Index.new
127
126
 
128
127
  if Bundler::Fetcher.disable_endpoint
@@ -153,8 +152,6 @@ module Bundler
153
152
  rescue CertificateFailureError
154
153
  Bundler.ui.info "" if gem_names && use_api # newline after dots
155
154
  raise
156
- ensure
157
- Bundler.rubygems.sources = old
158
155
  end
159
156
 
160
157
  def use_api