From d88b96df803b4d578f370bdb036575da4c5cef07 Mon Sep 17 00:00:00 2001 From: a dinosaur Date: Sat, 5 Jul 2025 19:58:57 +1000 Subject: [PATCH] Fix version conflict parsing --- .../apk/Version/ApkVersionRequirement.swift | 35 ++++++++----------- .../apk/Version/ApkVersionSpecification.swift | 5 ++- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/Sources/apk/Version/ApkVersionRequirement.swift b/Sources/apk/Version/ApkVersionRequirement.swift index 7cdf2c0..534f541 100644 --- a/Sources/apk/Version/ApkVersionRequirement.swift +++ b/Sources/apk/Version/ApkVersionRequirement.swift @@ -38,10 +38,7 @@ internal struct ApkVersionRequirement: Hashable { } (nameEnd, versionStart) = (range.lowerBound, range.upperBound) } else { - // Lack of conflict flag indicates any version - if !comparer.contains(.conflict) { - comparer.formUnion(.any) - } + comparer.formUnion(.any) (nameEnd, versionStart) = (dependStr.endIndex, dependStr.endIndex) } @@ -54,9 +51,10 @@ internal struct ApkVersionRequirement: Hashable { extension ApkVersionRequirement: CustomStringConvertible { var description: String { switch self.versionSpec { - case .any: self.name - case .conflict: "!\(self.name)" - case .constraint(let op, let version): "\(self.name)\(op)\(version)" + case .any(let invert): + "\(invert ? "!" : "")\(self.name)" + case .constraint(let invert, let op, let version): + "\(invert ? "!" : "")\(self.name)\(op)\(version)" } } } @@ -92,16 +90,11 @@ fileprivate extension ApkVersionRequirement { fileprivate extension ApkVersionSpecification { init(_ bits: ApkVersionRequirement.ComparatorBits, version: Substring) throws(ApkVersionRequirement.ParseError) { - if bits == [ .conflict ] { - self = .conflict + let invert = bits.contains(.conflict) + self = if bits.subtracting(.conflict) == [ .any ] { + .any(invert: invert) } else { - if bits.contains(.conflict) { - throw .brokenSpec - } else if bits == [ .any ] { - self = .any - } else { - self = .constraint(op: try .init(bits), version: String(version)) - } + .constraint(invert: invert, op: try .init(bits), version: String(version)) } } } @@ -113,11 +106,11 @@ fileprivate extension ApkVersionSpecification.Operator { case .less: .less case .greater: .greater //case .checksum: .checksum - case [ .equals, .less ]: .lessEqual - case [ .equals, .greater ]: .greaterEqual - case [ .fuzzy, .equals ], .fuzzy: .fuzzyEquals - case [ .fuzzy, .equals, .less]: .lessFuzzy - case [ .fuzzy, .equals, .greater]: .greaterFuzzy + case [ .equals, .less ]: .lessEqual + case [ .equals, .greater ]: .greaterEqual + case [ .fuzzy, .equals ], .fuzzy: .fuzzyEquals + case [ .fuzzy, .equals, .less ]: .lessFuzzy + case [ .fuzzy, .equals, .greater ]: .greaterFuzzy default: throw .brokenSpec } } diff --git a/Sources/apk/Version/ApkVersionSpecification.swift b/Sources/apk/Version/ApkVersionSpecification.swift index 02c359c..2363b11 100644 --- a/Sources/apk/Version/ApkVersionSpecification.swift +++ b/Sources/apk/Version/ApkVersionSpecification.swift @@ -4,9 +4,8 @@ */ enum ApkVersionSpecification: Equatable, Hashable { - case any - case constraint(op: Operator, version: String) - case conflict + case any(invert: Bool) + case constraint(invert: Bool, op: Operator, version: String) } extension ApkVersionSpecification {