Repository: hbase Updated Branches: refs/heads/branch-1 011989665 -> 345567d71
HBASE-20444 Improve comparison logic for HBase version strings Signed-off-by: Sean Busbey <[email protected]> Conflicts: hbase-common/src/main/java/org/apache/hadoop/hbase/util/VersionInfo.java Amended to use commons-lang 2, where isNumeric("") -> true Amending-Author: Sean Busbey <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/345567d7 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/345567d7 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/345567d7 Branch: refs/heads/branch-1 Commit: 345567d7140a757c5ead66c2cb55f2c59cab4732 Parents: 0119896 Author: maoling <[email protected]> Authored: Mon May 21 17:38:10 2018 +0800 Committer: Sean Busbey <[email protected]> Committed: Wed May 30 10:25:14 2018 -0500 ---------------------------------------------------------------------- .../apache/hadoop/hbase/util/VersionInfo.java | 72 ++++++++++++-------- .../hadoop/hbase/util/TestVersionInfo.java | 20 +++++- 2 files changed, 62 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/345567d7/hbase-common/src/main/java/org/apache/hadoop/hbase/util/VersionInfo.java ---------------------------------------------------------------------- diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/VersionInfo.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/VersionInfo.java index ae5b403..d4052eb 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/VersionInfo.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/VersionInfo.java @@ -23,6 +23,7 @@ import java.io.PrintStream; import java.io.PrintWriter; import org.apache.commons.logging.Log; +import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hbase.Version; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.classification.InterfaceStability; @@ -119,41 +120,54 @@ public class VersionInfo { if (v1.equals(v2)) { return 0; } - - String s1[] = v1.split("\\.|-");//1.2.3-hotfix -> [1, 2, 3, hotfix] - String s2[] = v2.split("\\.|-"); - int index = 0; - while (index < s1.length && index < s2.length) { - int va = VERY_LARGE_NUMBER, vb = VERY_LARGE_NUMBER; - try { - va = Integer.parseInt(s1[index]); - } catch (Exception ingore) { - } - try { - vb = Integer.parseInt(s2[index]); - } catch (Exception ingore) { - } - if (va != vb) { - return va - vb; + String[] v1Comps = getVersionComponents(v1); + String[] v2Comps = getVersionComponents(v2); + + int length = Math.max(v1Comps.length, v2Comps.length); + for (int i = 0; i < length; i++) { + Integer va = i < v1Comps.length ? Integer.parseInt(v1Comps[i]) : 0; + Integer vb = i < v2Comps.length ? Integer.parseInt(v2Comps[i]) : 0; + int compare = va.compareTo(vb); + if (compare != 0) { + return compare; } - if (va == VERY_LARGE_NUMBER) { - // compare as String - int c = s1[index].compareTo(s2[index]); - if (c != 0) { - return c; + } + return 0; + } + + /** + * Returns the version components as String objects + * Examples: "1.2.3" returns ["1", "2", "3"], "4.5.6-SNAPSHOT" returns ["4", "5", "6", "-1"] + * "4.5.6-beta" returns ["4", "5", "6", "-2"], "4.5.6-alpha" returns ["4", "5", "6", "-3"] + * "4.5.6-UNKNOW" returns ["4", "5", "6", "-4"] + * @return the components of the version string + */ + static String[] getVersionComponents(final String version) { + assert(version != null); + String[] strComps = version.split("[\\.-]"); + assert(strComps.length > 0); + + String[] comps = new String[strComps.length]; + for (int i = 0; i < strComps.length; ++i) { + if (StringUtils.isEmpty(strComps[i])) { + comps[i] = String.valueOf(VERY_LARGE_NUMBER); + } else if (StringUtils.isNumeric(strComps[i])) { + comps[i] = strComps[i]; + } else { + if("SNAPSHOT".equals(strComps[i])) { + comps[i] = "-1"; + } else if("beta".equals(strComps[i])) { + comps[i] = "-2"; + } else if("alpha".equals(strComps[i])) { + comps[i] = "-3"; + } else { + comps[i] = "-4"; } } - index++; } - if (index < s1.length) { - // s1 is longer - return 1; - } - //s2 is longer - return -1; + return comps; } - public static void main(String[] args) { writeTo(System.out); } http://git-wip-us.apache.org/repos/asf/hbase/blob/345567d7/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestVersionInfo.java ---------------------------------------------------------------------- diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestVersionInfo.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestVersionInfo.java index 896c524..371d03d 100644 --- a/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestVersionInfo.java +++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/util/TestVersionInfo.java @@ -30,6 +30,24 @@ public class TestVersionInfo { assertTrue(VersionInfo.compareVersion("1.0.0", "0.98.11") > 0); assertTrue(VersionInfo.compareVersion("0.98.11", "1.0.1") < 0); assertTrue(VersionInfo.compareVersion("2.0.0", "1.4.0") > 0); - assertTrue(VersionInfo.compareVersion("2.0.0", "2.0.0-SNAPSHOT") < 0); + assertTrue(VersionInfo.compareVersion("2.0.0", "2.0.0-SNAPSHOT") > 0); + assertTrue(VersionInfo.compareVersion("0.94.6.1", "0.96.1.1") < 0); + assertTrue(VersionInfo.compareVersion("0.96.1.1", "0.98.6.1") < 0); + assertTrue(VersionInfo.compareVersion("0.98.6.1", "0.98.10.1") < 0); + assertTrue(VersionInfo.compareVersion("0.98.10.1", "0.98.12.1") < 0); + assertTrue(VersionInfo.compareVersion("0.98.12.1", "0.98.16.1") < 0); + assertTrue(VersionInfo.compareVersion("0.98.16.1", "1.0.1.1") < 0); + assertTrue(VersionInfo.compareVersion("1.0.1.1", "1.1.0.1") < 0); + assertTrue(VersionInfo.compareVersion("2.0..1", "2.0.0") > 0); + assertTrue(VersionInfo.compareVersion("2.0.0", "2.0.0") == 0); + assertTrue(VersionInfo.compareVersion("1.99.14", "2.0.0-alpha-1") < 0); + assertTrue(VersionInfo.compareVersion("2.0.0-alpha-1", "2.0.0-beta-3") < 0); + assertTrue(VersionInfo.compareVersion("2.0.0-beta-3", "2.0.0-SNAPSHOT") < 0); + assertTrue(VersionInfo.compareVersion("2.0.0-SNAPSHOT", "2.0") < 0); + assertTrue(VersionInfo.compareVersion("2.0", "2.0.0.1") < 0); + assertTrue(VersionInfo.compareVersion("2.0.0.1", "2.0.1") < 0); + assertTrue(VersionInfo.compareVersion("3.0.0-alpha-2", "3.0.0-alpha-11") < 0); + assertTrue(VersionInfo.compareVersion("3.0.0-beta-2", "3.0.0-beta-11") < 0); + assertTrue(VersionInfo.compareVersion("2.0.0-foobar", "2.0.0.1") < 0); } } \ No newline at end of file
