bundler 2.2.31 → 2.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +83 -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 +7 -1
  12. data/lib/bundler/compact_index_client/updater.rb +0 -5
  13. data/lib/bundler/definition.rb +61 -119
  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/gem_helper.rb +2 -2
  21. data/lib/bundler/injector.rb +10 -1
  22. data/lib/bundler/installer/gem_installer.rb +1 -6
  23. data/lib/bundler/installer.rb +1 -4
  24. data/lib/bundler/lazy_specification.rb +17 -1
  25. data/lib/bundler/lockfile_parser.rb +10 -13
  26. data/lib/bundler/man/bundle-add.1 +10 -2
  27. data/lib/bundler/man/bundle-add.1.ronn +7 -1
  28. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  29. data/lib/bundler/man/bundle-cache.1 +1 -1
  30. data/lib/bundler/man/bundle-check.1 +1 -1
  31. data/lib/bundler/man/bundle-clean.1 +1 -1
  32. data/lib/bundler/man/bundle-config.1 +3 -3
  33. data/lib/bundler/man/bundle-config.1.ronn +3 -3
  34. data/lib/bundler/man/bundle-doctor.1 +1 -1
  35. data/lib/bundler/man/bundle-exec.1 +1 -1
  36. data/lib/bundler/man/bundle-gem.1 +1 -1
  37. data/lib/bundler/man/bundle-info.1 +1 -1
  38. data/lib/bundler/man/bundle-init.1 +1 -1
  39. data/lib/bundler/man/bundle-inject.1 +1 -1
  40. data/lib/bundler/man/bundle-install.1 +2 -2
  41. data/lib/bundler/man/bundle-install.1.ronn +2 -2
  42. data/lib/bundler/man/bundle-list.1 +1 -1
  43. data/lib/bundler/man/bundle-lock.1 +1 -1
  44. data/lib/bundler/man/bundle-open.1 +1 -1
  45. data/lib/bundler/man/bundle-outdated.1 +1 -1
  46. data/lib/bundler/man/bundle-platform.1 +1 -1
  47. data/lib/bundler/man/bundle-pristine.1 +1 -1
  48. data/lib/bundler/man/bundle-remove.1 +1 -1
  49. data/lib/bundler/man/bundle-show.1 +1 -1
  50. data/lib/bundler/man/bundle-update.1 +2 -2
  51. data/lib/bundler/man/bundle-update.1.ronn +2 -1
  52. data/lib/bundler/man/bundle-viz.1 +1 -1
  53. data/lib/bundler/man/bundle.1 +1 -1
  54. data/lib/bundler/man/gemfile.5 +28 -2
  55. data/lib/bundler/man/gemfile.5.ronn +9 -1
  56. data/lib/bundler/plugin/api/source.rb +1 -0
  57. data/lib/bundler/plugin/installer.rb +1 -1
  58. data/lib/bundler/process_lock.rb +1 -1
  59. data/lib/bundler/psyched_yaml.rb +1 -13
  60. data/lib/bundler/resolver.rb +34 -31
  61. data/lib/bundler/rubygems_ext.rb +2 -0
  62. data/lib/bundler/rubygems_gem_installer.rb +1 -1
  63. data/lib/bundler/rubygems_integration.rb +11 -48
  64. data/lib/bundler/self_manager.rb +76 -0
  65. data/lib/bundler/shared_helpers.rb +4 -12
  66. data/lib/bundler/source/git/git_proxy.rb +2 -2
  67. data/lib/bundler/source/metadata.rb +1 -1
  68. data/lib/bundler/source/rubygems.rb +16 -12
  69. data/lib/bundler/source/rubygems_aggregate.rb +1 -1
  70. data/lib/bundler/source.rb +1 -1
  71. data/lib/bundler/source_list.rb +7 -29
  72. data/lib/bundler/templates/Executable.bundler +1 -1
  73. data/lib/bundler/templates/Gemfile +0 -2
  74. data/lib/bundler/templates/gems.rb +0 -3
  75. data/lib/bundler/templates/newgem/Rakefile.tt +10 -1
  76. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +2 -2
  77. data/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  78. data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
  79. data/lib/bundler/templates/newgem/standard.yml.tt +0 -2
  80. data/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
  81. data/lib/bundler/ui/shell.rb +1 -1
  82. data/lib/bundler/vendor/.document +1 -0
  83. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +6 -6
  84. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +5 -3
  85. data/lib/bundler/vendor/thor/lib/thor/actions.rb +6 -2
  86. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +6 -0
  87. data/lib/bundler/vendor/thor/lib/thor/error.rb +9 -4
  88. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +19 -1
  89. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +22 -4
  90. data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  91. data/lib/bundler/vendor/thor/lib/thor/util.rb +1 -1
  92. data/lib/bundler/vendor/uri/lib/uri/common.rb +17 -80
  93. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +0 -1
  94. data/lib/bundler/vendor/uri/lib/uri/generic.rb +5 -6
  95. data/lib/bundler/vendor/uri/lib/uri/http.rb +0 -1
  96. data/lib/bundler/vendor/uri/lib/uri/https.rb +0 -1
  97. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  98. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +0 -1
  99. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +1 -14
  100. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +1 -12
  101. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  102. data/lib/bundler/vendor/uri/lib/uri/ws.rb +84 -0
  103. data/lib/bundler/vendor/uri/lib/uri/wss.rb +22 -0
  104. data/lib/bundler/vendor/uri/lib/uri.rb +0 -1
  105. data/lib/bundler/version.rb +1 -1
  106. data/lib/bundler.rb +9 -3
  107. metadata +10 -5
  108. data/lib/bundler/gemdeps.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f37ed81265b4005a7aa68cf2ed66ccae92c7b53298d15f7881e88703666ffee5
4
- data.tar.gz: 9f18b35034d82ae88c044595ea977e194cc815ce248e95ae7d5ae0cf0f66704b
3
+ metadata.gz: b01d3406cc29cfbbd031854220cc941849c39690b72aefedaa9a16afd288f3b9
4
+ data.tar.gz: 16dc9a02e52d5e1ea558fd6896f8e15073dcc580550e4ba53ae0fca62fcc32c1
5
5
  SHA512:
6
- metadata.gz: 800285d9a12c9d99c01f3418128f4913a96e7e739f9f4fc054c58014eca019d39b9fc3a15455f685db3a0510a523a8c2defa8d0df888ca30a7603e04910bae5f
7
- data.tar.gz: 2407199f530007e4cd4eac12b339438074d9ac327a4aef3b96b7fc62e33abaed79da79e5b0d7b2604b6f58857097026c926635a083c2e830cec1ab67f7c97ca0
6
+ metadata.gz: e1a3df279ba3c7e8bb7ae61b33ded9b8b860f24cc4e999a7eeb6fed136ba8c21961ebc6cd1b66f6b8fb258d02c44e50682c3bf8486d00ac73f6d0a58744985cf
7
+ data.tar.gz: 620e60cba4783cca36f9d446a3df424696139c2d89181d303486e9d9bca0bf28c080ae94ddb6138e42316437fc8ff6a1da28cb1dd47f47cab6f02c97a924dfa7
data/CHANGELOG.md CHANGED
@@ -1,3 +1,86 @@
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
+
71
+ # 2.2.32 (November 23, 2021)
72
+
73
+ ## Enhancements:
74
+
75
+ - Clarify `bundle viz` deprecation [#5083](https://github.com/rubygems/rubygems/pull/5083)
76
+ - Unlock dependencies that no longer match lockfile [#5068](https://github.com/rubygems/rubygems/pull/5068)
77
+ - Use `shellsplit` instead of array of strings for git push [#5062](https://github.com/rubygems/rubygems/pull/5062)
78
+ - Re-enable `default_ignores` option for standard [#5003](https://github.com/rubygems/rubygems/pull/5003)
79
+
80
+ ## Bug fixes:
81
+
82
+ - Fix downgrading dependencies by changing the `Gemfile` and running `bundle update` [#5078](https://github.com/rubygems/rubygems/pull/5078)
83
+
1
84
  # 2.2.31 (November 8, 2021)
2
85
 
3
86
  ## 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-08".freeze
8
- @git_commit_sha = "2505ef8972".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"
@@ -552,7 +558,7 @@ module Bundler
552
558
  method_option :version, :type => :boolean, :default => false, :aliases => "-v", :desc => "Set to show each gem version."
553
559
  method_option :without, :type => :array, :default => [], :aliases => "-W", :banner => "GROUP[ GROUP...]", :desc => "Exclude gems that are part of the specified named group."
554
560
  def viz
555
- SharedHelpers.major_deprecation 2, "The `viz` command has been moved to the `bundle-viz` gem, see https://github.com/rubygems/bundler-graph"
561
+ SharedHelpers.major_deprecation 2, "The `viz` command has been renamed to `graph` and moved to a plugin. See https://github.com/rubygems/bundler-graph"
556
562
  require_relative "cli/viz"
557
563
  Viz.new(options.dup).run
558
564
  end
@@ -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,25 +636,14 @@ module Bundler
649
636
  end
650
637
 
651
638
  def converge_dependencies
652
- frozen = Bundler.frozen_bundle?
653
- (@dependencies + locked_dependencies).each do |dep|
654
- locked_source = @locked_deps[dep.name]
655
- # This is to make sure that if bundler is installing in deployment mode and
656
- # after locked_source and sources don't match, we still use locked_source.
657
- if frozen && !locked_source.nil? &&
658
- locked_source.respond_to?(:source) && locked_source.source.instance_of?(Source::Path) && locked_source.source.path.exist?
659
- dep.source = locked_source.source
660
- elsif dep.source
639
+ changes = false
640
+
641
+ @dependencies.each do |dep|
642
+ if dep.source
661
643
  dep.source = sources.get(dep.source)
662
644
  end
663
- end
664
645
 
665
- changes = false
666
- # We want to know if all match, but don't want to check all entries
667
- # This means we need to return false if any dependency doesn't match
668
- # the lock or doesn't exist in the lock.
669
- @dependencies.each do |dependency|
670
- unless locked_dep = @locked_deps[dependency.name]
646
+ unless locked_dep = @locked_deps[dep.name]
671
647
  changes = true
672
648
  next
673
649
  end
@@ -678,11 +654,11 @@ module Bundler
678
654
  # directive, the lockfile dependencies and resolved dependencies end up
679
655
  # with a mismatch on #type. Work around that by setting the type on the
680
656
  # dep from the lockfile.
681
- locked_dep.instance_variable_set(:@type, dependency.type)
657
+ locked_dep.instance_variable_set(:@type, dep.type)
682
658
 
683
659
  # We already know the name matches from the hash lookup
684
660
  # so we only need to check the requirement now
685
- changes ||= dependency.requirement != locked_dep.requirement
661
+ changes ||= dep.requirement != locked_dep.requirement
686
662
  end
687
663
 
688
664
  changes
@@ -692,39 +668,36 @@ module Bundler
692
668
  # commonly happen if the Gemfile has changed since the lockfile was last
693
669
  # generated
694
670
  def converge_locked_specs
695
- deps = []
671
+ resolve = converge_specs(@locked_specs)
696
672
 
697
- # Build a list of dependencies that are the same in the Gemfile
698
- # and Gemfile.lock. If the Gemfile modified a dependency, but
699
- # the gem in the Gemfile.lock still satisfies it, this is fine
700
- # too.
701
- @dependencies.each do |dep|
702
- locked_dep = @locked_deps[dep.name]
703
-
704
- # If the locked_dep doesn't match the dependency we're looking for then we ignore the locked_dep
705
- locked_dep = nil unless locked_dep == dep
673
+ diff = nil
706
674
 
707
- if in_locked_deps?(dep, locked_dep) || satisfies_locked_spec?(dep)
708
- deps << dep
709
- elsif dep.source.is_a?(Source::Path) && dep.current_platform? && (!locked_dep || dep.source != locked_dep.source)
710
- @locked_specs.each do |s|
711
- @unlock[:gems] << s.name if s.source == dep.source
712
- end
675
+ # Now, we unlock any sources that do not have anymore gems pinned to it
676
+ sources.all_sources.each do |source|
677
+ next unless source.respond_to?(:unlock!)
713
678
 
714
- dep.source.unlock! if dep.source.respond_to?(:unlock!)
715
- dep.source.specs.each {|s| @unlock[:gems] << s.name }
679
+ unless resolve.any? {|s| s.source == source }
680
+ diff ||= @locked_specs.to_a - resolve.to_a
681
+ source.unlock! if diff.any? {|s| s.source == source }
716
682
  end
717
683
  end
718
684
 
685
+ resolve
686
+ end
687
+
688
+ def converge_specs(specs)
689
+ deps = []
719
690
  converged = []
720
- @locked_specs.each do |s|
691
+ specs.each do |s|
721
692
  # Replace the locked dependency's source with the equivalent source from the Gemfile
722
693
  dep = @dependencies.find {|d| s.satisfies?(d) }
723
- s.source = (dep && dep.source) || sources.get(s.source) unless multisource_allowed?
724
694
 
725
- # Don't add a spec to the list if its source is expired. For example,
726
- # if you change a Git gem to RubyGems.
727
- next if s.source.nil?
695
+ if dep && (!dep.source || s.source.include?(dep.source))
696
+ deps << dep
697
+ end
698
+
699
+ s.source = (dep && dep.source) || sources.get(s.source) || sources.default_source unless Bundler.frozen_bundle?
700
+
728
701
  next if @unlock[:sources].include?(s.source.name)
729
702
 
730
703
  # If the spec is from a path source and it doesn't exist anymore
@@ -737,7 +710,7 @@ module Bundler
737
710
  rescue PathError, GitError
738
711
  # if we won't need the source (according to the lockfile),
739
712
  # don't error if the path/git source isn't available
740
- next if @locked_specs.
713
+ next if specs.
741
714
  for(requested_dependencies, false, true).
742
715
  none? {|locked_spec| locked_spec.source == s.source }
743
716
 
@@ -753,35 +726,15 @@ module Bundler
753
726
  s.dependencies.replace(new_spec.dependencies)
754
727
  end
755
728
 
756
- converged << s
757
- end
758
-
759
- resolve = SpecSet.new(converged)
760
- resolve = SpecSet.new(resolve.for(expand_dependencies(deps, true), false, false).reject{|s| @unlock[:gems].include?(s.name) })
761
- diff = nil
762
-
763
- # Now, we unlock any sources that do not have anymore gems pinned to it
764
- sources.all_sources.each do |source|
765
- next unless source.respond_to?(:unlock!)
766
-
767
- unless resolve.any? {|s| s.source == source }
768
- diff ||= @locked_specs.to_a - resolve.to_a
769
- source.unlock! if diff.any? {|s| s.source == source }
729
+ if dep.nil? && requested_dependencies.find {|d| s.name == d.name }
730
+ @unlock[:gems] << s.name
731
+ else
732
+ converged << s
770
733
  end
771
734
  end
772
735
 
773
- resolve
774
- end
775
-
776
- def in_locked_deps?(dep, locked_dep)
777
- # Because the lockfile can't link a dep to a specific remote, we need to
778
- # treat sources as equivalent anytime the locked dep has all the remotes
779
- # that the Gemfile dep does.
780
- locked_dep && locked_dep.source && dep.source && locked_dep.source.include?(dep.source)
781
- end
782
-
783
- def satisfies_locked_spec?(dep)
784
- @locked_specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) }
736
+ resolve = SpecSet.new(converged)
737
+ SpecSet.new(resolve.for(expand_dependencies(deps, true), false, false).reject{|s| @unlock[:gems].include?(s.name) })
785
738
  end
786
739
 
787
740
  def metadata_dependencies
@@ -874,22 +827,11 @@ module Bundler
874
827
 
875
828
  def additional_base_requirements_for_resolve
876
829
  return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
877
- dependencies_by_name = dependencies.inject({}) {|memo, dep| memo.update(dep.name => dep) }
878
- @locked_gems.specs.reduce({}) do |requirements, locked_spec|
830
+ converge_specs(@locked_gems.specs).map do |locked_spec|
879
831
  name = locked_spec.name
880
- dependency = dependencies_by_name[name]
881
- next requirements if @locked_gems.dependencies[name] != dependency
882
- next requirements if dependency && dependency.source.is_a?(Source::Path)
883
832
  dep = Gem::Dependency.new(name, ">= #{locked_spec.version}")
884
- requirements[name] = DepProxy.get_proxy(dep, locked_spec.platform)
885
- requirements
886
- end.values
887
- end
888
-
889
- def equivalent_rubygems_remotes?(source)
890
- return false unless source.is_a?(Source::Rubygems)
891
-
892
- Bundler.settings[:allow_deployment_source_credential_changes] && source.equivalent_remotes?(sources.rubygems_remotes)
833
+ DepProxy.get_proxy(dep, locked_spec.platform)
834
+ end
893
835
  end
894
836
 
895
837
  def source_map
@@ -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?