From 4c428b5dc466d7cf332c2cdf43d4236ff702d03e Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Thu, 7 Apr 2016 11:43:50 +0200 Subject: [PATCH] Platform: build numbers: cleanup + additional tests for update checker --- .../extensionResources/ResourceVersions.java | 2 +- .../intellij/errorreport/itn/ITNProxy.java | 2 +- .../src/com/intellij/idea/IdeaLogger.java | 2 +- .../src/com/intellij/idea/StartupUtil.java | 2 +- .../impl/welcomeScreen/FlatWelcomeFrame.java | 2 +- .../ide/plugins/PluginManagerTest.java | 8 +++ .../ide/updates/UpdateStrategyTest.kt | 71 +++++++++++++++++++ .../intellij/openapi/util/BuildNumber.java | 64 +++++++++-------- .../openapi/util/BuildNumberTest.java | 50 +++++++------ 9 files changed, 148 insertions(+), 55 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/extensionResources/ResourceVersions.java b/platform/lang-impl/src/com/intellij/ide/extensionResources/ResourceVersions.java index 8048c1e75389..e015e7c1b260 100644 --- a/platform/lang-impl/src/com/intellij/ide/extensionResources/ResourceVersions.java +++ b/platform/lang-impl/src/com/intellij/ide/extensionResources/ResourceVersions.java @@ -112,7 +112,7 @@ class ResourceVersions implements PersistentStateComponent + + """) + assertEquals("143.2332.10", result.newBuild?.number.toString()) + + result = check("IU-143.2332.10", ChannelStatus.RELEASE, """ + + + """) + assertEquals("143.2333", result.newBuild?.number.toString()) + + result = check("IU-143.2332.9", ChannelStatus.RELEASE, """ + + + """) + assertEquals("143.2332.10", result.newBuild?.number.toString()) + + result = check("IU-143.2332.11", ChannelStatus.RELEASE, """ + + + """) + assertNull(result.newBuild) + } + + @Test fun `year-based build numbers are supported`() { + var result = check("IU-145.100", ChannelStatus.RELEASE, """ + + + """) + assertEquals("2016.1.10.10", result.newBuild?.number.toString()) + + result = check("IU-2016.1.10.10", ChannelStatus.RELEASE, """ + + + """) + assertEquals("2017.1.1.1", result.newBuild?.number.toString()) + + result = check("IU-2016.1.10.10", ChannelStatus.RELEASE, """ + + + """) + assertEquals("2016.2.10.10", result.newBuild?.number.toString()) + + result = check("IU-2016.1.10.10", ChannelStatus.RELEASE, """ + + + """) + assertEquals("2016.1.11.10", result.newBuild?.number.toString()) + + result = check("IU-2016.1.10.10", ChannelStatus.RELEASE, """ + + + """) + assertEquals("2016.1.10.11", result.newBuild?.number.toString()) + + result = check("IU-2016.1.10.10", ChannelStatus.RELEASE, """ + + + """) + assertNull(result.newBuild) + + // e.g. android-studio format + result = check("IU-2016.1.10.10.20161111", ChannelStatus.RELEASE, """ + + + """) + assertEquals("IU-2016.1.10.10.20161112", result.newBuild?.number.toString()) + } + private fun check(currentBuild: String, selectedChannel: ChannelStatus, testData: String, diff --git a/platform/util/src/com/intellij/openapi/util/BuildNumber.java b/platform/util/src/com/intellij/openapi/util/BuildNumber.java index 73efdf0a16ff..b31473ab6fd5 100644 --- a/platform/util/src/com/intellij/openapi/util/BuildNumber.java +++ b/platform/util/src/com/intellij/openapi/util/BuildNumber.java @@ -18,6 +18,7 @@ package com.intellij.openapi.util; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import gnu.trove.TIntArrayList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -30,8 +31,6 @@ import java.util.List; * @author max */ public class BuildNumber implements Comparable { - public enum Format { HISTORIC, BRANCH_BASED, YEAR_BASED } - private static final String BUILD_NUMBER = "__BUILD_NUMBER__"; private static final String STAR = "*"; private static final String SNAPSHOT = "SNAPSHOT"; @@ -44,16 +43,14 @@ public class BuildNumber implements Comparable { } @NotNull private final String myProductCode; - @NotNull private final Format myFormat; private final int[] myComponents; public BuildNumber(@NotNull String productCode, int baselineVersion, int buildNumber) { - this(productCode, Format.BRANCH_BASED, baselineVersion, buildNumber); + this(productCode, new int[]{baselineVersion, buildNumber}); } - BuildNumber(@NotNull String productCode, @NotNull Format format, int... components) { + public BuildNumber(@NotNull String productCode, int... components) { myProductCode = productCode; - myFormat = format; myComponents = components; } @@ -61,10 +58,6 @@ public class BuildNumber implements Comparable { return asString(true, true); } - public String asStringWithAllDetails() { - return asString(true, true); - } - public String asStringWithoutProductCode() { return asString(false, true); } @@ -103,7 +96,7 @@ public class BuildNumber implements Comparable { if (BUILD_NUMBER.equals(version) || SNAPSHOT.equals(version)) { final String productCode = name != null ? name : ""; - return new BuildNumber(productCode, Holder.CURRENT_VERSION.getFormat(), Holder.CURRENT_VERSION.myComponents); + return new BuildNumber(productCode, Holder.CURRENT_VERSION.myComponents); } String code = version; @@ -131,14 +124,22 @@ public class BuildNumber implements Comparable { throw new RuntimeException("Invalid version number: " + version + "; plugin name: " + name); } - if (baselineVersion >= 2016) { + if (isYearBased(baselineVersion)) { List stringComponents = StringUtil.split(code, "."); - int[] intComponents = new int[stringComponents.size()]; - for (int i = 0; i < stringComponents.size(); i++) { - intComponents[i] = parseBuildNumber(version, stringComponents.get(i), name); + TIntArrayList intComponentsList = new TIntArrayList(); + + for (String stringComponent : stringComponents) { + int comp = parseBuildNumber(version, stringComponent, name); + intComponentsList.add(comp); + if (comp == SNAPSHOT_VALUE) break; } - return new BuildNumber(productCode, Format.YEAR_BASED, intComponents); + int[] intComponents = intComponentsList.toNativeArray(); + if (intComponents[1] != SNAPSHOT_VALUE) { + intComponents[1] = normalizedYearRevision(intComponents); + } + + return new BuildNumber(productCode, intComponents); } else { code = code.substring(baselineVersionSeparator + 1); @@ -153,10 +154,10 @@ public class BuildNumber implements Comparable { buildNumber = parseBuildNumber(version, code, name); if (attemptInfo != null) { - return new BuildNumber(productCode, Format.BRANCH_BASED, baselineVersion, buildNumber, attemptInfo); + return new BuildNumber(productCode, baselineVersion, buildNumber, attemptInfo); } else { - return new BuildNumber(productCode, Format.BRANCH_BASED, baselineVersion, buildNumber); + return new BuildNumber(productCode, baselineVersion, buildNumber); } } } @@ -165,15 +166,15 @@ public class BuildNumber implements Comparable { if (buildNumber <= 2000) { // it's probably a baseline, not a build number - return new BuildNumber(productCode, Format.BRANCH_BASED, buildNumber, 0); + return new BuildNumber(productCode, buildNumber, 0); } - if (buildNumber >= 2016 && buildNumber <= 2999) { - return new BuildNumber(productCode, Format.YEAR_BASED, buildNumber, 0); + if (isYearBased(buildNumber)) { + return new BuildNumber(productCode, buildNumber, 0); } baselineVersion = getBaseLineForHistoricBuilds(buildNumber); - return new BuildNumber(productCode, Format.HISTORIC, baselineVersion, buildNumber); + return new BuildNumber(productCode, baselineVersion, buildNumber); } } @@ -238,21 +239,28 @@ public class BuildNumber implements Comparable { } public int getBaselineVersion() { - return myFormat == Format.YEAR_BASED ? (myComponents[0] * 10 + myComponents[1]) : myComponents[0]; + return isYearBased() ? (myComponents[0] * 10 + normalizedYearRevision(myComponents)) : myComponents[0]; + } + + private static int normalizedYearRevision(int[] components) { + return Math.min(components[1], 9); } @Deprecated public int getBuildNumber() { - return myFormat == Format.YEAR_BASED ? -1 : myComponents[1]; + return isYearBased() ? -1 : myComponents[1]; } public int[] getComponents() { return myComponents; } - @NotNull - public Format getFormat() { - return myFormat; + public boolean isYearBased() { + return isYearBased(myComponents[0]); + } + + private static boolean isYearBased(int buildNumber) { + return buildNumber >= 2016 && buildNumber <= 2999; } @Override @@ -262,7 +270,6 @@ public class BuildNumber implements Comparable { BuildNumber that = (BuildNumber)o; - if (myFormat != that.myFormat) return false; if (!myProductCode.equals(that.myProductCode)) return false; if (!Arrays.equals(myComponents, that.myComponents)) return false; @@ -273,7 +280,6 @@ public class BuildNumber implements Comparable { public int hashCode() { int result = myProductCode.hashCode(); result = 31 * result + Arrays.hashCode(myComponents); - result = 31 * result + myFormat.hashCode(); return result; } diff --git a/platform/util/testSrc/com/intellij/openapi/util/BuildNumberTest.java b/platform/util/testSrc/com/intellij/openapi/util/BuildNumberTest.java index c0c73c33c950..ad148f5737eb 100644 --- a/platform/util/testSrc/com/intellij/openapi/util/BuildNumberTest.java +++ b/platform/util/testSrc/com/intellij/openapi/util/BuildNumberTest.java @@ -28,40 +28,48 @@ public class BuildNumberTest { @Test public void historicBuild() { - assertEquals(new BuildNumber("", BuildNumber.Format.HISTORIC, 75, 7512), BuildNumber.fromString("7512")); + assertEquals(new BuildNumber("", 75, 7512), BuildNumber.fromString("7512")); assertEquals("75.7512", BuildNumber.fromString("7512").asString()); } @Test public void branchBasedBuild() throws Exception { - assertParsed(BuildNumber.fromString("145"), 145, 0, BuildNumber.Format.BRANCH_BASED, "145.0"); - assertParsed(BuildNumber.fromString("145.1"), 145, 1, BuildNumber.Format.BRANCH_BASED, "145.1"); - assertParsed(BuildNumber.fromString("145.1.2"), 145, 1, BuildNumber.Format.BRANCH_BASED, "145.1.2"); - assertParsed(BuildNumber.fromString("IU-145.1.2"), 145, 1, BuildNumber.Format.BRANCH_BASED, "IU-145.1.2"); - assertParsed(BuildNumber.fromString("IU-145.SNAPSHOT"), 145, BuildNumber.SNAPSHOT_VALUE, BuildNumber.Format.BRANCH_BASED, "IU-145.SNAPSHOT"); - assertParsed(BuildNumber.fromString("IU-145.1.SNAPSHOT"), 145, 1, BuildNumber.Format.BRANCH_BASED, "IU-145.1.SNAPSHOT"); + assertParsed(BuildNumber.fromString("145"), 145, 0, false, "145.0"); + assertParsed(BuildNumber.fromString("145.1"), 145, 1, false, "145.1"); + assertParsed(BuildNumber.fromString("145.1.2"), 145, 1, false, "145.1.2"); + assertParsed(BuildNumber.fromString("IU-145.1.2"), 145, 1, false, "IU-145.1.2"); + assertParsed(BuildNumber.fromString("IU-145.SNAPSHOT"), 145, BuildNumber.SNAPSHOT_VALUE, false, "IU-145.SNAPSHOT"); + assertParsed(BuildNumber.fromString("IU-145.1.SNAPSHOT"), 145, 1, false, "IU-145.1.SNAPSHOT"); } @Test public void yearBasedBuild() throws Exception { - assertParsed(BuildNumber.fromString("2016"), 20160, -1, BuildNumber.Format.YEAR_BASED, "2016.0"); - assertParsed(BuildNumber.fromString("2016.1"), 20161, -1, BuildNumber.Format.YEAR_BASED, "2016.1"); - assertParsed(BuildNumber.fromString("2016.1.2"), 20161, -1, BuildNumber.Format.YEAR_BASED, "2016.1.2"); - assertParsed(BuildNumber.fromString("IU-2016.1.2"), 20161, -1, BuildNumber.Format.YEAR_BASED, "IU-2016.1.2"); - assertParsed(BuildNumber.fromString("2016.1.2.3"), 20161, -1, BuildNumber.Format.YEAR_BASED, "2016.1.2.3"); - assertParsed(BuildNumber.fromString("IU-2016.1.2.3"), 20161, -1, BuildNumber.Format.YEAR_BASED, "IU-2016.1.2.3"); - assertParsed(BuildNumber.fromString("2016.1.2.3.4"), 20161, -1, BuildNumber.Format.YEAR_BASED, "2016.1.2.3.4"); - assertParsed(BuildNumber.fromString("IU-2016.1.2.3.4"), 20161, -1, BuildNumber.Format.YEAR_BASED, "IU-2016.1.2.3.4"); + assertParsed(BuildNumber.fromString("2016"), 20160, -1, true, "2016.0"); + assertParsed(BuildNumber.fromString("2016.1"), 20161, -1, true, "2016.1"); + assertParsed(BuildNumber.fromString("2016.1.2"), 20161, -1, true, "2016.1.2"); + assertParsed(BuildNumber.fromString("IU-2016.1.2"), 20161, -1, true, "IU-2016.1.2"); + assertParsed(BuildNumber.fromString("2016.1.2.3"), 20161, -1, true, "2016.1.2.3"); + assertParsed(BuildNumber.fromString("IU-2016.1.2.3"), 20161, -1, true, "IU-2016.1.2.3"); + assertParsed(BuildNumber.fromString("2016.1.2.3.4"), 20161, -1, true, "2016.1.2.3.4"); + assertParsed(BuildNumber.fromString("IU-2016.1.2.3.4"), 20161, -1, true, "IU-2016.1.2.3.4"); - assertParsed(BuildNumber.fromString("IU-2016.1.SNAPSHOT"), 20161, -1, BuildNumber.Format.YEAR_BASED, "IU-2016.1.SNAPSHOT"); - assertParsed(BuildNumber.fromString("IU-2016.1.SNAPSHOT.1"), 20161, -1, BuildNumber.Format.YEAR_BASED, "IU-2016.1.SNAPSHOT.1"); + assertParsed(BuildNumber.fromString("IU-2016.1.SNAPSHOT"), 20161, -1, true, "IU-2016.1.SNAPSHOT"); + assertParsed(BuildNumber.fromString("IU-2016.1.SNAPSHOT.1"), 20161, -1, true, "IU-2016.1.SNAPSHOT"); + + assertParsed(BuildNumber.fromString("IU-2016.*"), 20169, -1, true, "IU-2016.SNAPSHOT"); + assertParsed(BuildNumber.fromString("IU-2016.SNAPSHOT"), 20169, -1, true, "IU-2016.SNAPSHOT"); + + assertParsed(BuildNumber.fromString("IU-2016.9"), 20169, -1, true, "IU-2016.9"); + assertParsed(BuildNumber.fromString("IU-2016.10"), 20169, -1, true, "IU-2016.9"); + assertParsed(BuildNumber.fromString("IU-2016.100"), 20169, -1, true, "IU-2016.9"); + assertParsed(BuildNumber.fromString("IU-2016.1000.1000.1000"), 20169, -1, true, "IU-2016.9.1000.1000"); } - private static void assertParsed(BuildNumber n, int expectedBaseline, int expectedBuildNumber, BuildNumber.Format based, String asString) { + private static void assertParsed(BuildNumber n, int expectedBaseline, int expectedBuildNumber, boolean yearBased, String asString) { assertEquals(expectedBaseline, n.getBaselineVersion()); assertEquals(expectedBuildNumber, n.getBuildNumber()); assertEquals(asString, n.asString()); - assertEquals(based, n.getFormat()); + assertEquals(yearBased, n.isYearBased()); } @Test @@ -164,8 +172,8 @@ public class BuildNumberTest { @Test public void fallbackVersion() throws Exception { - assertParsed(BuildNumber.fallback(), 29991, -1, BuildNumber.Format.YEAR_BASED, "2999.1.SNAPSHOT"); - assertEquals(BuildNumber.Format.YEAR_BASED, BuildNumber.fallback().getFormat()); + assertParsed(BuildNumber.fallback(), 29991, -1, true, "2999.1.SNAPSHOT"); + assertTrue(BuildNumber.fallback().isYearBased()); assertTrue(BuildNumber.fallback().isSnapshot()); assertTrue(BuildNumber.fallback().compareTo(BuildNumber.fromString("7512")) > 0);