From 7dd089a900975274c31293321b2981980964d15e Mon Sep 17 00:00:00 2001 From: andsel Date: Mon, 5 Jul 2021 14:32:59 +0200 Subject: [PATCH 1/9] Moved the code to select the stack version from build to script to buildSrc utility class --- build.gradle | 12 +++---- buildSrc/build.gradle | 8 +++++ .../tooling/StackVersionSelector.groovy | 32 +++++++++++++++++++ .../tooling/StackVersionSelectorTest.groovy | 30 +++++++++++++++++ 4 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 buildSrc/build.gradle create mode 100644 buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy create mode 100644 buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy diff --git a/build.gradle b/build.gradle index 546427c8969..77a4cf63dec 100644 --- a/build.gradle +++ b/build.gradle @@ -41,6 +41,7 @@ apply from: "rubyUtils.gradle" import org.yaml.snakeyaml.Yaml import de.undercouch.gradle.tasks.download.Download import groovy.json.JsonSlurper +import org.logstash.gradle.tooling.StackVersionSelector allprojects { group = 'org.logstash' @@ -163,17 +164,12 @@ tasks.register("configureArtifactInfo") { version = "$version-$versionQualifier" } - def isReleaseBuild = System.getenv('RELEASE') == "1" || versionQualifier - String apiResponse = artifactVersionsApi.toURL().text + def versionSelector = new StackVersionSelector(artifactVersionsApi) + String qualifiedVersion = versionSelector.selectClosestVersion(version) - def dlVersions = new JsonSlurper().parseText(apiResponse) - String qualifiedVersion = dlVersions['versions'].grep(isReleaseBuild ? ~/^${version}$/ : ~/^${version}-SNAPSHOT/)[0] - if (qualifiedVersion == null) { - throw new GradleException("could not find the current artifact from the artifact-api ${artifactVersionsApi} for ${version}") - } // find latest reference to last build String buildsListApi = "${artifactVersionsApi}/${qualifiedVersion}/builds/" - apiResponse = buildsListApi.toURL().text + def apiResponse = buildsListApi.toURL().text def dlBuilds = new JsonSlurper().parseText(apiResponse) def stackBuildVersion = dlBuilds["builds"][0] diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 00000000000..c29d6d06a0e --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,8 @@ +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'junit:junit:4.13' +} + diff --git a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy new file mode 100644 index 00000000000..783cd60093a --- /dev/null +++ b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy @@ -0,0 +1,32 @@ +package org.logstash.gradle.tooling + +import org.gradle.api.GradleException +import groovy.json.JsonSlurper + +class StackVersionSelector { + + private final String artifactVersionsApi + + public StackVersionSelector(String artifactVersionsApi) { + this.artifactVersionsApi = artifactVersionsApi + } + + def selectClosestVersion(String version) { + String apiResponse = artifactVersionsApi.toURL().text + def dlVersions = new JsonSlurper().parseText(apiResponse) + List versions = dlVersions['versions'] + + def versionQualifier = System.getenv('VERSION_QUALIFIER') + def isReleaseBuild = System.getenv('RELEASE') == "1" || versionQualifier + + String qualifiedVersion = selectClosestInList(isReleaseBuild ? version : "${version}-SNAPSHOT", versions) + if (qualifiedVersion == null) { + throw new GradleException("could not find the current artifact from the artifact-api ${artifactVersionsApi} for ${version}") + } + qualifiedVersion + } + + protected def selectClosestInList(String version, List availableVersions) { + availableVersions.grep( ~/^${version}/)[0] + } +} \ No newline at end of file diff --git a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy new file mode 100644 index 00000000000..eee88cb2470 --- /dev/null +++ b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy @@ -0,0 +1,30 @@ +package org.logstash.gradle.tooling + +import org.junit.Test + +import static org.junit.Assert.assertEquals +import static org.junit.Assert.assertFalse +import static org.junit.Assert.assertNull +import static org.junit.Assert.assertTrue + +class StackVersionSelectorTest { + + @Test + void "selectClosestInList should return the exact match when present"() { + def sut = new StackVersionSelector("") + + def result = sut.selectClosestInList("7.14.0", [ + "6.8.17-SNAPSHOT", + "6.8.17", + "7.13.2-SNAPSHOT", + "7.13.2", + "7.13.3-SNAPSHOT", + "7.13.3", + "7.14.0-SNAPSHOT", + "7.14.0", + "8.0.0-SNAPSHOT" + ]) + + assert "7.14.0" == result + } +} \ No newline at end of file From 968b39fb3b168adcbc14422811fde4b572957ff9 Mon Sep 17 00:00:00 2001 From: andsel Date: Mon, 5 Jul 2021 14:44:46 +0200 Subject: [PATCH 2/9] Minor, extracted common code --- .../tooling/StackVersionSelectorTest.groovy | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy index eee88cb2470..5a4aa7f2a22 100644 --- a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy +++ b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy @@ -1,6 +1,7 @@ package org.logstash.gradle.tooling import org.junit.Test +import org.junit.Before import static org.junit.Assert.assertEquals import static org.junit.Assert.assertFalse @@ -9,22 +10,27 @@ import static org.junit.Assert.assertTrue class StackVersionSelectorTest { - @Test - void "selectClosestInList should return the exact match when present"() { - def sut = new StackVersionSelector("") + def versionsFixture = [ + "6.8.17-SNAPSHOT", + "6.8.17", + "7.13.2-SNAPSHOT", + "7.13.2", + "7.13.3-SNAPSHOT", + "7.13.3", + "7.14.0-SNAPSHOT", + "7.14.0", + "8.0.0-SNAPSHOT" + ] + + def sut - def result = sut.selectClosestInList("7.14.0", [ - "6.8.17-SNAPSHOT", - "6.8.17", - "7.13.2-SNAPSHOT", - "7.13.2", - "7.13.3-SNAPSHOT", - "7.13.3", - "7.14.0-SNAPSHOT", - "7.14.0", - "8.0.0-SNAPSHOT" - ]) + @Before + void setUp() { + sut = new StackVersionSelector("") + } - assert "7.14.0" == result + @Test + void "selectClosestInList should return the exact match when present"() { + assert "7.14.0" == sut.selectClosestInList("7.14.0", versionsFixture) } } \ No newline at end of file From c371a7a153decd0e7583221ee62edbf8ddf11fd0 Mon Sep 17 00:00:00 2001 From: andsel Date: Mon, 5 Jul 2021 16:47:35 +0200 Subject: [PATCH 3/9] Implemented the logic to switch to 'latest published version close to the one selected' when exact stack version match is not yet available --- build.gradle | 3 + .../tooling/StackVersionSelector.groovy | 89 +++++++++++++++++-- .../tooling/StackVersionSelectorTest.groovy | 41 +++++++-- 3 files changed, 123 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 77a4cf63dec..27213c56167 100644 --- a/build.gradle +++ b/build.gradle @@ -166,6 +166,9 @@ tasks.register("configureArtifactInfo") { def versionSelector = new StackVersionSelector(artifactVersionsApi) String qualifiedVersion = versionSelector.selectClosestVersion(version) + if (qualifiedVersion != version) { + println "WARN version $version not yet published, swith automatically to $qualifiedVersion" + } // find latest reference to last build String buildsListApi = "${artifactVersionsApi}/${qualifiedVersion}/builds/" diff --git a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy index 783cd60093a..b60ab41c7f2 100644 --- a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy +++ b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy @@ -5,11 +5,12 @@ import groovy.json.JsonSlurper class StackVersionSelector { - private final String artifactVersionsApi + private final String artifactVersionsApi + private final def versionComparator = new VersionComparator() - public StackVersionSelector(String artifactVersionsApi) { - this.artifactVersionsApi = artifactVersionsApi - } + public StackVersionSelector(String artifactVersionsApi) { + this.artifactVersionsApi = artifactVersionsApi + } def selectClosestVersion(String version) { String apiResponse = artifactVersionsApi.toURL().text @@ -26,7 +27,85 @@ class StackVersionSelector { qualifiedVersion } + /** + * Suppose availableVersions is sorted in such a way that the SNAPSHOT version is before the release version, + * following the natural order of versions: + * 7.10.1-SNAPSHOT + * 7.10.1 + * 7.11.0-SNAPSHOT + * 7.11.0 + * 8.0.0-SNAPSHOT + * 8.0.0-alpha1 + * 8.0.0-alpha2 + * 8.0.0-rc1 + * 8.0.0-rc2 + * 8.0.0 + * */ protected def selectClosestInList(String version, List availableVersions) { - availableVersions.grep( ~/^${version}/)[0] + for (int index = 0; index < availableVersions.size(); index++) { + String currentVersion = availableVersions[index] + if (currentVersion == version) { + return currentVersion + } + if (index == availableVersions.size() - 1) { + // last version + return currentVersion + } + if (versionComparator.compare(currentVersion, version) == -1 && + versionComparator.compare(availableVersions[index + 1], version) == 1) { + // 7.14.0 < 7.15.0 < 8.0.0-SNAPSHOT and 7.15.0 is not yet released + return currentVersion + } + } + throw new IllegalStateException("Never reach this point") + } + + static class VersionComparator implements Comparator { + private static final List VERSION_SUFFIX_ORDER = ["SNAPSHOT", "alpha1", "alpha2", "rc1", "rc2"] + + /** + * @return 1 s > t, + * 0 s == t, + * -1 s < t + * */ + @Override + int compare(String s, String t) { + if (!s.contains("-") && !t.contains("-")) + // no SNAPSHOT version, compare directly + return s <=> t + if (s.contains("-") && t.contains("-")) { + //both have a -SNAPSHOT or -alpha1 etc + String swd = s.split("-")[0] + String twd = t.split("-")[0] + if (swd == twd) { + //for example 8.0.0-SNAPSHOT vs 8.0.0-alpha1 + String sSuffix = s.split("-")[1] + String tSuffix = t.split("-")[1] + int sSuffixOrder = VERSION_SUFFIX_ORDER.indexOf(sSuffix) + int tSuffixOrder = VERSION_SUFFIX_ORDER.indexOf(tSuffix) + if (sSuffixOrder < 0) + throw new IllegalArgumentException("Found illegal version suffix for $s: [$sSuffix]") + if (tSuffixOrder < 0) + throw new IllegalArgumentException("Found illegal version suffix for $t: [$tSuffix]") + + return sSuffixOrder <=> tSuffixOrder + } + // different -SNAPSHOT versions, compare jus the version part + return swd <=> twd + } + // one between s and t has -SNAPSHOT + String swd = s.split("-")[0] + String twd = t.split("-")[0] + if (swd == twd) { + //both are same version + if (s.contains("-")) + // the one with -SNAPSHOT has lower priority + return -1 + else + return 1 + } + + return swd <=> twd + } } } \ No newline at end of file diff --git a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy index 5a4aa7f2a22..561c00a6495 100644 --- a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy +++ b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy @@ -3,11 +3,6 @@ package org.logstash.gradle.tooling import org.junit.Test import org.junit.Before -import static org.junit.Assert.assertEquals -import static org.junit.Assert.assertFalse -import static org.junit.Assert.assertNull -import static org.junit.Assert.assertTrue - class StackVersionSelectorTest { def versionsFixture = [ @@ -33,4 +28,40 @@ class StackVersionSelectorTest { void "selectClosestInList should return the exact match when present"() { assert "7.14.0" == sut.selectClosestInList("7.14.0", versionsFixture) } + + @Test + void "selectClosestInList should return the previous closest version when exact match is not present"() { + assert "7.14.0" == sut.selectClosestInList("7.15.0", versionsFixture) + } + + @Test + void "selectClosestInList should return the greatest version when the version is greater than the max"() { + assert "8.0.0-SNAPSHOT" == sut.selectClosestInList("8.0.0", versionsFixture) + } + + @Test + void "versionComparator tests"() { + def versionComparator = new StackVersionSelector.VersionComparator() + assert -1 == versionComparator.compare("7.1.0", "7.2.1") + assert 1 == versionComparator.compare("7.2.1", "7.1.0") + + assert 1 == versionComparator.compare("7.1.0", "7.1.0-SNAPSHOT") + + assert 1 == versionComparator.compare("7.2.1-SNAPSHOT", "7.1.0-SNAPSHOT") + + assert 1 == versionComparator.compare("7.2.1-SNAPSHOT", "7.1.0") + + assert 1 == versionComparator.compare("7.2.1", "7.1.0-SNAPSHOT") + + assert 1 == versionComparator.compare("8.0.0-alpha1", "7.1.0-SNAPSHOT") + + assert 1 == versionComparator.compare("8.0.0-alpha1", "8.0.0-SNAPSHOT") + + assert 1 == versionComparator.compare("8.0.0-rc1", "8.0.0-alpha2") + + assert 1 == versionComparator.compare("8.0.0", "8.0.0-alpha2") + + assert 1 == versionComparator.compare("8.0.0", "8.0.0-SNAPSHOT") + + } } \ No newline at end of file From 76ec19db6bc6a4c669535682cd5e24d00aa5bf27 Mon Sep 17 00:00:00 2001 From: andsel Date: Mon, 5 Jul 2021 18:51:59 +0200 Subject: [PATCH 4/9] Chaged comparator to a composition of comparators and simplified the user with the introduction of StackVersion as comparable instances --- .../tooling/StackVersionSelector.groovy | 104 +++++++++--------- .../tooling/StackVersionSelectorTest.groovy | 53 ++++----- 2 files changed, 83 insertions(+), 74 deletions(-) diff --git a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy index b60ab41c7f2..9bbf400174b 100644 --- a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy +++ b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy @@ -6,7 +6,6 @@ import groovy.json.JsonSlurper class StackVersionSelector { private final String artifactVersionsApi - private final def versionComparator = new VersionComparator() public StackVersionSelector(String artifactVersionsApi) { this.artifactVersionsApi = artifactVersionsApi @@ -15,12 +14,12 @@ class StackVersionSelector { def selectClosestVersion(String version) { String apiResponse = artifactVersionsApi.toURL().text def dlVersions = new JsonSlurper().parseText(apiResponse) - List versions = dlVersions['versions'] + List versions = dlVersions['versions'].collect {s -> StackVersion.asVersion(s)} def versionQualifier = System.getenv('VERSION_QUALIFIER') def isReleaseBuild = System.getenv('RELEASE') == "1" || versionQualifier - String qualifiedVersion = selectClosestInList(isReleaseBuild ? version : "${version}-SNAPSHOT", versions) + String qualifiedVersion = selectClosestInList(StackVersion.asVersion(isReleaseBuild ? version : "${version}-SNAPSHOT"), versions) if (qualifiedVersion == null) { throw new GradleException("could not find the current artifact from the artifact-api ${artifactVersionsApi} for ${version}") } @@ -41,9 +40,9 @@ class StackVersionSelector { * 8.0.0-rc2 * 8.0.0 * */ - protected def selectClosestInList(String version, List availableVersions) { + protected def selectClosestInList(StackVersion version, List availableVersions) { for (int index = 0; index < availableVersions.size(); index++) { - String currentVersion = availableVersions[index] + StackVersion currentVersion = availableVersions[index] if (currentVersion == version) { return currentVersion } @@ -51,8 +50,7 @@ class StackVersionSelector { // last version return currentVersion } - if (versionComparator.compare(currentVersion, version) == -1 && - versionComparator.compare(availableVersions[index + 1], version) == 1) { + if (currentVersion < version && version < availableVersions[index + 1]) { // 7.14.0 < 7.15.0 < 8.0.0-SNAPSHOT and 7.15.0 is not yet released return currentVersion } @@ -60,52 +58,60 @@ class StackVersionSelector { throw new IllegalStateException("Never reach this point") } - static class VersionComparator implements Comparator { - private static final List VERSION_SUFFIX_ORDER = ["SNAPSHOT", "alpha1", "alpha2", "rc1", "rc2"] - /** - * @return 1 s > t, - * 0 s == t, - * -1 s < t - * */ + static class StackVersion implements Comparable { + final String version + final String suffix + final def comparator = comparator() + + StackVersion(String fullVersion) { + def splits = fullVersion.split("-") + version = splits[0] + if (splits.length == 2) { + suffix = splits[1] + } + } + + def static asVersion(String v) { + new StackVersion(v) + } + + @Override + String toString() { + suffix != null ? "$version-$suffix" : version + } + + static Comparator comparator() { + Comparator.comparing({sv -> sv.version}) + .thenComparing({sv -> sv.suffix}, new SuffixComparator()) + } + + @Override + int compareTo(StackVersion other) { + comparator.compare(this, other) + } + } + + static class SuffixComparator implements Comparator { + + private static final List VERSION_SUFFIX_ORDER = ["SNAPSHOT", "alpha1", "alpha2", "rc1", "rc2", ""] + @Override int compare(String s, String t) { - if (!s.contains("-") && !t.contains("-")) - // no SNAPSHOT version, compare directly - return s <=> t - if (s.contains("-") && t.contains("-")) { - //both have a -SNAPSHOT or -alpha1 etc - String swd = s.split("-")[0] - String twd = t.split("-")[0] - if (swd == twd) { - //for example 8.0.0-SNAPSHOT vs 8.0.0-alpha1 - String sSuffix = s.split("-")[1] - String tSuffix = t.split("-")[1] - int sSuffixOrder = VERSION_SUFFIX_ORDER.indexOf(sSuffix) - int tSuffixOrder = VERSION_SUFFIX_ORDER.indexOf(tSuffix) - if (sSuffixOrder < 0) - throw new IllegalArgumentException("Found illegal version suffix for $s: [$sSuffix]") - if (tSuffixOrder < 0) - throw new IllegalArgumentException("Found illegal version suffix for $t: [$tSuffix]") - - return sSuffixOrder <=> tSuffixOrder - } - // different -SNAPSHOT versions, compare jus the version part - return swd <=> twd - } - // one between s and t has -SNAPSHOT - String swd = s.split("-")[0] - String twd = t.split("-")[0] - if (swd == twd) { - //both are same version - if (s.contains("-")) - // the one with -SNAPSHOT has lower priority - return -1 - else - return 1 - } + if (s == null) + s = "" + if (t == null) + t = "" + + //for example 8.0.0-SNAPSHOT vs 8.0.0-alpha1 + int sSuffixOrder = VERSION_SUFFIX_ORDER.indexOf(s) + int tSuffixOrder = VERSION_SUFFIX_ORDER.indexOf(t) + if (sSuffixOrder < 0) + throw new IllegalArgumentException("Found illegal version suffix: [$s]") + if (tSuffixOrder < 0) + throw new IllegalArgumentException("Found illegal version suffix: [$t]") - return swd <=> twd + return sSuffixOrder <=> tSuffixOrder } } } \ No newline at end of file diff --git a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy index 561c00a6495..985447a7911 100644 --- a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy +++ b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy @@ -3,18 +3,21 @@ package org.logstash.gradle.tooling import org.junit.Test import org.junit.Before +import static org.logstash.gradle.tooling.StackVersionSelector.* +import static org.logstash.gradle.tooling.StackVersionSelector.StackVersion.* + class StackVersionSelectorTest { def versionsFixture = [ - "6.8.17-SNAPSHOT", - "6.8.17", - "7.13.2-SNAPSHOT", - "7.13.2", - "7.13.3-SNAPSHOT", - "7.13.3", - "7.14.0-SNAPSHOT", - "7.14.0", - "8.0.0-SNAPSHOT" + asVersion("6.8.17-SNAPSHOT"), + asVersion("6.8.17"), + asVersion("7.13.2-SNAPSHOT"), + asVersion("7.13.2"), + asVersion("7.13.3-SNAPSHOT"), + asVersion("7.13.3"), + asVersion("7.14.0-SNAPSHOT"), + asVersion("7.14.0"), + asVersion("8.0.0-SNAPSHOT") ] def sut @@ -26,42 +29,42 @@ class StackVersionSelectorTest { @Test void "selectClosestInList should return the exact match when present"() { - assert "7.14.0" == sut.selectClosestInList("7.14.0", versionsFixture) + assert "7.14.0" == sut.selectClosestInList(asVersion("7.14.0"), versionsFixture).toString() } @Test void "selectClosestInList should return the previous closest version when exact match is not present"() { - assert "7.14.0" == sut.selectClosestInList("7.15.0", versionsFixture) + assert "7.14.0" == sut.selectClosestInList(asVersion("7.15.0"), versionsFixture).toString() } @Test void "selectClosestInList should return the greatest version when the version is greater than the max"() { - assert "8.0.0-SNAPSHOT" == sut.selectClosestInList("8.0.0", versionsFixture) + assert "8.0.0-SNAPSHOT" == sut.selectClosestInList(asVersion("8.0.0"), versionsFixture).toString() } @Test - void "versionComparator tests"() { - def versionComparator = new StackVersionSelector.VersionComparator() - assert -1 == versionComparator.compare("7.1.0", "7.2.1") - assert 1 == versionComparator.compare("7.2.1", "7.1.0") + void "compare StackVersion tests"() { + def versionComparator = StackVersionSelector.StackVersion.comparator() - assert 1 == versionComparator.compare("7.1.0", "7.1.0-SNAPSHOT") + assert -1 == versionComparator.compare(asVersion("7.1.0"), asVersion("7.2.1")) + assert 1 == versionComparator.compare(asVersion("7.2.1"), asVersion("7.1.0")) - assert 1 == versionComparator.compare("7.2.1-SNAPSHOT", "7.1.0-SNAPSHOT") + assert 1 == versionComparator.compare(asVersion("7.1.0"), asVersion("7.1.0-SNAPSHOT")) - assert 1 == versionComparator.compare("7.2.1-SNAPSHOT", "7.1.0") + assert 1 == versionComparator.compare(asVersion("7.2.1-SNAPSHOT"), asVersion("7.1.0-SNAPSHOT")) - assert 1 == versionComparator.compare("7.2.1", "7.1.0-SNAPSHOT") + assert 1 == versionComparator.compare(asVersion("7.2.1-SNAPSHOT"), asVersion("7.1.0")) - assert 1 == versionComparator.compare("8.0.0-alpha1", "7.1.0-SNAPSHOT") + assert 1 == versionComparator.compare(asVersion("7.2.1"), asVersion("7.1.0-SNAPSHOT")) - assert 1 == versionComparator.compare("8.0.0-alpha1", "8.0.0-SNAPSHOT") + assert 1 == versionComparator.compare(asVersion("8.0.0-alpha1"), asVersion("7.1.0-SNAPSHOT")) - assert 1 == versionComparator.compare("8.0.0-rc1", "8.0.0-alpha2") + assert 1 == versionComparator.compare(asVersion("8.0.0-alpha1"), asVersion("8.0.0-SNAPSHOT")) - assert 1 == versionComparator.compare("8.0.0", "8.0.0-alpha2") + assert 1 == versionComparator.compare(asVersion("8.0.0-rc1"), asVersion("8.0.0-alpha2")) - assert 1 == versionComparator.compare("8.0.0", "8.0.0-SNAPSHOT") + assert 1 == versionComparator.compare(asVersion("8.0.0"), asVersion("8.0.0-alpha2")) + assert 1 == versionComparator.compare(asVersion("8.0.0"), asVersion("8.0.0-SNAPSHOT")) } } \ No newline at end of file From 63ff439984af426020d11feef7d2f0ea0159bf09 Mon Sep 17 00:00:00 2001 From: andsel Date: Tue, 6 Jul 2021 10:23:51 +0200 Subject: [PATCH 5/9] Added 'buildSrc' to the list of directories mounted into Dcokerfile --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index bf7ac2fc683..9491ee8c98c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,6 +45,7 @@ ADD spec /opt/logstash/spec ADD qa /opt/logstash/qa ADD lib /opt/logstash/lib ADD pkg /opt/logstash/pkg +ADD buildSrc /opt/logstash/buildSrc ADD tools /opt/logstash/tools ADD logstash-core /opt/logstash/logstash-core ADD logstash-core-plugin-api /opt/logstash/logstash-core-plugin-api From 57420dbca4b219b63e965e82b63a737d45b9462a Mon Sep 17 00:00:00 2001 From: andsel Date: Tue, 6 Jul 2021 14:03:08 +0200 Subject: [PATCH 6/9] Improved readability in tests --- .../tooling/StackVersionSelectorTest.groovy | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy index 985447a7911..47d7a8dd561 100644 --- a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy +++ b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy @@ -44,27 +44,25 @@ class StackVersionSelectorTest { @Test void "compare StackVersion tests"() { - def versionComparator = StackVersionSelector.StackVersion.comparator() + assert asVersion("7.1.0") < asVersion("7.2.1") + assert asVersion("7.2.1") > asVersion("7.1.0") - assert -1 == versionComparator.compare(asVersion("7.1.0"), asVersion("7.2.1")) - assert 1 == versionComparator.compare(asVersion("7.2.1"), asVersion("7.1.0")) + assert asVersion("7.1.0") > asVersion("7.1.0-SNAPSHOT") - assert 1 == versionComparator.compare(asVersion("7.1.0"), asVersion("7.1.0-SNAPSHOT")) + assert asVersion("7.2.1-SNAPSHOT") > asVersion("7.1.0-SNAPSHOT") - assert 1 == versionComparator.compare(asVersion("7.2.1-SNAPSHOT"), asVersion("7.1.0-SNAPSHOT")) + assert asVersion("7.2.1-SNAPSHOT") > asVersion("7.1.0") - assert 1 == versionComparator.compare(asVersion("7.2.1-SNAPSHOT"), asVersion("7.1.0")) + assert asVersion("7.2.1") > asVersion("7.1.0-SNAPSHOT") - assert 1 == versionComparator.compare(asVersion("7.2.1"), asVersion("7.1.0-SNAPSHOT")) + assert asVersion("8.0.0-alpha1") > asVersion("7.1.0-SNAPSHOT") - assert 1 == versionComparator.compare(asVersion("8.0.0-alpha1"), asVersion("7.1.0-SNAPSHOT")) + assert asVersion("8.0.0-alpha1") > asVersion("8.0.0-SNAPSHOT") - assert 1 == versionComparator.compare(asVersion("8.0.0-alpha1"), asVersion("8.0.0-SNAPSHOT")) + assert asVersion("8.0.0-rc1") > asVersion("8.0.0-alpha2") - assert 1 == versionComparator.compare(asVersion("8.0.0-rc1"), asVersion("8.0.0-alpha2")) + assert asVersion("8.0.0") > asVersion("8.0.0-alpha2") - assert 1 == versionComparator.compare(asVersion("8.0.0"), asVersion("8.0.0-alpha2")) - - assert 1 == versionComparator.compare(asVersion("8.0.0"), asVersion("8.0.0-SNAPSHOT")) + assert asVersion("8.0.0") > asVersion("8.0.0-SNAPSHOT") } } \ No newline at end of file From c181cbb58c049dd4c163ca97a977c483fba1c944 Mon Sep 17 00:00:00 2001 From: andsel Date: Tue, 6 Jul 2021 14:15:26 +0200 Subject: [PATCH 7/9] Switched version comparison from String to a Version class, this to satisfy the case 7.9.0<7.10.0 --- .../tooling/StackVersionSelector.groovy | 37 ++++++++++++++++++- .../tooling/StackVersionSelectorTest.groovy | 2 + 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy index 9bbf400174b..a7a9d1f3319 100644 --- a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy +++ b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy @@ -58,15 +58,48 @@ class StackVersionSelector { throw new IllegalStateException("Never reach this point") } + static class Version implements Comparable { + + final int major + final int minor + final int patch + private final String original + + Version(String v) { + original = v + def splits = v.split("\\.") + major = splits[0] as int + minor = splits[1] as int + patch = splits[2] as int + } + + @Override + int compareTo(Version version) { + if (major == version.major) { + if (minor == version.minor) { + return patch <=> version.patch + } else { + return minor <=> version.minor + } + } else { + return major <=> version.major + } + } + + @Override + String toString() { + original + } + } static class StackVersion implements Comparable { - final String version + final Version version final String suffix final def comparator = comparator() StackVersion(String fullVersion) { def splits = fullVersion.split("-") - version = splits[0] + version = new Version(splits[0]) if (splits.length == 2) { suffix = splits[1] } diff --git a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy index 47d7a8dd561..aeda5377a00 100644 --- a/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy +++ b/buildSrc/src/test/groovy/org/logstash/gradle/tooling/StackVersionSelectorTest.groovy @@ -49,6 +49,8 @@ class StackVersionSelectorTest { assert asVersion("7.1.0") > asVersion("7.1.0-SNAPSHOT") + assert asVersion("7.9.0") < asVersion("7.10.0") + assert asVersion("7.2.1-SNAPSHOT") > asVersion("7.1.0-SNAPSHOT") assert asVersion("7.2.1-SNAPSHOT") > asVersion("7.1.0") From 5ccc82a9abc28205d533e84b86b9b9ca2966635a Mon Sep 17 00:00:00 2001 From: andsel Date: Tue, 6 Jul 2021 14:19:57 +0200 Subject: [PATCH 8/9] Minor, streamlined if-s sequence --- .../gradle/tooling/StackVersionSelector.groovy | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy index a7a9d1f3319..1816c3e043c 100644 --- a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy +++ b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy @@ -75,15 +75,13 @@ class StackVersionSelector { @Override int compareTo(Version version) { - if (major == version.major) { - if (minor == version.minor) { - return patch <=> version.patch - } else { - return minor <=> version.minor - } - } else { + if (major != version.major) { return major <=> version.major } + if (minor != version.minor) { + return minor <=> version.minor + } + return patch <=> version.patch } @Override From 303ac8b9bb19c486c588825618ff54ea5eb2702c Mon Sep 17 00:00:00 2001 From: andsel Date: Tue, 6 Jul 2021 16:02:46 +0200 Subject: [PATCH 9/9] Fixed wording for error and warn messages --- build.gradle | 2 +- .../org/logstash/gradle/tooling/StackVersionSelector.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 27213c56167..3e2ad2daa3b 100644 --- a/build.gradle +++ b/build.gradle @@ -167,7 +167,7 @@ tasks.register("configureArtifactInfo") { def versionSelector = new StackVersionSelector(artifactVersionsApi) String qualifiedVersion = versionSelector.selectClosestVersion(version) if (qualifiedVersion != version) { - println "WARN version $version not yet published, swith automatically to $qualifiedVersion" + println "WARN version $version does not yet exist or has not been published, switching to $qualifiedVersion" } // find latest reference to last build diff --git a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy index 1816c3e043c..79bf8dc62af 100644 --- a/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy +++ b/buildSrc/src/main/groovy/org/logstash/gradle/tooling/StackVersionSelector.groovy @@ -21,7 +21,7 @@ class StackVersionSelector { String qualifiedVersion = selectClosestInList(StackVersion.asVersion(isReleaseBuild ? version : "${version}-SNAPSHOT"), versions) if (qualifiedVersion == null) { - throw new GradleException("could not find the current artifact from the artifact-api ${artifactVersionsApi} for ${version}") + throw new GradleException("Could not find Elastic Stack version ($version) in the artifact api (${artifactVersionsApi})") } qualifiedVersion }