bundler 4.0.20 → 4.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b47ebbcd326a80d96d63eb16bc6743f1869f9ad1f37d83fac4dc9e1ea805c82c
4
- data.tar.gz: c4903d7995ee2fa13381891ea105a1960ed5fb2ed69255f9fab09b4a7457f89e
3
+ metadata.gz: afa0c2897b3ab6a8ffbfaacf1d1bb51e2a44a994735b2db990b39f988d44d9fe
4
+ data.tar.gz: 81b0134db390637dffbd6bc61554fec61813c06fb5db8e87a8b3b53fa1f880ca
5
5
  SHA512:
6
- metadata.gz: 2bdee0e45396bc93bf1837856a137f30ac3fa2a6bd4cc805ada1c0326e25309da64571d048edcd230f4f2143e1878ca4628d525fadea65e89333255946d2ead8
7
- data.tar.gz: a8f333636a584612db1e4ae36ad93265e22873c38b3ff6cab66bb0e935a84126eeeaef21626fa429fe3229a4f194881be7d8bfed25ebc7675719644d538f0d2e
6
+ metadata.gz: b258f8a43e5eb62bb62252a165f83d092185160f719c91781b530a2ba6fbb4d79278273cbd0092776647028b61bbf47254b0ea74b1286de4ffd1fe600350153a
7
+ data.tar.gz: 63be0fe193880295eceb9fe630eb699f7ad89c401e61fa425137972493b118f7ea1851ac4e1445807c6d8d7bffa751e3d4bd4086aa450fa7ce473207c8557f30
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.0.21 / 2026-09-16
4
+
5
+ ### Enhancements:
6
+
7
+ * Don't update bundler to a prerelease unless asked for one. Pull request [#9869](https://github.com/ruby/rubygems/pull/9869) by Hiroshi SHIBATA
8
+ * Reject Bundler redirects that downgrade https to http. Pull request [#9859](https://github.com/ruby/rubygems/pull/9859) by Hiroshi SHIBATA
9
+
10
+ ### Bug fixes:
11
+
12
+ * Support `safe.bareRepository=explicit` in git sources. Pull request [#9876](https://github.com/ruby/rubygems/pull/9876) by Hiroshi SHIBATA
13
+ * Stop resolving locally for empty CHECKSUMS entries. Pull request [#9862](https://github.com/ruby/rubygems/pull/9862) by Hiroshi SHIBATA
14
+ * Expand the git source gemspec path before the chdir. Pull request [#9845](https://github.com/ruby/rubygems/pull/9845) by Hiroshi SHIBATA
15
+
3
16
  ## 4.0.20 / 2026-09-02
4
17
 
5
18
  ### Enhancements:
data/bundler.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
 
25
25
  s.metadata = {
26
26
  "bug_tracker_uri" => "https://github.com/ruby/rubygems/issues?q=is%3Aopen+is%3Aissue+label%3ABundler",
27
- "changelog_uri" => "https://github.com/ruby/rubygems/blob/master/CHANGELOG-bundler.md",
27
+ "changelog_uri" => "https://github.com/ruby/rubygems/blob/master/CHANGELOG.md",
28
28
  "homepage_uri" => "https://bundler.io/",
29
29
  "source_code_uri" => "https://github.com/ruby/rubygems",
30
30
  }
@@ -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 = "2026-09-02".freeze
8
- @git_commit_sha = "7f2502dc32b".freeze
7
+ @built_at = "2026-09-16".freeze
8
+ @git_commit_sha = "a15d54ed692".freeze
9
9
  # end ivars
10
10
 
11
11
  # A hash representation of the build metadata.
@@ -13,7 +13,7 @@ module Bundler
13
13
 
14
14
  update_bundler = options[:bundler]
15
15
 
16
- Bundler.self_manager.update_bundler_and_restart_with_it_if_needed(update_bundler) if update_bundler
16
+ Bundler.self_manager.update_bundler_and_restart_with_it_if_needed(update_bundler, pre: options[:pre]) if update_bundler
17
17
 
18
18
  Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.settings[:plugins]
19
19
 
data/lib/bundler/cli.rb CHANGED
@@ -317,7 +317,7 @@ module Bundler
317
317
  method_option "source", type: :array, banner: "Update a specific source (and all gems associated with it)"
318
318
  method_option "force", type: :boolean, aliases: "--redownload", banner: "Force reinstalling every gem, even if already installed"
319
319
  method_option "ruby", type: :boolean, banner: "Update ruby specified in Gemfile.lock"
320
- method_option "bundler", type: :string, lazy_default: "> 0.a", banner: "Update the locked version of bundler"
320
+ method_option "bundler", type: :string, lazy_default: ">= #{Bundler::VERSION}", banner: "Update the locked version of bundler"
321
321
  method_option "patch", type: :boolean, banner: "Prefer updating only to next patch version"
322
322
  method_option "minor", type: :boolean, banner: "Prefer updating only to next minor version"
323
323
  method_option "major", type: :boolean, banner: "Prefer updating to next major version (default)"
@@ -642,7 +642,7 @@ module Bundler
642
642
  method_option "pre", type: :boolean, banner: "If updating, always choose the highest allowed version, regardless of prerelease status"
643
643
  method_option "strict", type: :boolean, banner: "If updating, do not allow any gem to be updated past latest --patch | --minor | --major"
644
644
  method_option "conservative", type: :boolean, banner: "If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated"
645
- method_option "bundler", type: :string, lazy_default: "> 0.a", banner: "Update the locked version of bundler"
645
+ method_option "bundler", type: :string, lazy_default: ">= #{Bundler::VERSION}", banner: "Update the locked version of bundler"
646
646
  method_option "cooldown", type: :numeric, banner: "Only consider gem versions published at least N days ago. Use 0 to disable."
647
647
  def lock
648
648
  require_relative "cli/lock"
@@ -192,7 +192,7 @@ module Bundler
192
192
 
193
193
  sources.cached!
194
194
 
195
- if options[:add_checksums] || (!options[:local] && install_needed?)
195
+ if options[:add_checksums] || (!options[:local] && (install_needed? || @locked_spec_with_empty_checksums))
196
196
  sources.remote!
197
197
  true
198
198
  else
@@ -639,7 +639,7 @@ module Bundler
639
639
  @missing_lockfile_dep ||
640
640
  @unlocking_bundler ||
641
641
  @locked_spec_with_missing_checksums ||
642
- @locked_spec_with_empty_checksums ||
642
+ empty_checksums_actionable? ||
643
643
  @locked_spec_with_missing_deps ||
644
644
  @locked_spec_with_invalid_deps
645
645
  end
@@ -648,6 +648,16 @@ module Bundler
648
648
  unlocking? || something_changed?
649
649
  end
650
650
 
651
+ # Only a remote fetch can fill an empty CHECKSUMS entry, so it justifies a
652
+ # resolution only when one is coming. Resolving locally for it would repeat
653
+ # on every `Bundler.setup` without changing the lockfile. Frozen mode still
654
+ # has to refuse the entry.
655
+ def empty_checksums_actionable?
656
+ return false unless @locked_spec_with_empty_checksums
657
+
658
+ Bundler.frozen_bundle? || !sources.local_mode?
659
+ end
660
+
651
661
  def should_add_extra_platforms?
652
662
  !lockfile_exists? && Bundler::MatchPlatform.generic_local_platform_is_ruby? && !Bundler.settings[:force_ruby_platform]
653
663
  end
@@ -46,6 +46,11 @@ module Bundler
46
46
  response
47
47
  when Gem::Net::HTTPRedirection
48
48
  new_uri = Gem::URI.parse(response["location"])
49
+ # Following a downgrade would put the credentials this request carries
50
+ # on a plaintext connection, so refuse it like Gem::RemoteFetcher does.
51
+ if https?(uri) && !https?(new_uri)
52
+ raise HTTPError, "Redirecting to a non-https URI is not allowed: #{URICredentialsFilter.credential_filtered_uri(new_uri)}"
53
+ end
49
54
  if new_uri.host == uri.host
50
55
  new_uri.user = uri.user
51
56
  new_uri.password = uri.password
@@ -105,6 +110,10 @@ module Bundler
105
110
 
106
111
  private
107
112
 
113
+ def https?(uri)
114
+ uri.scheme&.casecmp("https")&.zero?
115
+ end
116
+
108
117
  def validate_uri_scheme!(uri)
109
118
  return if /\Ahttps?\z/.match?(uri.scheme)
110
119
  raise InvalidOption,
@@ -13,7 +13,7 @@ Lock the gems specified in Gemfile\.
13
13
  Ignores the existing lockfile\. Resolve then updates lockfile\. Taking a list of gems or updating all gems if no list is given\.
14
14
  .TP
15
15
  \fB\-\-bundler[=BUNDLER]\fR
16
- Update the locked version of bundler to the given version or the latest version if no version is given\.
16
+ Update the locked version of bundler\. BUNDLER can be a version such as \fB4\.0\.20\fR, or a requirement such as \fB"> 0\.a"\fR\. With no argument, update to the latest released version, which never selects a prerelease\.
17
17
  .TP
18
18
  \fB\-\-local\fR
19
19
  Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems' cache or in \fBvendor/cache\fR\. Note that if a appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\.
@@ -33,8 +33,9 @@ Lock the gems specified in Gemfile.
33
33
  of gems or updating all gems if no list is given.
34
34
 
35
35
  * `--bundler[=BUNDLER]`:
36
- Update the locked version of bundler to the given version or the latest
37
- version if no version is given.
36
+ Update the locked version of bundler. BUNDLER can be a version such as
37
+ `4.0.20`, or a requirement such as `"> 0.a"`. With no argument, update to the
38
+ latest released version, which never selects a prerelease.
38
39
 
39
40
  * `--local`:
40
41
  Do not attempt to connect to `rubygems.org`. Instead, Bundler will use the
@@ -27,7 +27,7 @@ Do not attempt to fetch gems remotely and use the gem cache instead\.
27
27
  Update the locked version of Ruby to the current version of Ruby\.
28
28
  .TP
29
29
  \fB\-\-bundler[=BUNDLER]\fR
30
- Update the locked version of bundler to the invoked bundler version\.
30
+ Update the locked version of bundler\. BUNDLER can be a version such as \fB4\.0\.20\fR, or a requirement such as \fB"> 0\.a"\fR\. With no argument, update to the latest released version, which never selects a prerelease\.
31
31
  .TP
32
32
  \fB\-\-force\fR, \fB\-\-redownload\fR
33
33
  Force reinstalling every gem, even if already installed\.
@@ -53,7 +53,9 @@ gem.
53
53
  Update the locked version of Ruby to the current version of Ruby.
54
54
 
55
55
  * `--bundler[=BUNDLER]`:
56
- Update the locked version of bundler to the invoked bundler version.
56
+ Update the locked version of bundler. BUNDLER can be a version such as
57
+ `4.0.20`, or a requirement such as `"> 0.a"`. With no argument, update to the
58
+ latest released version, which never selects a prerelease.
57
59
 
58
60
  * `--force`, `--redownload`:
59
61
  Force reinstalling every gem, even if already installed.
@@ -30,8 +30,8 @@ module Bundler
30
30
  install_and_restart_with(restart_version)
31
31
  end
32
32
 
33
- def update_bundler_and_restart_with_it_if_needed(target)
34
- spec = resolve_update_version_from(target)
33
+ def update_bundler_and_restart_with_it_if_needed(target, pre: false)
34
+ spec = resolve_update_version_from(target, pre: pre)
35
35
  return unless spec
36
36
 
37
37
  version = spec.version
@@ -108,9 +108,9 @@ module Bundler
108
108
  lockfile_version
109
109
  end
110
110
 
111
- def resolve_update_version_from(target)
111
+ def resolve_update_version_from(target, pre: false)
112
112
  requirement = Gem::Requirement.new(target)
113
- update_candidate = find_latest_matching_spec(requirement)
113
+ update_candidate = find_latest_matching_spec(requirement, pre: pre)
114
114
 
115
115
  if update_candidate.nil?
116
116
  raise InvalidOption, "The `bundle update --bundler` target version (#{target}) does not exist"
@@ -137,18 +137,24 @@ module Bundler
137
137
  end
138
138
  end
139
139
 
140
- def find_latest_matching_spec(requirement)
140
+ def find_latest_matching_spec(requirement, pre: false)
141
141
  Bundler.configure
142
- local_result = find_latest_matching_spec_from_collection(local_specs, requirement)
142
+ # A bare `bundle update --bundler` must stay on releases, like `gem update
143
+ # --system`, so only `--pre` or a prerelease requirement opts into one.
144
+ allow_prerelease = pre || requirement.prerelease?
145
+
146
+ local_result = find_latest_matching_spec_from_collection(local_specs, requirement, allow_prerelease)
143
147
  return local_result if local_result && requirement.specific?
144
148
 
145
- remote_result = find_latest_matching_spec_from_collection(remote_specs, requirement)
149
+ remote_result = find_latest_matching_spec_from_collection(remote_specs, requirement, allow_prerelease)
146
150
  return remote_result if local_result.nil?
147
151
 
148
- [local_result, remote_result].max
152
+ [local_result, remote_result].compact.max
149
153
  end
150
154
 
151
- def find_latest_matching_spec_from_collection(specs, requirement)
155
+ def find_latest_matching_spec_from_collection(specs, requirement, allow_prerelease)
156
+ specs = specs.reject {|spec| spec.version.prerelease? } unless allow_prerelease
157
+
152
158
  specs.sort.reverse_each.find {|spec| requirement.satisfied_by?(spec.version) }
153
159
  end
154
160
 
@@ -507,7 +507,15 @@ module Bundler
507
507
 
508
508
  return ["git", *opts, *cmd] unless dir
509
509
 
510
- ["git", "-C", dir.to_s, *opts, *cmd]
510
+ # With safe.bareRepository=explicit, git refuses to discover a bare
511
+ # repository from -C, so the cache clone is named with --git-dir.
512
+ # Working trees, like a local override, still go through -C.
513
+ location = bare_repo?(dir) ? "--git-dir" : "-C"
514
+ ["git", location, dir.to_s, *opts, *cmd]
515
+ end
516
+
517
+ def bare_repo?(dir)
518
+ File.exist?(File.join(dir, "objects")) && File.exist?(File.join(dir, "HEAD"))
511
519
  end
512
520
 
513
521
  def extra_clone_args
@@ -423,10 +423,12 @@ module Bundler
423
423
  def validate_spec(_spec); end
424
424
 
425
425
  def load_gemspec(file)
426
- dirname = Pathname.new(file).dirname
427
- SharedHelpers.chdir(dirname.to_s) do
428
- stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent)
429
- stub.full_gem_path = dirname.expand_path(root).to_s
426
+ # Expand the path before the chdir below, since resolving it inside the
427
+ # block would base it on the gemspec directory instead of `root`.
428
+ gemspec_path = Pathname.new(file).expand_path(root)
429
+ SharedHelpers.chdir(gemspec_path.dirname.to_s) do
430
+ stub = Gem::StubSpecification.gemspec_stub(gemspec_path.to_s, install_path.parent, install_path.parent)
431
+ stub.full_gem_path = gemspec_path.dirname.to_s
430
432
  StubSpecification.from_stub(stub)
431
433
  end
432
434
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Bundler
4
- VERSION = "4.0.20".freeze
4
+ VERSION = "4.0.21".freeze
5
5
 
6
6
  def self.bundler_major_version
7
7
  @bundler_major_version ||= gem_version.segments.first
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bundler
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.20
4
+ version: 4.0.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Arko
@@ -384,7 +384,7 @@ licenses:
384
384
  - MIT
385
385
  metadata:
386
386
  bug_tracker_uri: https://github.com/ruby/rubygems/issues?q=is%3Aopen+is%3Aissue+label%3ABundler
387
- changelog_uri: https://github.com/ruby/rubygems/blob/master/CHANGELOG-bundler.md
387
+ changelog_uri: https://github.com/ruby/rubygems/blob/master/CHANGELOG.md
388
388
  homepage_uri: https://bundler.io/
389
389
  source_code_uri: https://github.com/ruby/rubygems
390
390
  rdoc_options: []