Skip to content

Commit

Permalink
Reintroduce concept of a major-1.x branch to BwcVersions
Browse files Browse the repository at this point in the history
  • Loading branch information
mark-vieira committed Sep 3, 2024
1 parent 4de21a2 commit da4131a
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,23 @@ public class BwcVersions {
private static final Pattern LINE_PATTERN = Pattern.compile(
"\\W+public static final Version V_(\\d+)_(\\d+)_(\\d+)(_alpha\\d+|_beta\\d+|_rc\\d+)?.*\\);"
);
private static final Version MINIMUM_WIRE_COMPATIBLE_VERSION = Version.fromString("7.17.0");
private static final Version MINIMUM_WIRE_COMPATIBLE_VERSION = Version.fromString("8.16.0");
private static final String GLIBC_VERSION_ENV_VAR = "GLIBC_VERSION";

private final Version currentVersion;
private final List<Version> versions;
private final Map<Version, UnreleasedVersionInfo> unreleased;
private final Version minimumWireCompatibleVersion;

public BwcVersions(List<String> versionLines) {
this(versionLines, Version.fromString(VersionProperties.getElasticsearch()));
this(versionLines, Version.fromString(VersionProperties.getElasticsearch()), MINIMUM_WIRE_COMPATIBLE_VERSION);
}

public BwcVersions(Version currentVersionProperty, List<Version> allVersions) {
this(currentVersionProperty, allVersions, MINIMUM_WIRE_COMPATIBLE_VERSION);
}

public BwcVersions(Version currentVersionProperty, List<Version> allVersions, Version minimumWireCompatibleVersion) {
if (allVersions.isEmpty()) {
throw new IllegalArgumentException("Could not parse any versions");
}
Expand All @@ -88,11 +93,12 @@ public BwcVersions(Version currentVersionProperty, List<Version> allVersions) {
assertCurrentVersionMatchesParsed(currentVersionProperty);

this.unreleased = computeUnreleased();
this.minimumWireCompatibleVersion = MINIMUM_WIRE_COMPATIBLE_VERSION;
}

// Visible for testing
BwcVersions(List<String> versionLines, Version currentVersionProperty) {
this(currentVersionProperty, parseVersionLines(versionLines));
BwcVersions(List<String> versionLines, Version currentVersionProperty, Version minimumWireCompatibleVersion) {
this(currentVersionProperty, parseVersionLines(versionLines), minimumWireCompatibleVersion);
}

private static List<Version> parseVersionLines(List<String> versionLines) {
Expand Down Expand Up @@ -155,18 +161,25 @@ private Map<Version, UnreleasedVersionInfo> computeUnreleased() {

List<Version> unreleasedList = unreleased.stream().sorted(Comparator.reverseOrder()).toList();
Map<Version, UnreleasedVersionInfo> result = new TreeMap<>();
boolean newMinor = false;
for (int i = 0; i < unreleasedList.size(); i++) {
Version esVersion = unreleasedList.get(i);
// This is either a new minor or staged release
if (currentVersion.equals(esVersion)) {
result.put(esVersion, new UnreleasedVersionInfo(esVersion, getBranchFor(esVersion), ":distribution"));
} else if (esVersion.getRevision() == 0) {
// If there are two upcoming unreleased minors then this one is the new minor
if (unreleasedList.get(i + 1).getRevision() == 0) {
result.put(esVersion, new UnreleasedVersionInfo(esVersion, getBranchFor(esVersion), ":distribution:bwc:minor"));
} else {
result.put(esVersion, new UnreleasedVersionInfo(esVersion, getBranchFor(esVersion), ":distribution:bwc:staged"));
}
if (newMinor == false && unreleasedList.get(i + 1).getRevision() == 0) {
result.put(esVersion, new UnreleasedVersionInfo(esVersion, esVersion.getMajor() + ".x", ":distribution:bwc:minor"));
newMinor = true;
} else if (newMinor == false
&& unreleasedList.stream().filter(v -> v.getMajor() == esVersion.getMajor() && v.getRevision() == 0).count() == 1) {
// This is the only unreleased new minor which means we've not yet staged it for release
result.put(esVersion, new UnreleasedVersionInfo(esVersion, esVersion.getMajor() + ".x", ":distribution:bwc:minor"));
newMinor = true;
} else {
result.put(esVersion, new UnreleasedVersionInfo(esVersion, getBranchFor(esVersion), ":distribution:bwc:staged"));
}
} else {
// If this is the oldest unreleased version and we have a maintenance release
if (i == unreleasedList.size() - 1 && hasMaintenanceRelease) {
Expand Down Expand Up @@ -286,7 +299,7 @@ public List<Version> getUnreleasedWireCompatible() {
}

public Version getMinimumWireCompatibleVersion() {
return MINIMUM_WIRE_COMPATIBLE_VERSION;
return minimumWireCompatibleVersion;
}

public record UnreleasedVersionInfo(Version version, String branch, String gradleProjectPath) {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@

package org.elasticsearch.gradle.internal.test.rest.compat.compat;

import org.elasticsearch.gradle.Version;
import org.elasticsearch.gradle.VersionProperties;
import org.elasticsearch.gradle.internal.ElasticsearchJavaBasePlugin;
import org.elasticsearch.gradle.internal.info.BuildParams;
import org.elasticsearch.gradle.internal.test.rest.CopyRestApiTask;
import org.elasticsearch.gradle.internal.test.rest.CopyRestTestsTask;
import org.elasticsearch.gradle.internal.test.rest.LegacyYamlRestTestPlugin;
Expand Down Expand Up @@ -37,7 +40,9 @@
import java.io.File;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Map;

import javax.inject.Inject;

import static org.elasticsearch.gradle.internal.test.rest.RestTestUtil.setupYamlRestTestDependenciesDefaults;
Expand Down Expand Up @@ -84,10 +89,19 @@ public void apply(Project project) {
SourceSet yamlTestSourceSet = sourceSets.getByName(YamlRestTestPlugin.YAML_REST_TEST);
GradleUtils.extendSourceSet(project, YamlRestTestPlugin.YAML_REST_TEST, SOURCE_SET_NAME);

// determine the previous rest compatibility version and BWC project path
int currenMajor = VersionProperties.getElasticsearchVersion().getMajor();
Version lastMinor = BuildParams.getBwcVersions()
.getUnreleased()
.stream()
.filter(v -> v.getMajor() == currenMajor - 1)
.min(Comparator.reverseOrder())
.get();
String lastMinorProjectPath = BuildParams.getBwcVersions().unreleasedInfo(lastMinor).gradleProjectPath();

// copy compatible rest specs
Configuration bwcMinorConfig = project.getConfigurations().create(BWC_MINOR_CONFIG_NAME);
Dependency bwcMinor = project.getDependencies()
.project(Map.of("path", ":distribution:bwc:maintenance", "configuration", "checkout"));
Dependency bwcMinor = project.getDependencies().project(Map.of("path", lastMinorProjectPath, "configuration", "checkout"));
project.getDependencies().add(bwcMinorConfig.getName(), bwcMinor);

String projectPath = project.getPath();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@ class BwcVersionsSpec extends Specification {
addVersion('8.1.0', '9.0.0')

when:
def bwc = new BwcVersions(versionLines, v('8.1.0'))
def bwc = new BwcVersions(versionLines, v('8.1.0'), v('7.17.0'))
def unreleased = bwc.unreleased.collectEntries { [it, bwc.unreleasedInfo(it)] }

then:
unreleased == [
(v('7.16.2')): new UnreleasedVersionInfo(v('7.16.2'), '7.16', ':distribution:bwc:bugfix'),
(v('7.17.0')): new UnreleasedVersionInfo(v('7.17.0'), '7.17', ':distribution:bwc:staged'),
(v('8.0.0')): new UnreleasedVersionInfo(v('8.0.0'), '8.0', ':distribution:bwc:minor'),
(v('8.0.0')): new UnreleasedVersionInfo(v('8.0.0'), '8.x', ':distribution:bwc:minor'),
(v('8.1.0')): new UnreleasedVersionInfo(v('8.1.0'), 'main', ':distribution')
]
bwc.wireCompatible == [v('7.17.0'), v('8.0.0'), v('8.1.0')]
Expand All @@ -64,14 +64,14 @@ class BwcVersionsSpec extends Specification {
addVersion('8.1.0', '9.1.0')

when:
def bwc = new BwcVersions(versionLines, v('8.1.0'))
def bwc = new BwcVersions(versionLines, v('8.1.0'), v('7.17.0'))
def unreleased = bwc.unreleased.collectEntries { [it, bwc.unreleasedInfo(it)] }

then:
unreleased == [
(v('7.16.1')): new UnreleasedVersionInfo(v('7.16.1'), '7.16', ':distribution:bwc:bugfix'),
(v('7.17.0')): new UnreleasedVersionInfo(v('7.17.0'), '7.17', ':distribution:bwc:staged'),
(v('8.0.0')): new UnreleasedVersionInfo(v('8.0.0'), '8.0', ':distribution:bwc:minor'),
(v('8.0.0')): new UnreleasedVersionInfo(v('8.0.0'), '8.x', ':distribution:bwc:minor'),
(v('8.1.0')): new UnreleasedVersionInfo(v('8.1.0'), 'main', ':distribution')
]
bwc.wireCompatible == [v('7.17.0'), v('8.0.0'), v('8.1.0')]
Expand All @@ -94,7 +94,7 @@ class BwcVersionsSpec extends Specification {
addVersion('8.1.0', '9.1.0')

when:
def bwc = new BwcVersions(versionLines, v('8.1.0'))
def bwc = new BwcVersions(versionLines, v('8.1.0'), v('7.17.0'))
def unreleased = bwc.unreleased.collectEntries { [it, bwc.unreleasedInfo(it)] }

then:
Expand Down Expand Up @@ -122,7 +122,7 @@ class BwcVersionsSpec extends Specification {
addVersion('8.0.0', '9.0.0')

when:
def bwc = new BwcVersions(versionLines, v('8.0.0'))
def bwc = new BwcVersions(versionLines, v('8.0.0'), v('7.17.0'))
def unreleased = bwc.unreleased.collectEntries { [it, bwc.unreleasedInfo(it)] }

then:
Expand All @@ -148,19 +148,46 @@ class BwcVersionsSpec extends Specification {
addVersion('8.0.0', '9.0.0')

when:
def bwc = new BwcVersions(versionLines, v('8.0.0'))
def bwc = new BwcVersions(versionLines, v('8.0.0'), v('7.17.0'))
def unreleased = bwc.unreleased.collectEntries { [it, bwc.unreleasedInfo(it)] }

then:
unreleased == [
(v('7.16.1')): new UnreleasedVersionInfo(v('7.16.1'), '7.16', ':distribution:bwc:bugfix'),
(v('7.17.0')): new UnreleasedVersionInfo(v('7.17.0'), '7.17', ':distribution:bwc:staged'),
(v('7.17.0')): new UnreleasedVersionInfo(v('7.17.0'), '7.x', ':distribution:bwc:minor'),
(v('8.0.0')): new UnreleasedVersionInfo(v('8.0.0'), 'main', ':distribution'),
]
bwc.wireCompatible == [v('7.17.0'), v('8.0.0')]
bwc.indexCompatible == osFiltered([v('7.14.0'), v('7.14.1'), v('7.14.2'), v('7.15.0'), v('7.15.1'), v('7.15.2'), v('7.16.0'), v('7.16.1'), v('7.17.0'), v('8.0.0')])
}

def "current version is major with staged next minor"() {
given:
addVersion('7.14.0', '8.9.0')
addVersion('7.14.1', '8.9.0')
addVersion('7.14.2', '8.9.0')
addVersion('7.15.0', '8.9.0')
addVersion('7.15.1', '8.9.0')
addVersion('7.15.2', '8.9.0')
addVersion('7.16.0', '8.10.0')
addVersion('7.17.0', '8.10.0')
addVersion('8.0.0', '9.0.0')

when:
def bwc = new BwcVersions(versionLines, v('8.0.0'), v('7.17.0'))
def unreleased = bwc.unreleased.collectEntries { [it, bwc.unreleasedInfo(it)] }

then:
unreleased == [
(v('7.15.2')): new UnreleasedVersionInfo(v('7.15.2'), '7.15', ':distribution:bwc:bugfix'),
(v('7.16.0')): new UnreleasedVersionInfo(v('7.16.0'), '7.16', ':distribution:bwc:staged'),
(v('7.17.0')): new UnreleasedVersionInfo(v('7.17.0'), '7.x', ':distribution:bwc:minor'),
(v('8.0.0')): new UnreleasedVersionInfo(v('8.0.0'), 'main', ':distribution'),
]
bwc.wireCompatible == [v('7.17.0'), v('8.0.0')]
bwc.indexCompatible == osFiltered([v('7.14.0'), v('7.14.1'), v('7.14.2'), v('7.15.0'), v('7.15.1'), v('7.15.2'), v('7.16.0'), v('7.17.0'), v('8.0.0')])
}

def "current version is next bugfix"() {
given:
addVersion('7.14.0', '8.9.0')
Expand All @@ -177,7 +204,7 @@ class BwcVersionsSpec extends Specification {
addVersion('8.0.1', '9.0.0')

when:
def bwc = new BwcVersions(versionLines, v('8.0.1'))
def bwc = new BwcVersions(versionLines, v('8.0.1'), v('7.17.0'))
def unreleased = bwc.unreleased.collectEntries { [it, bwc.unreleasedInfo(it)] }

then:
Expand Down Expand Up @@ -206,7 +233,7 @@ class BwcVersionsSpec extends Specification {
addVersion('8.1.0', '9.1.0')

when:
def bwc = new BwcVersions(versionLines, v('8.1.0'))
def bwc = new BwcVersions(versionLines, v('8.1.0'), v('7.17.0'))
def unreleased = bwc.unreleased.collectEntries { [it, bwc.unreleasedInfo(it)] }

then:
Expand Down

0 comments on commit da4131a

Please sign in to comment.