Fix version comparison when epoch is only present in one version

This commit is contained in:
Martchus 2022-03-29 22:08:20 +02:00
parent 987db81b69
commit 4fc3bf0928
2 changed files with 22 additions and 1 deletions

View File

@ -211,10 +211,21 @@ PackageVersionPartComparison PackageVersion::compareParts(const string &part1, c
{
const char *part1Pos = part1.data(), *part2Pos = part2.data();
const char *part1End = part1.data() + part1.size(), *part2End = part2.data() + part2.size();
for (;;) {
for (int i = 0;; ++i) {
// determine current segments
part1End = firstNonAlphanumericCharacter(part1Pos, part1End);
part2End = firstNonAlphanumericCharacter(part2Pos, part2End);
// check whether one of the segments is the epoch
if (!i) {
const auto part1IsEpoch = *part1End == ':';
const auto part2IsEpoch = *part2End == ':';
// if one one has an epoch, consider the one with epoch newer
if (part1IsEpoch && !part2IsEpoch) {
return PackageVersionPartComparison::Newer;
} else if (part2IsEpoch && !part1IsEpoch) {
return PackageVersionPartComparison::Older;
}
}
// compare segments
const auto segmentComparsion = compareSegments(part1Pos, part1End, part2Pos, part2End);
if (segmentComparsion != PackageVersionPartComparison::Equal) {

View File

@ -206,6 +206,16 @@ void DataTests::testDependencyMatching()
CPPUNIT_ASSERT_MESSAGE("real-world ffmpeg example (1)", pkg3.providesDependency(Dependency::fromString("ffmpeg<1:4.3")));
pkg3.version = "1:4.1-2";
CPPUNIT_ASSERT_MESSAGE("real-world ffmpeg example (2)", !pkg3.providesDependency(Dependency::fromString("ffmpeg>=1:4.1-3")));
pkg3.name = "python-jinja";
pkg3.version = "1:3.0.3-1";
CPPUNIT_ASSERT_MESSAGE("real-world python-jinja example (epoch equal)", pkg3.providesDependency(Dependency::fromString("python-jinja>=1:2.10.3")));
CPPUNIT_ASSERT_MESSAGE("real-world python-jinja example (epoch absend)", pkg3.providesDependency(Dependency::fromString("python-jinja>=2.10.3")));
CPPUNIT_ASSERT_MESSAGE("real-world python-jinja example (epoch higher)", !pkg3.providesDependency(Dependency::fromString("python-jinja>=2:2.10.3")));
pkg3.version = "3.0.3-1";
CPPUNIT_ASSERT_MESSAGE("real-world python-jinja example (epoch absend in package)", !pkg3.providesDependency(Dependency::fromString("python-jinja>=1:2.10.3")));
pkg3.version = "3:3.0.3-1";
CPPUNIT_ASSERT_MESSAGE("real-world python-jinja example (epoch higher in package)", pkg3.providesDependency(Dependency::fromString("python-jinja>=2:2.10.3")));
}
void DataTests::testPackageSearch()