Browse Source

AMBARI-10968. ambari_server/utils.py should be able to parse version with postfix text (Di Li via alejandro)

Alejandro Fernandez 10 years ago
parent
commit
d636d70d7a

+ 19 - 0
ambari-server/src/main/python/ambari_server/utils.py

@@ -248,7 +248,26 @@ def get_postgre_running_status():
 
 
 def compare_versions(version1, version2):
+  """Compare two versions by digits. Ignore any alphanumeric characters after - and _ postfix.
+  Return 1 if version1 is newer than version2
+  Return -1 if version1 is older than version2
+  Return 0 if two versions are the same
+  """
   def normalize(v):
+    v = str(v)
+    v = re.sub(r'^\D+', '', v)
+    v = re.sub(r'\D+$', '', v)
+    v = v.strip(".-_")
+    pos_under = v.find("_")
+    pos_dash = v.find("-")
+    if pos_under > 0 and pos_dash < 0:
+      pos = pos_under
+    elif pos_under < 0 and pos_dash > 0:
+      pos = pos_dash
+    else:
+      pos = min(pos_under, pos_dash)
+    if pos > 0:
+      v = v[0:pos]
     return [int(x) for x in re.sub(r'(\.0+)*$', '', v).split(".")]
   return cmp(normalize(version1), normalize(version2))
   pass

+ 16 - 0
ambari-server/src/test/python/TestUtils.py

@@ -226,3 +226,19 @@ class TestUtils(TestCase):
     # now supply keyword args to override env params
     formatted_message = formatter.format(message, envfoo="foobar", envbar="foobarbaz", foo="foo3", bar="bar3")
     self.assertEquals("foo3 bar3 foobar foobarbaz", formatted_message)
+
+  def test_compare_versions(self):
+    self.assertEquals(utils.compare_versions("1.7.0", "2.0.0"), -1)
+    self.assertEquals(utils.compare_versions("2.0.0", "2.0.0"), 0)
+    self.assertEquals(utils.compare_versions("2.1.0", "2.0.0"), 1)
+
+    self.assertEquals(utils.compare_versions("1.7.0_abc", "2.0.0-abc"), -1)
+    self.assertEquals(utils.compare_versions("2.0.0.abc", "2.0.0_abc"), 0)
+    self.assertEquals(utils.compare_versions("2.1.0-abc", "2.0.0.abc"), 1)
+
+    self.assertEquals(utils.compare_versions("2.1.0-1","2.0.0-2"),1)
+    self.assertEquals(utils.compare_versions("2.0.0_1","2.0.0-2"),0)
+    self.assertEquals(utils.compare_versions("2.0.0-1","2.0.0-2"),0)
+    self.assertEquals(utils.compare_versions("2.0.0_1","2.0.0_2"),0)
+    self.assertEquals(utils.compare_versions("2.0.0-abc","2.0.0_abc"),0)
+