Update version compare function in utils.py.
Signed-off-by: John Huang <[email protected]>
--- autotest/client/common_lib/utils.py 2010-04-13 18:15:53.000000000 -0700
+++ autotest/client/common_lib/utils.py 2010-04-14 10:41:07.000000000 -0700
@@ -1143,19 +1143,35 @@
def compare_versions(ver1, ver2):
- """Compares two dot-delimited version strings.
+ """Version number comparison between ver1 and ver2 strings.
- Version number comparison between ver1 and ver2 of the form 'x.y.z'
+ >>> compare_tuple("1", "2")
+ -1
+ >>> compare_tuple("foo-1.1", "foo-1.2")
+ -1
+ >>> compare_tuple("1.2", "1.2a")
+ -1
+ >>> compare_tuple("1.2b", "1.2a")
+ 1
+ >>> compare_tuple("1.3.5.3a", "1.3.5.3b")
+ -1
Args:
- ver1: dot-delimited string in 'x.y.z' form
- ver2: dot-delimited string in 'x.y.z' form
+ ver1: version string
+ ver2: version string
Returns:
int: 1 if ver1 > ver2
0 if ver1 == ver2
-1 if ver1 < ver2
"""
- v1 = [int(x) for x in ver1.split('.')]
- v2 = [int(x) for x in ver2.split('.')]
- return cmp(v1, v2)
+ ax = re.split('[.-]', ver1)
+ ay = re.split('[.-]', ver2)
+ while len(ax) > 0 and len(ay) > 0:
+ cx = ax.pop(0)
+ cy = ay.pop(0)
+ maxlen = max(len(cx), len(cy))
+ c = cmp(cx.zfill(maxlen), cy.zfill(maxlen))
+ if c != 0:
+ return c
+ return cmp(len(ax), len(ay))
--- autotest/client/common_lib/utils_unittest.py 2010-04-12
09:44:38.000000000 -0700
+++ autotest/client/common_lib/utils_unittest.py 2010-04-14
10:41:07.000000000 -0700
@@ -711,16 +711,37 @@
class test_compare_versions(unittest.TestCase):
- def test_less_than(self):
- self.assertEqual(utils.compare_versions('1.2.3', '1.7.5'), -1)
+ def test_zerofill(self):
+ self.assertEqual(utils.compare_versions('1.7', '1.10'), -1)
+ self.assertEqual(utils.compare_versions('1.222', '1.3'), 1)
+ self.assertEqual(utils.compare_versions('1.03', '1.3'), 0)
- def test_equal(self):
- self.assertEqual(utils.compare_versions('1.2.3', '1.2.3'), 0)
+ def test_unequal_len(self):
+ self.assertEqual(utils.compare_versions('1.3', '1.3.4'), -1)
+ self.assertEqual(utils.compare_versions('1.3.1', '1.3'), 1)
- def test_greater_than(self):
- self.assertEqual(utils.compare_versions('1.3.3', '1.2.3'), 1)
+ def test_dash_delimited(self):
+ self.assertEqual(utils.compare_versions('1-2-3', '1-5-1'), -1)
+ self.assertEqual(utils.compare_versions('1-2-1', '1-1-1'), 1)
+ self.assertEqual(utils.compare_versions('1-2-4', '1-2-4'), 0)
+
+
+ def test_alphabets(self):
+ self.assertEqual(utils.compare_versions('m.l.b', 'n.b.a'), -1)
+ self.assertEqual(utils.compare_versions('n.b.a', 'm.l.b'), 1)
+ self.assertEqual(utils.compare_versions('abc.e', 'abc.e'), 0)
+
+
+ def test_mix_symbols(self):
+ self.assertEqual(utils.compare_versions('k-320.1', 'k-320.3'), -1)
+ self.assertEqual(utils.compare_versions('k-231.5', 'k-231.1'), 1)
+ self.assertEqual(utils.compare_versions('k-231.1', 'k-231.1'), 0)
+
+ self.assertEqual(utils.compare_versions('k.320-1', 'k.320-3'), -1)
+ self.assertEqual(utils.compare_versions('k.231-5', 'k.231-1'), 1)
+ self.assertEqual(utils.compare_versions('k.231-1', 'k.231-1'), 0)
if __name__ == "__main__":
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest