From e73e9611461f920ba69dea9da43ea7df71b54715 Mon Sep 17 00:00:00 2001 From: "Sven A. Schmidt" Date: Tue, 1 Sep 2020 11:30:02 +0200 Subject: [PATCH] Fix pre-release sorting --- Sources/SemanticVersion/SemanticVersion.swift | 11 ++++++++--- Tests/SemanticVersionTests/SemanticVersionTests.swift | 10 ++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Sources/SemanticVersion/SemanticVersion.swift b/Sources/SemanticVersion/SemanticVersion.swift index 245ea15..9b2289e 100644 --- a/Sources/SemanticVersion/SemanticVersion.swift +++ b/Sources/SemanticVersion/SemanticVersion.swift @@ -43,9 +43,14 @@ extension SemanticVersion: Comparable { if lhs.major != rhs.major { return lhs.major < rhs.major } if lhs.minor != rhs.minor { return lhs.minor < rhs.minor } if lhs.patch != rhs.patch { return lhs.patch < rhs.patch } - // Not entirely sure how much sense it makes to compare the pre and build values - // but it's probably better than just ignoring them - if lhs.preRelease != rhs.preRelease { return lhs.preRelease < rhs.preRelease } + if lhs.preRelease != rhs.preRelease { + // Ensure stable versions sort after their betas ... + if lhs.isStable { return false } + if rhs.isStable { return true } + // ... otherwise sort by preRelease + return lhs.preRelease < rhs.preRelease + } + // ... and build return lhs.build < rhs.build } } diff --git a/Tests/SemanticVersionTests/SemanticVersionTests.swift b/Tests/SemanticVersionTests/SemanticVersionTests.swift index f0977b6..3373c9a 100644 --- a/Tests/SemanticVersionTests/SemanticVersionTests.swift +++ b/Tests/SemanticVersionTests/SemanticVersionTests.swift @@ -89,6 +89,8 @@ final class SemanticVersionTests: XCTestCase { XCTAssertEqual(SemanticVersion("1.2.3-rc"), SemanticVersion(1, 2, 3, "rc")) XCTAssertEqual(SemanticVersion("v1.2.3-beta1"), SemanticVersion(1, 2, 3, "beta1")) XCTAssertEqual(SemanticVersion("v1.2.3-beta1+build5"), SemanticVersion(1, 2, 3, "beta1", "build5")) + XCTAssertEqual(SemanticVersion("1.2.3-beta-foo"), SemanticVersion(1, 2, 3, "beta-foo")) + XCTAssertEqual(SemanticVersion("1.2.3-beta-foo+build-42"), SemanticVersion(1, 2, 3, "beta-foo", "build-42")) XCTAssertEqual(SemanticVersion(""), nil) XCTAssertEqual(SemanticVersion("1"), nil) XCTAssertEqual(SemanticVersion("1.2"), nil) @@ -109,6 +111,14 @@ final class SemanticVersionTests: XCTestCase { XCTAssert(SemanticVersion(1, 0, 0) < SemanticVersion(1, 0, 1)) XCTAssert(SemanticVersion(1, 0, 0, "a") < SemanticVersion(1, 0, 0, "b")) XCTAssert(SemanticVersion(1, 0, 0, "a", "a") < SemanticVersion(1, 0, 0, "a", "b")) + + // ensure betas come before releases + XCTAssert(SemanticVersion(1, 0, 0, "b1") < SemanticVersion(1, 0, 0)) + XCTAssertFalse(SemanticVersion(1, 0, 0, "b1") > SemanticVersion(1, 0, 0)) + // but only if major/minor/patch are the same + XCTAssert(SemanticVersion(1, 0, 0) < SemanticVersion(1, 0, 1, "b1")) + // once the patch bumps up to the beta level again, it sorts higher + XCTAssert(SemanticVersion(1, 0, 1) > SemanticVersion(1, 0, 1, "b1")) } func test_isStable() throws {