- 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:
+122
-4
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+22
-2
@@ -12,8 +12,6 @@ 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):
|
||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user