[rubygems/rubygems] Let GemVersionPromoter sort in preferred order directly

So that we don't need to reverse the Array.

aeea5e2e00
This commit is contained in:
David Rodriguez 2024-03-21 17:55:14 +01:00 committed by git
parent 2b82b7d192
commit d69ef1cc52
3 changed files with 28 additions and 28 deletions

View file

@ -59,20 +59,20 @@ module Bundler
a_pre = a.prerelease? a_pre = a.prerelease?
b_pre = b.prerelease? b_pre = b.prerelease?
next -1 if a_pre && !b_pre next 1 if a_pre && !b_pre
next 1 if b_pre && !a_pre next -1 if b_pre && !a_pre
end end
if major? || locked_version.nil? if major? || locked_version.nil?
a <=> b b <=> a
elsif either_version_older_than_locked?(a, b, locked_version) elsif either_version_older_than_locked?(a, b, locked_version)
a <=> b b <=> a
elsif segments_do_not_match?(a, b, :major) elsif segments_do_not_match?(a, b, :major)
b <=> a
elsif !minor? && segments_do_not_match?(a, b, :minor)
b <=> a
else
a <=> b a <=> b
elsif !minor? && segments_do_not_match?(a, b, :minor)
a <=> b
else
b <=> a
end end
end end
post_sort(result, package.unlock?, locked_version) post_sort(result, package.unlock?, locked_version)
@ -137,13 +137,13 @@ module Bundler
if unlock || locked_version.nil? if unlock || locked_version.nil?
result result
else else
move_version_to_end(result, locked_version) move_version_to_beginning(result, locked_version)
end end
end end
def move_version_to_end(result, version) def move_version_to_beginning(result, version)
move, keep = result.partition {|s| s.version.to_s == version.to_s } move, keep = result.partition {|s| s.version.to_s == version.to_s }
keep.concat(move) move.concat(keep)
end end
end end
end end

View file

@ -359,7 +359,7 @@ module Bundler
def sort_versions_by_preferred(package, versions) def sort_versions_by_preferred(package, versions)
if versions.size > 1 if versions.size > 1
@gem_version_promoter.sort_versions(package, versions).reverse @gem_version_promoter.sort_versions(package, versions)
else else
versions versions
end end

View file

@ -33,13 +33,13 @@ RSpec.describe Bundler::GemVersionPromoter do
it "numerically sorts versions" do it "numerically sorts versions" do
versions = sorted_versions(candidates: %w[1.7.7 1.7.8 1.7.9 1.7.15 1.8.0], current: "1.7.8") versions = sorted_versions(candidates: %w[1.7.7 1.7.8 1.7.9 1.7.15 1.8.0], current: "1.7.8")
expect(versions).to eq %w[1.7.7 1.7.8 1.7.9 1.7.15 1.8.0] expect(versions).to eq %w[1.8.0 1.7.15 1.7.9 1.7.8 1.7.7]
end end
context "with no options" do context "with no options" do
it "defaults to level=:major, strict=false, pre=false" do it "defaults to level=:major, strict=false, pre=false" do
versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0") versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0")
expect(versions).to eq %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0] expect(versions).to eq %w[2.1.0 2.0.1 1.0.0 0.9.0 0.3.1 0.3.0 0.2.0]
end end
end end
@ -51,25 +51,25 @@ RSpec.describe Bundler::GemVersionPromoter do
it "keeps downgrades" do it "keeps downgrades" do
versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0") versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0")
expect(versions).to eq %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0] expect(versions).to eq %w[2.1.0 2.0.1 1.0.0 0.9.0 0.3.1 0.3.0 0.2.0]
end end
end end
context "when level is minor" do context "when level is minor" do
before { gvp.level = :minor } before { gvp.level = :minor }
it "sorts highest minor within same major in last position" do it "sorts highest minor within same major in first position" do
versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0") versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0")
expect(versions).to eq %w[0.2.0 2.0.1 2.1.0 1.0.0 0.3.0 0.3.1 0.9.0] expect(versions).to eq %w[0.9.0 0.3.1 0.3.0 1.0.0 2.1.0 2.0.1 0.2.0]
end end
end end
context "when level is patch" do context "when level is patch" do
before { gvp.level = :patch } before { gvp.level = :patch }
it "sorts highest patch within same minor in last position" do it "sorts highest patch within same minor in first position" do
versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0") versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0")
expect(versions).to eq %w[0.2.0 2.1.0 2.0.1 1.0.0 0.9.0 0.3.0 0.3.1] expect(versions).to eq %w[0.3.1 0.3.0 0.9.0 1.0.0 2.0.1 2.1.0 0.2.0]
end end
end end
end end
@ -82,25 +82,25 @@ RSpec.describe Bundler::GemVersionPromoter do
it "orders by version" do it "orders by version" do
versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0") versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0")
expect(versions).to eq %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0] expect(versions).to eq %w[2.1.0 2.0.1 1.0.0 0.9.0 0.3.1 0.3.0 0.2.0]
end end
end end
context "when level is minor" do context "when level is minor" do
before { gvp.level = :minor } before { gvp.level = :minor }
it "favors downgrades, then upgrades by major descending, minor ascending, patch ascending" do it "favors minor upgrades, then patch upgrades, then major upgrades, then downgrades" do
versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0") versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0")
expect(versions).to eq %w[0.2.0 2.0.1 2.1.0 1.0.0 0.3.0 0.3.1 0.9.0] expect(versions).to eq %w[0.9.0 0.3.1 0.3.0 1.0.0 2.1.0 2.0.1 0.2.0]
end end
end end
context "when level is patch" do context "when level is patch" do
before { gvp.level = :patch } before { gvp.level = :patch }
it "favors downgrades, then upgrades by major descending, minor descending, patch ascending" do it "favors patch upgrades, then minor upgrades, then major upgrades, then downgrades" do
versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0") versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.0.1 2.1.0], current: "0.3.0")
expect(versions).to eq %w[0.2.0 2.1.0 2.0.1 1.0.0 0.9.0 0.3.0 0.3.1] expect(versions).to eq %w[0.3.1 0.3.0 0.9.0 1.0.0 2.0.1 2.1.0 0.2.0]
end end
end end
end end
@ -110,7 +110,7 @@ RSpec.describe Bundler::GemVersionPromoter do
it "sorts regardless of prerelease status" do it "sorts regardless of prerelease status" do
versions = sorted_versions(candidates: %w[1.7.7.pre 1.8.0 1.8.1.pre 1.8.1 2.0.0.pre 2.0.0], current: "1.8.0") versions = sorted_versions(candidates: %w[1.7.7.pre 1.8.0 1.8.1.pre 1.8.1 2.0.0.pre 2.0.0], current: "1.8.0")
expect(versions).to eq %w[1.7.7.pre 1.8.0 1.8.1.pre 1.8.1 2.0.0.pre 2.0.0] expect(versions).to eq %w[2.0.0 2.0.0.pre 1.8.1 1.8.1.pre 1.8.0 1.7.7.pre]
end end
end end
@ -119,16 +119,16 @@ RSpec.describe Bundler::GemVersionPromoter do
it "deprioritizes prerelease gems" do it "deprioritizes prerelease gems" do
versions = sorted_versions(candidates: %w[1.7.7.pre 1.8.0 1.8.1.pre 1.8.1 2.0.0.pre 2.0.0], current: "1.8.0") versions = sorted_versions(candidates: %w[1.7.7.pre 1.8.0 1.8.1.pre 1.8.1 2.0.0.pre 2.0.0], current: "1.8.0")
expect(versions).to eq %w[1.7.7.pre 1.8.1.pre 2.0.0.pre 1.8.0 1.8.1 2.0.0] expect(versions).to eq %w[2.0.0 1.8.1 1.8.0 2.0.0.pre 1.8.1.pre 1.7.7.pre]
end end
end end
context "when locking and not major" do context "when locking and not major" do
before { gvp.level = :minor } before { gvp.level = :minor }
it "keeps the current version last" do it "keeps the current version first" do
versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.1.0 2.0.1], current: "0.3.0", locked: ["bar"]) versions = sorted_versions(candidates: %w[0.2.0 0.3.0 0.3.1 0.9.0 1.0.0 2.1.0 2.0.1], current: "0.3.0", locked: ["bar"])
expect(versions.last).to eq("0.3.0") expect(versions.first).to eq("0.3.0")
end end
end end
end end