Introduce build qualifier parameter (#35155)

* Introduce property to set version qualifier

- VersionProperties.elasticsearch is now a string which can have qualifier
and snapshot too
- The Version class in the build no longer cares about snapshot and
qualifier.
This commit is contained in:
Alpar Torok 2018-11-02 05:27:40 +02:00 committed by GitHub
parent dbc7c9259c
commit f22700812e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 120 additions and 150 deletions

View File

@ -39,7 +39,7 @@ if (properties.get("org.elasticsearch.acceptScanTOS", "false") == "true") {
// common maven publishing configuration // common maven publishing configuration
subprojects { subprojects {
group = 'org.elasticsearch' group = 'org.elasticsearch'
version = VersionProperties.elasticsearch.toString() version = VersionProperties.elasticsearch
description = "Elasticsearch subproject ${project.path}" description = "Elasticsearch subproject ${project.path}"
} }
@ -282,7 +282,7 @@ subprojects {
// other packages (e.g org.elasticsearch.client) will point to server rather than // other packages (e.g org.elasticsearch.client) will point to server rather than
// their own artifacts. // their own artifacts.
if (project.plugins.hasPlugin(BuildPlugin) || project.plugins.hasPlugin(PluginBuildPlugin)) { if (project.plugins.hasPlugin(BuildPlugin) || project.plugins.hasPlugin(PluginBuildPlugin)) {
String artifactsHost = VersionProperties.elasticsearch.isSnapshot() ? "https://snapshots.elastic.co" : "https://artifacts.elastic.co" String artifactsHost = VersionProperties.elasticsearch.endsWith("-SNAPSHOT") ? "https://snapshots.elastic.co" : "https://artifacts.elastic.co"
Closure sortClosure = { a, b -> b.group <=> a.group } Closure sortClosure = { a, b -> b.group <=> a.group }
Closure depJavadocClosure = { shadowed, dep -> Closure depJavadocClosure = { shadowed, dep ->
if (dep.group == null || false == dep.group.startsWith('org.elasticsearch')) { if (dep.group == null || false == dep.group.startsWith('org.elasticsearch')) {

View File

@ -41,46 +41,29 @@ if (project == rootProject) {
* Propagating version.properties to the rest of the build * * Propagating version.properties to the rest of the build *
*****************************************************************************/ *****************************************************************************/
Properties props = new Properties() // we update the version property to reflect if we are building a snapshot or a release build
props.load(project.file('version.properties').newDataInputStream()) // we write this back out below to load it in the Build.java which will be shown in rest main action
version = props.getProperty('elasticsearch') // to indicate this being a snapshot build or a release build.
boolean snapshot = "true".equals(System.getProperty("build.snapshot", "true")); Properties props = VersionPropertiesLoader.loadBuildSrcVersion(project.file('version.properties'))
if (snapshot) { version = props.getProperty("elasticsearch")
// we update the version property to reflect if we are building a snapshot or a release build
// we write this back out below to load it in the Build.java which will be shown in rest main action
// to indicate this being a snapshot build or a release build.
version += "-SNAPSHOT"
props.put("elasticsearch", version);
}
File tempPropertiesFile = new File(project.buildDir, "version.properties")
task writeVersionProperties {
inputs.properties(props)
outputs.file(tempPropertiesFile)
doLast {
OutputStream stream = Files.newOutputStream(tempPropertiesFile.toPath());
try {
props.store(stream, "UTF-8");
} finally {
stream.close();
}
}
}
processResources { processResources {
dependsOn writeVersionProperties doLast {
from tempPropertiesFile Writer writer = file("$destinationDir/version.properties").newWriter()
} try {
props.store(writer, "Generated version properties")
} finally {
if (JavaVersion.current() < JavaVersion.VERSION_1_10) { writer.close()
throw new GradleException('At least Java 10 is required to build elasticsearch gradle tools') }
}
} }
/***************************************************************************** /*****************************************************************************
* Java version * * Java version *
*****************************************************************************/ *****************************************************************************/
if (JavaVersion.current() < JavaVersion.VERSION_1_10) {
throw new GradleException('At least Java 10 is required to build elasticsearch gradle tools')
}
// Gradle 4.10 does not support setting this to 11 yet // Gradle 4.10 does not support setting this to 11 yet
targetCompatibility = "10" targetCompatibility = "10"
sourceCompatibility = "10" sourceCompatibility = "10"
@ -232,3 +215,42 @@ if (project != rootProject) {
generatePomFileForPluginMavenPublication.enabled = false generatePomFileForPluginMavenPublication.enabled = false
} }
} }
// Define this here because we need it early.
class VersionPropertiesLoader {
static Properties loadBuildSrcVersion(File input) throws IOException {
Properties props = new Properties();
InputStream is = new FileInputStream(input)
try {
props.load(is)
} finally {
is.close()
}
loadBuildSrcVersion(props, System.getProperties())
return props
}
protected static void loadBuildSrcVersion(Properties loadedProps, Properties systemProperties) {
String elasticsearch = loadedProps.getProperty("elasticsearch")
if (elasticsearch == null) {
throw new IllegalStateException("Elasticsearch version is missing from properties.")
}
if (elasticsearch.matches("[0-9]+\\.[0-9]+\\.[0-9]+") == false) {
throw new IllegalStateException(
"Expected elasticsearch version to be numbers only of the form X.Y.Z but it was: " +
elasticsearch
)
}
String qualifier = systemProperties.getProperty("build.version_qualifier", "alpha1");
if (qualifier.isEmpty() == false) {
if (qualifier.matches("(alpha|beta|rc)\\d+") == false) {
throw new IllegalStateException("Invalid qualifier: " + qualifier)
}
elasticsearch += "-" + qualifier
}
if ("true".equals(systemProperties.getProperty("build.snapshot", "true"))) {
elasticsearch += "-SNAPSHOT"
}
loadedProps.put("elasticsearch", elasticsearch)
}
}

View File

@ -696,18 +696,12 @@ class BuildPlugin implements Plugin<Project> {
jarTask.destinationDir = new File(project.buildDir, 'distributions') jarTask.destinationDir = new File(project.buildDir, 'distributions')
// fixup the jar manifest // fixup the jar manifest
jarTask.doFirst { jarTask.doFirst {
final Version versionWithoutSnapshot = new Version(
VersionProperties.elasticsearch.major,
VersionProperties.elasticsearch.minor,
VersionProperties.elasticsearch.revision,
VersionProperties.elasticsearch.suffix,
false)
// this doFirst is added before the info plugin, therefore it will run // this doFirst is added before the info plugin, therefore it will run
// after the doFirst added by the info plugin, and we can override attributes // after the doFirst added by the info plugin, and we can override attributes
jarTask.manifest.attributes( jarTask.manifest.attributes(
'X-Compile-Elasticsearch-Version': versionWithoutSnapshot, 'X-Compile-Elasticsearch-Version': VersionProperties.elasticsearch.replace("-SNAPSHOT", ""),
'X-Compile-Lucene-Version': VersionProperties.lucene, 'X-Compile-Lucene-Version': VersionProperties.lucene,
'X-Compile-Elasticsearch-Snapshot': VersionProperties.elasticsearch.isSnapshot(), 'X-Compile-Elasticsearch-Snapshot': VersionProperties.isElasticsearchSnapshot(),
'Build-Date': ZonedDateTime.now(ZoneOffset.UTC), 'Build-Date': ZonedDateTime.now(ZoneOffset.UTC),
'Build-Java-Version': project.compilerJavaVersion) 'Build-Java-Version': project.compilerJavaVersion)
if (jarTask.manifest.attributes.containsKey('Change') == false) { if (jarTask.manifest.attributes.containsKey('Change') == false) {

View File

@ -42,7 +42,7 @@ public class DocsTestPlugin extends RestTestPlugin {
* to the version being built for testing but needs to resolve to * to the version being built for testing but needs to resolve to
* the last released version for docs. */ * the last released version for docs. */
'\\{version\\}': '\\{version\\}':
VersionProperties.elasticsearch.toString().replace('-SNAPSHOT', ''), VersionProperties.elasticsearch.replace('-SNAPSHOT', ''),
'\\{lucene_version\\}' : VersionProperties.lucene.replaceAll('-snapshot-\\w+$', ''), '\\{lucene_version\\}' : VersionProperties.lucene.replaceAll('-snapshot-\\w+$', ''),
'\\{build_flavor\\}' : '\\{build_flavor\\}' :
project.integTestCluster.distribution.startsWith('oss-') ? 'oss' : 'default', project.integTestCluster.distribution.startsWith('oss-') ? 'oss' : 'default',

View File

@ -98,7 +98,7 @@ public class PluginBuildPlugin extends BuildPlugin {
project.pluginProperties.extension.name + "-client" project.pluginProperties.extension.name + "-client"
) )
project.tasks.withType(GenerateMavenPom.class) { GenerateMavenPom generatePOMTask -> project.tasks.withType(GenerateMavenPom.class) { GenerateMavenPom generatePOMTask ->
generatePOMTask.ext.pomFileName = "${project.archivesBaseName}-client-${project.version}.pom" generatePOMTask.ext.pomFileName = "${project.archivesBaseName}-client-${project.versions.elasticsearch}.pom"
} }
} else { } else {
project.plugins.withType(MavenPublishPlugin).whenPluginAdded { project.plugins.withType(MavenPublishPlugin).whenPluginAdded {

View File

@ -76,7 +76,7 @@ class PluginPropertiesTask extends Copy {
'name': extension.name, 'name': extension.name,
'description': extension.description, 'description': extension.description,
'version': stringSnap(extension.version), 'version': stringSnap(extension.version),
'elasticsearchVersion': stringSnap(VersionProperties.elasticsearch.toString()), 'elasticsearchVersion': stringSnap(VersionProperties.elasticsearch),
'javaVersion': project.targetCompatibility as String, 'javaVersion': project.targetCompatibility as String,
'classname': extension.classname, 'classname': extension.classname,
'extendedPlugins': extension.extendedPlugins.join(','), 'extendedPlugins': extension.extendedPlugins.join(','),

View File

@ -22,6 +22,7 @@ import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin
import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis
import de.thetaphi.forbiddenapis.gradle.ForbiddenApisPlugin import de.thetaphi.forbiddenapis.gradle.ForbiddenApisPlugin
import org.elasticsearch.gradle.ExportElasticsearchBuildResourcesTask import org.elasticsearch.gradle.ExportElasticsearchBuildResourcesTask
import org.elasticsearch.gradle.VersionProperties
import org.gradle.api.JavaVersion import org.gradle.api.JavaVersion
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.Task import org.gradle.api.Task
@ -220,7 +221,7 @@ class PrecommitTasks {
private static Task configureLoggerUsage(Project project) { private static Task configureLoggerUsage(Project project) {
project.configurations.create('loggerUsagePlugin') project.configurations.create('loggerUsagePlugin')
project.dependencies.add('loggerUsagePlugin', project.dependencies.add('loggerUsagePlugin',
"org.elasticsearch.test:logger-usage:${org.elasticsearch.gradle.VersionProperties.elasticsearch}") "org.elasticsearch.test:logger-usage:${VersionProperties.elasticsearch}")
return project.tasks.create('loggerUsageCheck', LoggerUsageTask.class) { return project.tasks.create('loggerUsageCheck', LoggerUsageTask.class) {
classpath = project.configurations.loggerUsagePlugin classpath = project.configurations.loggerUsagePlugin
javaHome = project.runtimeJavaHome javaHome = project.runtimeJavaHome

View File

@ -101,7 +101,7 @@ class ClusterFormationTasks {
// from here on everything else works the same as if it's the current version, we fetch the BWC version // from here on everything else works the same as if it's the current version, we fetch the BWC version
// from mirrors using gradles built-in mechanism etc. // from mirrors using gradles built-in mechanism etc.
configureDistributionDependency(project, config.distribution, bwcDistro, config.bwcVersion) configureDistributionDependency(project, config.distribution, bwcDistro, config.bwcVersion.toString())
for (Map.Entry<String, Object> entry : config.plugins.entrySet()) { for (Map.Entry<String, Object> entry : config.plugins.entrySet()) {
configureBwcPluginDependency(project, entry.getValue(), bwcPlugins, config.bwcVersion) configureBwcPluginDependency(project, entry.getValue(), bwcPlugins, config.bwcVersion)
} }
@ -112,9 +112,12 @@ class ClusterFormationTasks {
// we start N nodes and out of these N nodes there might be M bwc nodes. // we start N nodes and out of these N nodes there might be M bwc nodes.
// for each of those nodes we might have a different configuration // for each of those nodes we might have a different configuration
final Configuration distro final Configuration distro
final Version elasticsearchVersion final String elasticsearchVersion
if (i < config.numBwcNodes) { if (i < config.numBwcNodes) {
elasticsearchVersion = config.bwcVersion elasticsearchVersion = config.bwcVersion.toString()
if (project.bwcVersions.unreleased.contains(config.bwcVersion)) {
elasticsearchVersion += "-SNAPSHOT"
}
distro = bwcDistro distro = bwcDistro
} else { } else {
elasticsearchVersion = VersionProperties.elasticsearch elasticsearchVersion = VersionProperties.elasticsearch
@ -156,8 +159,10 @@ class ClusterFormationTasks {
} }
/** Adds a dependency on the given distribution */ /** Adds a dependency on the given distribution */
static void configureDistributionDependency(Project project, String distro, Configuration configuration, Version elasticsearchVersion) { static void configureDistributionDependency(Project project, String distro, Configuration configuration, String elasticsearchVersion) {
if (elasticsearchVersion.before('6.3.0') && distro.startsWith('oss-')) { if (Version.fromString(elasticsearchVersion).before('6.3.0') &&
distro.startsWith('oss-')
) {
distro = distro.substring('oss-'.length()) distro = distro.substring('oss-'.length())
} }
String packaging = distro String packaging = distro
@ -227,7 +232,7 @@ class ClusterFormationTasks {
setup = configureAddKeystoreFileTasks(prefix, project, setup, node) setup = configureAddKeystoreFileTasks(prefix, project, setup, node)
if (node.config.plugins.isEmpty() == false) { if (node.config.plugins.isEmpty() == false) {
if (node.nodeVersion == VersionProperties.elasticsearch) { if (node.nodeVersion == Version.fromString(VersionProperties.elasticsearch)) {
setup = configureCopyPluginsTask(taskName(prefix, node, 'copyPlugins'), project, setup, node, prefix) setup = configureCopyPluginsTask(taskName(prefix, node, 'copyPlugins'), project, setup, node, prefix)
} else { } else {
setup = configureCopyBwcPluginsTask(taskName(prefix, node, 'copyBwcPlugins'), project, setup, node, prefix) setup = configureCopyBwcPluginsTask(taskName(prefix, node, 'copyBwcPlugins'), project, setup, node, prefix)
@ -591,7 +596,7 @@ class ClusterFormationTasks {
static Task configureInstallPluginTask(String name, Project project, Task setup, NodeInfo node, String pluginName, String prefix) { static Task configureInstallPluginTask(String name, Project project, Task setup, NodeInfo node, String pluginName, String prefix) {
final FileCollection pluginZip; final FileCollection pluginZip;
if (node.nodeVersion != VersionProperties.elasticsearch) { if (node.nodeVersion != Version.fromString(VersionProperties.elasticsearch)) {
pluginZip = project.configurations.getByName(pluginBwcConfigurationName(prefix, pluginName)) pluginZip = project.configurations.getByName(pluginBwcConfigurationName(prefix, pluginName))
} else { } else {
pluginZip = project.configurations.getByName(pluginConfigurationName(prefix, pluginName)) pluginZip = project.configurations.getByName(pluginConfigurationName(prefix, pluginName))

View File

@ -112,7 +112,7 @@ class NodeInfo {
Version nodeVersion Version nodeVersion
/** Holds node configuration for part of a test cluster. */ /** Holds node configuration for part of a test cluster. */
NodeInfo(ClusterConfiguration config, int nodeNum, Project project, String prefix, Version nodeVersion, File sharedDir) { NodeInfo(ClusterConfiguration config, int nodeNum, Project project, String prefix, String nodeVersion, File sharedDir) {
this.config = config this.config = config
this.nodeNum = nodeNum this.nodeNum = nodeNum
this.project = project this.project = project
@ -124,7 +124,7 @@ class NodeInfo {
} }
baseDir = new File(project.buildDir, "cluster/${prefix} node${nodeNum}") baseDir = new File(project.buildDir, "cluster/${prefix} node${nodeNum}")
pidFile = new File(baseDir, 'es.pid') pidFile = new File(baseDir, 'es.pid')
this.nodeVersion = nodeVersion this.nodeVersion = Version.fromString(nodeVersion)
homeDir = homeDir(baseDir, config.distribution, nodeVersion) homeDir = homeDir(baseDir, config.distribution, nodeVersion)
pathConf = pathConf(baseDir, config.distribution, nodeVersion) pathConf = pathConf(baseDir, config.distribution, nodeVersion)
if (config.dataDir != null) { if (config.dataDir != null) {
@ -173,11 +173,11 @@ class NodeInfo {
} }
if (nodeVersion.before("6.2.0")) { if (this.nodeVersion.before("6.2.0")) {
javaVersion = 8 javaVersion = 8
} else if (nodeVersion.onOrAfter("6.2.0") && nodeVersion.before("6.3.0")) { } else if (this.nodeVersion.onOrAfter("6.2.0") && this.nodeVersion.before("6.3.0")) {
javaVersion = 9 javaVersion = 9
} else if (nodeVersion.onOrAfter("6.3.0") && nodeVersion.before("6.5.0")) { } else if (this.nodeVersion.onOrAfter("6.3.0") && this.nodeVersion.before("6.5.0")) {
javaVersion = 10 javaVersion = 10
} }
@ -301,7 +301,7 @@ class NodeInfo {
} }
/** Returns the directory elasticsearch home is contained in for the given distribution */ /** Returns the directory elasticsearch home is contained in for the given distribution */
static File homeDir(File baseDir, String distro, Version nodeVersion) { static File homeDir(File baseDir, String distro, String nodeVersion) {
String path String path
switch (distro) { switch (distro) {
case 'integ-test-zip': case 'integ-test-zip':
@ -321,7 +321,7 @@ class NodeInfo {
return new File(baseDir, path) return new File(baseDir, path)
} }
static File pathConf(File baseDir, String distro, Version nodeVersion) { static File pathConf(File baseDir, String distro, String nodeVersion) {
switch (distro) { switch (distro) {
case 'integ-test-zip': case 'integ-test-zip':
case 'zip': case 'zip':

View File

@ -12,28 +12,17 @@ public final class Version implements Comparable<Version> {
private final int minor; private final int minor;
private final int revision; private final int revision;
private final int id; private final int id;
private final boolean snapshot;
/**
* Suffix on the version name.
*/
private final String suffix;
private static final Pattern pattern = private static final Pattern pattern =
Pattern.compile("(\\d)+\\.(\\d+)\\.(\\d+)(-alpha\\d+|-beta\\d+|-rc\\d+)?(-SNAPSHOT)?"); Pattern.compile("(\\d)+\\.(\\d+)\\.(\\d+)(-alpha\\d+|-beta\\d+|-rc\\d+)?(-SNAPSHOT)?");
public Version(int major, int minor, int revision) { public Version(int major, int minor, int revision) {
this(major, minor, revision, "", false);
}
public Version(int major, int minor, int revision, String suffix, boolean snapshot) {
Objects.requireNonNull(major, "major version can't be null"); Objects.requireNonNull(major, "major version can't be null");
Objects.requireNonNull(minor, "minor version can't be null"); Objects.requireNonNull(minor, "minor version can't be null");
Objects.requireNonNull(revision, "revision version can't be null"); Objects.requireNonNull(revision, "revision version can't be null");
this.major = major; this.major = major;
this.minor = minor; this.minor = minor;
this.revision = revision; this.revision = revision;
this.snapshot = snapshot;
this.suffix = suffix == null ? "" : suffix;
// currently snapshot is not taken into account // currently snapshot is not taken into account
this.id = major * 10000000 + minor * 100000 + revision * 1000; this.id = major * 10000000 + minor * 100000 + revision * 1000;
@ -58,17 +47,13 @@ public final class Version implements Comparable<Version> {
return new Version( return new Version(
Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(1)),
parseSuffixNumber(matcher.group(2)), parseSuffixNumber(matcher.group(2)),
parseSuffixNumber(matcher.group(3)), parseSuffixNumber(matcher.group(3))
matcher.group(4),
matcher.group(5) != null
); );
} }
@Override @Override
public String toString() { public String toString() {
final String snapshotStr = snapshot ? "-SNAPSHOT" : ""; return String.valueOf(getMajor()) + "." + String.valueOf(getMinor()) + "." + String.valueOf(getRevision());
return String.valueOf(getMajor()) + "." + String.valueOf(getMinor()) + "." + String.valueOf(getRevision()) +
(suffix == null ? "" : suffix) + snapshotStr;
} }
public boolean before(Version compareTo) { public boolean before(Version compareTo) {
@ -103,19 +88,6 @@ public final class Version implements Comparable<Version> {
return after(fromString(compareTo)); return after(fromString(compareTo));
} }
public boolean onOrBeforeIncludingSuffix(Version otherVersion) {
if (id != otherVersion.getId()) {
return id < otherVersion.getId();
}
if (suffix.equals("")) {
return otherVersion.getSuffix().equals("");
}
return otherVersion.getSuffix().equals("") || suffix.compareTo(otherVersion.getSuffix()) < 0;
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;
@ -128,8 +100,7 @@ public final class Version implements Comparable<Version> {
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(major, minor, revision, id);
return Objects.hash(major, minor, revision, id, snapshot, suffix);
} }
public int getMajor() { public int getMajor() {
@ -148,14 +119,6 @@ public final class Version implements Comparable<Version> {
return id; return id;
} }
public boolean isSnapshot() {
return snapshot;
}
public String getSuffix() {
return suffix;
}
@Override @Override
public int compareTo(Version other) { public int compareTo(Version other) {
return Integer.compare(getId(), other.getId()); return Integer.compare(getId(), other.getId());

View File

@ -100,7 +100,7 @@ public class VersionCollection {
} }
public VersionCollection(List<String> versionLines) { public VersionCollection(List<String> versionLines) {
this(versionLines, VersionProperties.getElasticsearch()); this(versionLines, Version.fromString(VersionProperties.getElasticsearch()));
} }
protected VersionCollection(List<String> versionLines, Version currentVersionProperty) { protected VersionCollection(List<String> versionLines, Version currentVersionProperty) {
@ -110,12 +110,10 @@ public class VersionCollection {
.map(match -> new Version( .map(match -> new Version(
Integer.parseInt(match.group(1)), Integer.parseInt(match.group(1)),
Integer.parseInt(match.group(2)), Integer.parseInt(match.group(2)),
Integer.parseInt(match.group(3)), Integer.parseInt(match.group(3))
(match.group(4) == null ? "" : match.group(4)).replace('_', '-'),
false
)) ))
.sorted() .sorted()
.filter(version -> version.getSuffix().isEmpty() || version.equals(currentVersionProperty)) .distinct()
.collect(Collectors.groupingBy(Version::getMajor, Collectors.toList())); .collect(Collectors.groupingBy(Version::getMajor, Collectors.toList()));
if (groupByMajor.isEmpty()) { if (groupByMajor.isEmpty()) {
@ -131,22 +129,11 @@ public class VersionCollection {
assertCurrentVersionMatchesParsed(currentVersionProperty); assertCurrentVersionMatchesParsed(currentVersionProperty);
assertNoOlderThanTwoMajors(); assertNoOlderThanTwoMajors();
markUnreleasedAsSnapshot();
}
private void markUnreleasedAsSnapshot() {
getUnreleased().forEach(uv ->
groupByMajor.get(uv.getMajor()).set(
groupByMajor.get(uv.getMajor()).indexOf(uv),
new Version(uv.getMajor(), uv.getMinor(), uv.getRevision(),uv.getSuffix(), true)
)
);
} }
private void assertNoOlderThanTwoMajors() { private void assertNoOlderThanTwoMajors() {
Set<Integer> majors = groupByMajor.keySet(); Set<Integer> majors = groupByMajor.keySet();
if (majors.size() != 2 && currentVersion.getMinor() != 0 && currentVersion.getMajor() != 0) { if (majors.size() != 2 && currentVersion.getMinor() != 0 && currentVersion.getRevision() != 0) {
throw new IllegalStateException( throw new IllegalStateException(
"Expected exactly 2 majors in parsed versions but found: " + majors "Expected exactly 2 majors in parsed versions but found: " + majors
); );

View File

@ -10,7 +10,7 @@ import java.util.Properties;
* Accessor for shared dependency versions used by elasticsearch, namely the elasticsearch and lucene versions. * Accessor for shared dependency versions used by elasticsearch, namely the elasticsearch and lucene versions.
*/ */
public class VersionProperties { public class VersionProperties {
public static Version getElasticsearch() { public static String getElasticsearch() {
return elasticsearch; return elasticsearch;
} }
@ -22,12 +22,12 @@ public class VersionProperties {
return versions; return versions;
} }
private static final Version elasticsearch; private static final String elasticsearch;
private static final String lucene; private static final String lucene;
private static final Map<String, String> versions = new HashMap<String, String>(); private static final Map<String, String> versions = new HashMap<String, String>();
static { static {
Properties props = getVersionProperties(); Properties props = getVersionProperties();
elasticsearch = Version.fromString(props.getProperty("elasticsearch")); elasticsearch = props.getProperty("elasticsearch");
lucene = props.getProperty("lucene"); lucene = props.getProperty("lucene");
for (String property : props.stringPropertyNames()) { for (String property : props.stringPropertyNames()) {
versions.put(property, props.getProperty(property)); versions.put(property, props.getProperty(property));
@ -38,13 +38,17 @@ public class VersionProperties {
Properties props = new Properties(); Properties props = new Properties();
InputStream propsStream = VersionProperties.class.getResourceAsStream("/version.properties"); InputStream propsStream = VersionProperties.class.getResourceAsStream("/version.properties");
if (propsStream == null) { if (propsStream == null) {
throw new RuntimeException("/version.properties resource missing"); throw new IllegalStateException("/version.properties resource missing");
} }
try { try {
props.load(propsStream); props.load(propsStream);
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new IllegalStateException("Failed to load version properties", e);
} }
return props; return props;
} }
public static boolean isElasticsearchSnapshot() {
return elasticsearch.endsWith("-SNAPSHOT");
}
} }

View File

@ -101,7 +101,7 @@ public class VersionCollectionTests extends GradleUnitTestCase {
formatVersionToLine("6.5.0"), formatVersionToLine("6.5.0"),
formatVersionToLine("7.0.0") formatVersionToLine("7.0.0")
), ),
Version.fromString("7.0.0") Version.fromString("6.5.0")
); );
} }

View File

@ -33,11 +33,11 @@ public class VersionTests extends GradleUnitTestCase {
public ExpectedException expectedEx = ExpectedException.none(); public ExpectedException expectedEx = ExpectedException.none();
public void testVersionParsing() { public void testVersionParsing() {
assertVersionEquals("7.0.1", 7, 0, 1, "", false); assertVersionEquals("7.0.1", 7, 0, 1);
assertVersionEquals("7.0.1-alpha2", 7, 0, 1, "-alpha2", false); assertVersionEquals("7.0.1-alpha2", 7, 0, 1);
assertVersionEquals("5.1.2-rc3", 5, 1, 2, "-rc3", false); assertVersionEquals("5.1.2-rc3", 5, 1, 2);
assertVersionEquals("6.1.2-SNAPSHOT", 6, 1, 2, "", true); assertVersionEquals("6.1.2-SNAPSHOT", 6, 1, 2);
assertVersionEquals("6.1.2-beta1-SNAPSHOT", 6, 1, 2, "-beta1", true); assertVersionEquals("6.1.2-beta1-SNAPSHOT", 6, 1, 2);
} }
public void testCompareWithStringVersions() { public void testCompareWithStringVersions() {
@ -74,21 +74,12 @@ public class VersionTests extends GradleUnitTestCase {
} }
public void testToString() { public void testToString() {
assertEquals("7.0.1", new Version(7, 0, 1, null, false).toString()); assertEquals("7.0.1", new Version(7, 0, 1).toString());
} }
public void testCompareVersions() { public void testCompareVersions() {
assertEquals(0, new Version(7, 0, 0, null, true).compareTo( assertEquals(0,
new Version(7, 0, 0, null, true) new Version(7, 0, 0).compareTo(new Version(7, 0, 0))
));
assertEquals(0, new Version(7, 0, 0, null, true).compareTo(
new Version(7, 0, 0, "", true)
));
assertEquals(
0,
new Version(7, 0, 0, "-alpha1", false).compareTo(
new Version(7, 0, 0, "", true))
); );
} }
@ -108,17 +99,11 @@ public class VersionTests extends GradleUnitTestCase {
assertEquals(smaller + " should be smaller than " + bigger, -1, smaller.compareTo(bigger)); assertEquals(smaller + " should be smaller than " + bigger, -1, smaller.compareTo(bigger));
} }
private void assertVersionEquals(String stringVersion, int major, int minor, int revision, String sufix, boolean snapshot) { private void assertVersionEquals(String stringVersion, int major, int minor, int revision) {
Version version = Version.fromString(stringVersion); Version version = Version.fromString(stringVersion);
assertEquals(major, version.getMajor()); assertEquals(major, version.getMajor());
assertEquals(minor, version.getMinor()); assertEquals(minor, version.getMinor());
assertEquals(revision, version.getRevision()); assertEquals(revision, version.getRevision());
if (snapshot) {
assertTrue("Expected version to be a snapshot but it was not", version.isSnapshot());
} else {
assertFalse("Expected version not to be a snapshot but it was", version.isSnapshot());
}
assertEquals(sufix, version.getSuffix());
} }
} }

View File

@ -1,4 +1,4 @@
elasticsearch = 7.0.0-alpha1 elasticsearch = 7.0.0
lucene = 8.0.0-snapshot-7d0a7782fa lucene = 8.0.0-snapshot-7d0a7782fa
# optional dependencies # optional dependencies

View File

@ -129,10 +129,10 @@ bwcVersions.forPreviousUnreleased { VersionCollection.UnreleasedVersionInfo unre
baseDir += project == 'zip' ? '/archives' : '/packages' baseDir += project == 'zip' ? '/archives' : '/packages'
// add oss variant first // add oss variant first
projectDirs.add("${baseDir}/oss-${project}") projectDirs.add("${baseDir}/oss-${project}")
artifactFiles.add(file("${checkoutDir}/${baseDir}/oss-${project}/build/distributions/elasticsearch-oss-${bwcVersion}.${project}")) artifactFiles.add(file("${checkoutDir}/${baseDir}/oss-${project}/build/distributions/elasticsearch-oss-${bwcVersion}-SNAPSHOT.${project}"))
} }
projectDirs.add("${baseDir}/${project}") projectDirs.add("${baseDir}/${project}")
artifactFiles.add(file("${checkoutDir}/${baseDir}/${project}/build/distributions/elasticsearch-${bwcVersion}.${project}")) artifactFiles.add(file("${checkoutDir}/${baseDir}/${project}/build/distributions/elasticsearch-${bwcVersion}-SNAPSHOT.${project}"))
} }
task buildBwcVersion(type: Exec) { task buildBwcVersion(type: Exec) {

View File

@ -71,4 +71,5 @@ precommit.dependsOn namingConventionsMain
test.configure { test.configure {
systemProperty 'tests.gradle_index_compat_versions', bwcVersions.indexCompatible.join(',') systemProperty 'tests.gradle_index_compat_versions', bwcVersions.indexCompatible.join(',')
systemProperty 'tests.gradle_wire_compat_versions', bwcVersions.wireCompatible.join(',') systemProperty 'tests.gradle_wire_compat_versions', bwcVersions.wireCompatible.join(',')
systemProperty 'tests.gradle_unreleased_versions', bwcVersions.unreleased.join(',')
} }

View File

@ -24,8 +24,10 @@ import org.elasticsearch.common.collect.Tuple;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import static java.util.stream.Collectors.toCollection; import static java.util.stream.Collectors.toCollection;
import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toList;
@ -389,13 +391,19 @@ public class VersionUtilsTests extends ESTestCase {
private final List<String> unreleased = new ArrayList<>(); private final List<String> unreleased = new ArrayList<>();
private VersionsFromProperty(String property) { private VersionsFromProperty(String property) {
Set<String> allUnreleased = new HashSet<>(Arrays.asList(
System.getProperty("tests.gradle_unreleased_versions", "").split(",")
));
if (allUnreleased.isEmpty()) {
fail("[tests.gradle_unreleased_versions] not set or empty. Gradle should set this before running.");
}
String versions = System.getProperty(property); String versions = System.getProperty(property);
assertNotNull("Couldn't find [" + property + "]. Gradle should set these before running the tests.", versions); assertNotNull("Couldn't find [" + property + "]. Gradle should set this before running the tests.", versions);
logger.info("Looked up versions [{}={}]", property, versions); logger.info("Looked up versions [{}={}]", property, versions);
for (String version : versions.split(",")) { for (String version : versions.split(",")) {
if (version.endsWith("-SNAPSHOT")) { if (allUnreleased.contains(version)) {
unreleased.add(version.replace("-SNAPSHOT", "")); unreleased.add(version);
} else { } else {
released.add(version); released.add(version);
} }