mirror of
				https://github.com/maxgoedjen/secretive.git
				synced 2025-11-04 09:20:56 +00:00 
			
		
		
		
	.
This commit is contained in:
		
							parent
							
								
									404ab09faa
								
							
						
					
					
						commit
						d333f9b7f5
					
				@ -49,11 +49,11 @@ extension Updater {
 | 
			
		||||
        guard let release = releases
 | 
			
		||||
                .sorted()
 | 
			
		||||
                .reversed()
 | 
			
		||||
                .first(where: { $0.minimumOSVersion < osVersion }) else { return }
 | 
			
		||||
                .first(where: { $0.minimumOSVersion <= osVersion }) else { return }
 | 
			
		||||
        guard !userIgnored(release: release) else { return }
 | 
			
		||||
        guard !release.prerelease else { return }
 | 
			
		||||
        let latestVersion = SemVer(release.name)
 | 
			
		||||
        let currentVersion = SemVer(Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String)
 | 
			
		||||
        let currentVersion = SemVer(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "0.0.0")
 | 
			
		||||
        if latestVersion > currentVersion {
 | 
			
		||||
            DispatchQueue.main.async {
 | 
			
		||||
                self.update = release
 | 
			
		||||
@ -158,7 +158,11 @@ extension Release {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public var minimumOSVersion: SemVer {
 | 
			
		||||
        SemVer("1.1.1")
 | 
			
		||||
        guard let range = body.range(of: "Minimum macOS Version"),
 | 
			
		||||
              let numberStart = body.rangeOfCharacter(from: CharacterSet.decimalDigits, options: [], range: range.upperBound..<body.endIndex) else { return SemVer("11.0.0") }
 | 
			
		||||
        let numbersEnd = body.rangeOfCharacter(from: CharacterSet.whitespacesAndNewlines, options: [], range: numberStart.upperBound..<body.endIndex)?.lowerBound ?? body.endIndex
 | 
			
		||||
        let version = numberStart.lowerBound..<numbersEnd
 | 
			
		||||
        return SemVer(String(body[version]))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -18,54 +18,70 @@ class ReleaseParsingTests: XCTestCase {
 | 
			
		||||
        XCTAssert(release.minimumOSVersion == SemVer("11.0.0"))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func testOSPresent() {
 | 
			
		||||
        let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update Requires macOS 11.0.0")
 | 
			
		||||
        XCTAssert(release.minimumOSVersion == SemVer("11.0.0"))
 | 
			
		||||
    func testOSPresentWithContentBelow() {
 | 
			
		||||
        let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update ##Minimum macOS Version\n1.2.3\nBuild info")
 | 
			
		||||
        XCTAssert(release.minimumOSVersion == SemVer("1.2.3"))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func testOSPresentAtEnd() {
 | 
			
		||||
        let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update Minimum macOS Version: 1.2.3")
 | 
			
		||||
        XCTAssert(release.minimumOSVersion == SemVer("1.2.3"))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func testOSGreaterThanMinimum() {
 | 
			
		||||
        let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update")
 | 
			
		||||
        let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update Minimum macOS Version: 1.2.3")
 | 
			
		||||
        XCTAssert(release.minimumOSVersion < SemVer("11.0.0"))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func testOSEqualToMinimum() {
 | 
			
		||||
        let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update")
 | 
			
		||||
        XCTAssert(release.minimumOSVersion <= SemVer("11.0.0"))
 | 
			
		||||
        let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update Minimum macOS Version: 11.2.3")
 | 
			
		||||
        XCTAssert(release.minimumOSVersion <= SemVer("11.2.3"))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func testOSLessThanMinimum() {
 | 
			
		||||
        let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update")
 | 
			
		||||
        XCTAssert(release.minimumOSVersion > SemVer("10.0.0"))
 | 
			
		||||
        let release = Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Critical Security Update Minimum macOS Version: 1.2.3")
 | 
			
		||||
        XCTAssert(release.minimumOSVersion > SemVer("1.0.0"))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func testGreatestSelectedIfOldPatchIsPublishedLater() {
 | 
			
		||||
        // If 2.x.x series has been published, and a patch for 1.x.x is issued
 | 
			
		||||
        // 2.x.x should still be selected if user can run it.
 | 
			
		||||
        let updater = Updater(checkOnLaunch: false, osVersion: SemVer("10.0.0"))
 | 
			
		||||
        let two = Release(name: "2.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "2.0 available!")
 | 
			
		||||
        let updater = Updater(checkOnLaunch: false, osVersion: SemVer("2.2.3"))
 | 
			
		||||
        let two = Release(name: "2.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "2.0 available! Minimum macOS Version: 2.2.3")
 | 
			
		||||
        let releases = [
 | 
			
		||||
            Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Initial release"),
 | 
			
		||||
            Release(name: "1.0.1", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Bug fixes"),
 | 
			
		||||
            Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Initial release Minimum macOS Version: 1.2.3"),
 | 
			
		||||
            Release(name: "1.0.1", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Bug fixes Minimum macOS Version: 1.2.3"),
 | 
			
		||||
            two,
 | 
			
		||||
            Release(name: "1.0.2", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Emergency patch!"),
 | 
			
		||||
            Release(name: "1.0.2", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Emergency patch! Minimum macOS Version: 1.2.3"),
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        let expectation = XCTestExpectation()
 | 
			
		||||
        updater.evaluate(releases: releases)
 | 
			
		||||
        DispatchQueue.main.async {
 | 
			
		||||
            XCTAssert(updater.update == two)
 | 
			
		||||
            expectation.fulfill()
 | 
			
		||||
        }
 | 
			
		||||
        wait(for: [expectation], timeout: 1)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func testLatestVersionIsRunnable() {
 | 
			
		||||
        // If the 2.x.x series has been published but the user can't run it
 | 
			
		||||
        // the last version the user can run should be selected.
 | 
			
		||||
        let updater = Updater(checkOnLaunch: false, osVersion: SemVer("10.0.0"))
 | 
			
		||||
        let oneOhTwo = Release(name: "1.0.2", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Emergency patch!")
 | 
			
		||||
        let updater = Updater(checkOnLaunch: false, osVersion: SemVer("1.2.3"))
 | 
			
		||||
        let oneOhTwo = Release(name: "1.0.2", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Emergency patch! Minimum macOS Version: 1.2.3")
 | 
			
		||||
        let releases = [
 | 
			
		||||
            Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Initial release"),
 | 
			
		||||
            Release(name: "1.0.1", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Bug fixes"),
 | 
			
		||||
            Release(name: "2.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "2.0 available!"),
 | 
			
		||||
            oneOhTwo,
 | 
			
		||||
            Release(name: "1.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Initial release Minimum macOS Version: 1.2.3"),
 | 
			
		||||
            Release(name: "1.0.1", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Bug fixes Minimum macOS Version: 1.2.3"),
 | 
			
		||||
            Release(name: "2.0.0", prerelease: false, html_url: URL(string: "https://example.com")!, body: "2.0 available! Minimum macOS Version: 2.2.3"),
 | 
			
		||||
            Release(name: "1.0.2", prerelease: false, html_url: URL(string: "https://example.com")!, body: "Emergency patch! Minimum macOS Version: 1.2.3"),
 | 
			
		||||
        ]
 | 
			
		||||
        let expectation = XCTestExpectation()
 | 
			
		||||
        updater.evaluate(releases: releases)
 | 
			
		||||
        DispatchQueue.main.async {
 | 
			
		||||
            XCTAssert(updater.update == oneOhTwo)
 | 
			
		||||
            expectation.fulfill()
 | 
			
		||||
        }
 | 
			
		||||
        wait(for: [expectation], timeout: 1)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func testSorting() {
 | 
			
		||||
 | 
			
		||||
@ -37,6 +37,11 @@ class SemVerTests: XCTestCase {
 | 
			
		||||
        XCTAssert(current.versionNumbers == [1, 1, 0])
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func testGarbage() {
 | 
			
		||||
        let current = SemVer("Test")
 | 
			
		||||
        XCTAssert(current.versionNumbers == [0, 0, 0])
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    func testBeta() {
 | 
			
		||||
        let current = SemVer("1.0.2")
 | 
			
		||||
        let new = SemVer("1.1.0_beta1")
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user