- fix release critical bug #457. Add alphanumeric support to version numbers.

This is what Çağlar offered to do.
Çağlar, please take a look at the versiontests file and give feedback!
This commit is contained in:
Barış Metin
2005-09-22 22:25:32 +00:00
parent 915af66888
commit d1b2c9340f
2 changed files with 145 additions and 7 deletions
+122 -4
View File
@@ -12,20 +12,137 @@
# Authors: Eray Ozkural <eray@uludag.org.tr> # Authors: Eray Ozkural <eray@uludag.org.tr>
import re
import pisi.util as util import pisi.util as util
# Basic rule is:
# p > (no suffix) > rc > pre > beta > alpha
keywords = {"alpha": 0,
"beta" : 1,
"pre" : 2,
"rc" : 3,
"NOKEY" : 4,
"p" : 5}
# helper functions
def has_keyword(versionitem):
if versionitem._keyword != "NOKEY":
return True
return False
class VersionItem:
_keyword = "NOKEY"
_value = 0
def __init__(self, itemstring):
for keyword in keywords.keys():
if itemstring.startswith(keyword):
if self._keyword == "NOKEY":
self._keyword = keyword
else:
# longer match is correct
if len(keyword) > len(self._keyword):
self._keyword = keyword
if self._keyword == "NOKEY":
self._value = itemstring
else:
# rest is the version item's value. And each must have
# one!
self._value = itemstring[len(self._keyword):]
def __lt__(self,rhs):
l = keywords[self._keyword]
r = keywords[rhs._keyword]
if l < r:
return True
elif l == r:
return self._value < rhs._value
else: # l > r
return False
def __le__(self,rhs):
l = keywords[self._keyword]
r = keywords[rhs._keyword]
if l < r:
return True
elif l == r:
return self._value <= rhs._value
else: # l > r
return False
def __gt__(self,rhs):
l = keywords[self._keyword]
r = keywords[rhs._keyword]
if l > r:
return True
elif l == r:
return self._value > rhs._value
else: # l < r
return False
def __ge__(self,rhs):
l = keywords[self._keyword]
r = keywords[rhs._keyword]
if l > r:
return True
elif l == r:
return self._value >= rhs._value
else: # l < r
return False
class Version: class Version:
def __init__(self, verstring): def __init__(self, verstring):
self.comps = map(lambda x: int(x), util.multisplit(verstring,'.-')) self.comps = []
for i in util.multisplit(verstring,'.-_'):
# some version strings can contain ascii chars at the
# back. As an example: 2.11a
# We split '11a' as two items like '11' and 'a'
s = re.compile("[a-z-A-Z]$").search(i)
if s:
head = i[:s.start()]
tail = s.group()
self.comps.append(VersionItem(head))
self.comps.append(VersionItem(tail))
else:
self.comps.append(VersionItem(i))
self.verstring = verstring self.verstring = verstring
def string(self): def string(self):
return self.verstring return self.verstring
def pred(self,rhs,pred): def pred(self, rhs, pred):
for i in range(0, len(self.comps)):
if pred(self.comps[i],rhs.comps[i]): loop = len(self.comps)
if len(rhs.comps) > loop:
loop = len(rhs.comps)
for i in range(0, loop):
try:
litem = self.comps[i]
except IndexError:
litem = VersionItem("")
try:
ritem = rhs.comps[i]
except IndexError:
ritem = VersionItem("")
if pred(litem, ritem):
return True return True
else: else:
return False return False
@@ -41,3 +158,4 @@ class Version:
def __ge__(self,rhs): def __ge__(self,rhs):
return self.pred(rhs, lambda x,y: x>=y) return self.pred(rhs, lambda x,y: x>=y)
+23 -3
View File
@@ -12,13 +12,11 @@ import unittest
import os import os
from pisi import version from pisi import version
from pisi import util
from pisi import context
class VersionTestCase(unittest.TestCase): class VersionTestCase(unittest.TestCase):
def setUp(self): def setUp(self):
pass pass
def testOps(self): def testOps(self):
v1 = version.Version("0.3.1") v1 = version.Version("0.3.1")
v2 = version.Version("0.3.5") v2 = version.Version("0.3.5")
@@ -29,4 +27,26 @@ class VersionTestCase(unittest.TestCase):
self.assert_(v1 <= v3) self.assert_(v1 <= v3)
self.assert_(v4 >= v4) self.assert_(v4 >= v4)
# with keywords
v1 = version.Version("2.23_pre10")
v2 = version.Version("2.23")
v3 = version.Version("2.21")
v4 = version.Version("2.23_p1")
v5 = version.Version("2.23_beta1")
self.assert_(v1 < v2)
self.assert_(v1 > v3)
self.assert_(v1 < v4)
self.assert_(v1 > v5)
self.assert_(v2 < v4)
self.assert_(v2 > v5)
# with character
v1 = version.Version("2.10a")
v2 = version.Version("2.10")
v3 = version.Version("2.10d")
self.assert_(v1 > v2)
self.assert_(v1 < v3)
self.assert_(v2 < v3)
suite = unittest.makeSuite(VersionTestCase) suite = unittest.makeSuite(VersionTestCase)