Fix version conflict parsing

This commit is contained in:
2025-07-05 19:58:57 +10:00
parent 45ef34ec64
commit d88b96df80
2 changed files with 16 additions and 24 deletions

View File

@ -38,10 +38,7 @@ internal struct ApkVersionRequirement: Hashable {
} }
(nameEnd, versionStart) = (range.lowerBound, range.upperBound) (nameEnd, versionStart) = (range.lowerBound, range.upperBound)
} else { } else {
// Lack of conflict flag indicates any version
if !comparer.contains(.conflict) {
comparer.formUnion(.any) comparer.formUnion(.any)
}
(nameEnd, versionStart) = (dependStr.endIndex, dependStr.endIndex) (nameEnd, versionStart) = (dependStr.endIndex, dependStr.endIndex)
} }
@ -54,9 +51,10 @@ internal struct ApkVersionRequirement: Hashable {
extension ApkVersionRequirement: CustomStringConvertible { extension ApkVersionRequirement: CustomStringConvertible {
var description: String { var description: String {
switch self.versionSpec { switch self.versionSpec {
case .any: self.name case .any(let invert):
case .conflict: "!\(self.name)" "\(invert ? "!" : "")\(self.name)"
case .constraint(let op, let version): "\(self.name)\(op)\(version)" case .constraint(let invert, let op, let version):
"\(invert ? "!" : "")\(self.name)\(op)\(version)"
} }
} }
} }
@ -92,16 +90,11 @@ fileprivate extension ApkVersionRequirement {
fileprivate extension ApkVersionSpecification { fileprivate extension ApkVersionSpecification {
init(_ bits: ApkVersionRequirement.ComparatorBits, version: Substring) throws(ApkVersionRequirement.ParseError) { init(_ bits: ApkVersionRequirement.ComparatorBits, version: Substring) throws(ApkVersionRequirement.ParseError) {
if bits == [ .conflict ] { let invert = bits.contains(.conflict)
self = .conflict self = if bits.subtracting(.conflict) == [ .any ] {
.any(invert: invert)
} else { } else {
if bits.contains(.conflict) { .constraint(invert: invert, op: try .init(bits), version: String(version))
throw .brokenSpec
} else if bits == [ .any ] {
self = .any
} else {
self = .constraint(op: try .init(bits), version: String(version))
}
} }
} }
} }

View File

@ -4,9 +4,8 @@
*/ */
enum ApkVersionSpecification: Equatable, Hashable { enum ApkVersionSpecification: Equatable, Hashable {
case any case any(invert: Bool)
case constraint(op: Operator, version: String) case constraint(invert: Bool, op: Operator, version: String)
case conflict
} }
extension ApkVersionSpecification { extension ApkVersionSpecification {