Fixignoring bugs

This commit is contained in:
Max Goedjen
2020-11-12 23:48:56 -08:00
parent 8bbf489146
commit cd0a1b0a68
5 changed files with 74 additions and 23 deletions

View File

@@ -4,7 +4,8 @@ import Combine
public protocol UpdaterProtocol: ObservableObject {
var update: Release? { get }
func ignore(release: Release)
}
public class Updater: ObservableObject, UpdaterProtocol {
@@ -41,26 +42,15 @@ extension Updater {
func evaluate(release: Release) {
guard !userIgnored(release: release) else { return }
let latestVersion = semVer(from: release.name)
let currentVersion = semVer(from: Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String)
for (latest, current) in zip(latestVersion, currentVersion) {
if latest > current {
DispatchQueue.main.async {
self.update = release
}
return
let latestVersion = SemVer(release.name)
let currentVersion = SemVer(Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String)
if latestVersion > currentVersion {
DispatchQueue.main.async {
self.update = release
}
}
}
func semVer(from stringVersion: String) -> [Int] {
var split = stringVersion.split(separator: ".").compactMap { Int($0) }
while split.count < 3 {
split.append(0)
}
return split
}
func userIgnored(release: Release) -> Bool {
guard !release.critical else { return false }
return defaults.bool(forKey: release.name)
@@ -71,6 +61,38 @@ extension Updater {
}
}
struct SemVer {
let versionNumbers: [Int]
init(_ version: String) {
// Betas have the format 1.2.3_beta1
let strippedBeta = version.split(separator: "_").first!
var split = strippedBeta.split(separator: ".").compactMap { Int($0) }
while split.count < 3 {
split.append(0)
}
versionNumbers = split
}
}
extension SemVer: Comparable {
static func < (lhs: SemVer, rhs: SemVer) -> Bool {
for (latest, current) in zip(lhs.versionNumbers, rhs.versionNumbers) {
if latest < current {
return true
} else if latest > current {
return false
}
}
return false
}
}
extension Updater {
enum Constants {
@@ -93,11 +115,18 @@ public struct Release: Codable {
}
extension Release: Identifiable {
public var id: String {
html_url.absoluteString
}
}
extension Release {
public var critical: Bool {
return body.contains(Constants.securityContent)
body.contains(Constants.securityContent)
}
}