Made release argment of PackageVersion optional

The reletion may ommit the release component of version,
that means any release
Aslo the strignify for PackageVersion was changed,
now ':' is used to separate epoch

Change-Id: I8d74c9cc82720103a5b6d9189f85276bda4ec082
This commit is contained in:
Bulat Gaifullin 2016-03-01 16:42:05 +03:00
parent d84ae63612
commit ee7193c277
4 changed files with 46 additions and 18 deletions

View File

@ -393,5 +393,5 @@ class RpmRepositoryDriver(RepositoryDriverBase):
return PackageVersion(
attrs.get("epoch", 0),
attrs.get("ver", "0.0"),
attrs.get("rel", "0")
attrs.get("rel")
)

View File

@ -24,10 +24,13 @@ class PackageVersion(ComparableObject):
__slots__ = ["epoch", "version", "release"]
def __init__(self, epoch, version, release):
def __init__(self, epoch, version, release=None):
self.epoch = int(epoch or 0)
self.version = tuple(version.split('.'))
self.release = tuple(release.split('.'))
if release:
self.release = tuple(release.split('.'))
else:
self.release = None
@classmethod
def from_string(cls, text):
@ -35,13 +38,20 @@ class PackageVersion(ComparableObject):
:param text: the version in format '[{epoch-}]-{version}-{release}'
"""
components = text.split("-")
if len(components) > 2:
epoch = components[0]
components = components[1:]
pos1 = text.find(':')
if pos1 != -1:
epoch = text[0:pos1]
else:
epoch = 0
return cls(epoch, components[0], components[1])
pos1 += 1
pos2 = text.find('-', pos1)
if pos2 != -1:
version = text[pos1: pos2]
release = text[pos2 + 1:]
else:
version = text[pos1:]
release = None
return cls(epoch, version, release)
def cmp(self, other):
if not isinstance(other, PackageVersion):
@ -57,7 +67,9 @@ class PackageVersion(ComparableObject):
res = self._cmp_version_part(self.version, other.version)
if res != 0:
return res
return self._cmp_version_part(self.release, other.release)
if self.release and other.release:
return self._cmp_version_part(self.release, other.release)
return 0
def __eq__(self, other):
if other is self:
@ -65,11 +77,17 @@ class PackageVersion(ComparableObject):
return self.cmp(other) == 0
def __str__(self):
return "{0}-{1}-{2}".format(
self.epoch,
".".join(str(x) for x in self.version),
".".join(str(x) for x in self.release)
)
if self.release:
return "{0}:{1}-{2}".format(
self.epoch,
".".join(str(x) for x in self.version),
".".join(str(x) for x in self.release)
)
else:
return "{0}:{1}".format(
self.epoch,
".".join(str(x) for x in self.version),
)
@classmethod
def _order(cls, x):

View File

@ -224,16 +224,26 @@ class TestPackageVersion(base.TestCase):
self.assertEqual(('1', '0'), ver.version)
self.assertEqual(('22',), ver.release)
ver2 = PackageVersion.from_string("1-11.0-2")
ver2 = PackageVersion.from_string("1:11.0-2")
self.assertEqual(1, ver2.epoch)
self.assertEqual(('11', '0'), ver2.version)
self.assertEqual(('2',), ver2.release)
ver3 = PackageVersion.from_string("11.0")
self.assertEqual(0, ver3.epoch)
self.assertEqual(('11', '0'), ver3.version)
self.assertIsNone(ver3.release)
def test_compare(self):
ver1 = PackageVersion.from_string("6.3-31.5")
ver2 = PackageVersion.from_string("13.9-16.12")
ver3 = PackageVersion.from_string("13.9")
ver4 = PackageVersion.from_string("1:13.9")
self.assertLess(ver1, ver2)
self.assertGreater(ver2, ver1)
self.assertEqual(ver1, ver1)
self.assertLess(ver1, "6.3-40")
self.assertGreater(ver1, "6.3-31.4a")
self.assertEqual(ver2, ver3)
self.assertGreater(ver4, ver3)
self.assertGreater(ver4, ver2)

View File

@ -141,7 +141,7 @@ class TestRpmDriver(base.TestCase):
"Packages/test1.rpm", package.filename
)
self.assertItemsEqual(
['test2 (= 0-1.1.1.1-1.el7)'],
['test2 (= 0:1.1.1.1-1.el7)'],
(str(x) for x in package.requires)
)
self.assertItemsEqual(
@ -379,13 +379,13 @@ class TestRpmDriver(base.TestCase):
)
self.assertEqual("Test", pkg.name)
self.assertEqual("1-1.2.3-1", str(pkg.version))
self.assertEqual("1:1.2.3-1", str(pkg.version))
self.assertEqual("test.rpm", pkg.filename)
self.assertEqual((3, 4, 5), pkg.checksum)
self.assertEqual("Group", pkg.group)
self.assertEqual(10, pkg.filesize)
self.assertItemsEqual(
['test1 (= 0-1.2.3-1.el5)'],
['test1 (= 0:1.2.3-1.el5)'],
(str(x) for x in pkg.requires)
)
self.assertItemsEqual(