From 5d006668682d4fb3a3ec12a95f5ed722532381db Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Wed, 13 Aug 2025 11:46:33 -0700 Subject: [PATCH 1/7] Move inner records out of TransportVersionUtils The utilities class has basically become a package itself. This commit moves inner records from TransportversionUtils and some related functions out to their own files. --- build-tools-internal/build.gradle | 12 +-- ...portVersionManagementPluginFuncTest.groovy | 6 +- .../BaseInternalPluginBuildPlugin.java | 4 +- ...CollectTransportVersionReferencesTask.java | 8 +- .../transport/TransportVersionDefinition.java | 33 ++++++ .../transport/TransportVersionId.java | 36 +++++++ .../transport/TransportVersionLatest.java | 24 +++++ .../transport/TransportVersionReference.java | 50 +++++++++ ... => TransportVersionReferencesPlugin.java} | 4 +- ...a => TransportVersionResourcesPlugin.java} | 8 +- .../transport/TransportVersionUtils.java | 102 ------------------ ...alidateTransportVersionReferencesTask.java | 2 +- ...alidateTransportVersionResourcesTask.java} | 12 +-- server/build.gradle | 4 +- x-pack/plugin/esql/compute/build.gradle | 2 +- 15 files changed, 172 insertions(+), 135 deletions(-) create mode 100644 build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionDefinition.java create mode 100644 build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionId.java create mode 100644 build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionLatest.java create mode 100644 build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionReference.java rename build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/{TransportVersionManagementPlugin.java => TransportVersionReferencesPlugin.java} (94%) rename build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/{GlobalTransportVersionManagementPlugin.java => TransportVersionResourcesPlugin.java} (90%) rename build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/{ValidateTransportVersionDefinitionsTask.java => ValidateTransportVersionResourcesTask.java} (95%) diff --git a/build-tools-internal/build.gradle b/build-tools-internal/build.gradle index 0b81ab90ceced..6f5dc5e0ca62c 100644 --- a/build-tools-internal/build.gradle +++ b/build-tools-internal/build.gradle @@ -220,13 +220,13 @@ gradlePlugin { id = 'elasticsearch.internal-yaml-rest-test' implementationClass = 'org.elasticsearch.gradle.internal.test.rest.InternalYamlRestTestPlugin' } - transportVersionManagementPlugin { - id = 'elasticsearch.transport-version-management' - implementationClass = 'org.elasticsearch.gradle.internal.transport.TransportVersionManagementPlugin' + transportVersionReferencesPlugin { + id = 'elasticsearch.transport-version-references' + implementationClass = 'org.elasticsearch.gradle.internal.transport.TransportVersionReferencesPlugin' } - globalTransportVersionManagementPlugin { - id = 'elasticsearch.global-transport-version-management' - implementationClass = 'org.elasticsearch.gradle.internal.transport.GlobalTransportVersionManagementPlugin' + transportVersionResourcesPlugin { + id = 'elasticsearch.transport-version-resources' + implementationClass = 'org.elasticsearch.gradle.internal.transport.TransportVersionResourcesPlugin' } } } diff --git a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPluginFuncTest.groovy b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPluginFuncTest.groovy index 0fcd2d0ae68c3..7517eb686d045 100644 --- a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPluginFuncTest.groovy +++ b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPluginFuncTest.groovy @@ -92,8 +92,8 @@ class TransportVersionManagementPluginFuncTest extends AbstractGradleFuncTest { file("myserver/build.gradle") << """ apply plugin: 'java-library' - apply plugin: 'elasticsearch.transport-version-management' - apply plugin: 'elasticsearch.global-transport-version-management' + apply plugin: 'elasticsearch.transport-version-references' + apply plugin: 'elasticsearch.transport-version-resources' """ definedTransportVersion("existing_91", "8012000") definedTransportVersion("existing_92", "8123000,8012001") @@ -112,7 +112,7 @@ class TransportVersionManagementPluginFuncTest extends AbstractGradleFuncTest { file("myplugin/build.gradle") << """ apply plugin: 'java-library' - apply plugin: 'elasticsearch.transport-version-management' + apply plugin: 'elasticsearch.transport-version-resources' dependencies { implementation project(":myserver") diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BaseInternalPluginBuildPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BaseInternalPluginBuildPlugin.java index f89eb3131bc7f..bcdd2431d1f01 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BaseInternalPluginBuildPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BaseInternalPluginBuildPlugin.java @@ -15,7 +15,7 @@ import org.elasticsearch.gradle.internal.info.BuildParameterExtension; import org.elasticsearch.gradle.internal.precommit.JarHellPrecommitPlugin; import org.elasticsearch.gradle.internal.test.ClusterFeaturesMetadataPlugin; -import org.elasticsearch.gradle.internal.transport.TransportVersionManagementPlugin; +import org.elasticsearch.gradle.internal.transport.TransportVersionReferencesPlugin; import org.elasticsearch.gradle.plugin.PluginBuildPlugin; import org.elasticsearch.gradle.plugin.PluginPropertiesExtension; import org.elasticsearch.gradle.util.GradleUtils; @@ -37,7 +37,7 @@ public void apply(Project project) { project.getPluginManager().apply(JarHellPrecommitPlugin.class); project.getPluginManager().apply(ElasticsearchJavaPlugin.class); project.getPluginManager().apply(ClusterFeaturesMetadataPlugin.class); - project.getPluginManager().apply(TransportVersionManagementPlugin.class); + project.getPluginManager().apply(TransportVersionReferencesPlugin.class); boolean isCi = project.getRootProject().getExtensions().getByType(BuildParameterExtension.class).getCi(); // Clear default dependencies added by public PluginBuildPlugin as we add our // own project dependencies for internal builds diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/CollectTransportVersionReferencesTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/CollectTransportVersionReferencesTask.java index 92b8487ec742d..34aa7d3dc274a 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/CollectTransportVersionReferencesTask.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/CollectTransportVersionReferencesTask.java @@ -61,7 +61,7 @@ public abstract class CollectTransportVersionReferencesTask extends DefaultTask @TaskAction public void checkTransportVersion() throws IOException { - var results = new HashSet(); + var results = new HashSet(); for (var cpElement : getClassPath()) { Path file = cpElement.toPath(); @@ -74,7 +74,7 @@ public void checkTransportVersion() throws IOException { Files.writeString(outputFile, String.join("\n", results.stream().map(Object::toString).sorted().toList())); } - private void addNamesFromClassesDirectory(Set results, Path basePath) + private void addNamesFromClassesDirectory(Set results, Path basePath) throws IOException { Files.walkFileTree(basePath, new SimpleFileVisitor<>() { @Override @@ -90,7 +90,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO }); } - private void addNamesFromClass(Set results, InputStream classBytes, String classname) + private void addNamesFromClass(Set results, InputStream classBytes, String classname) throws IOException { ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM9) { @Override @@ -111,7 +111,7 @@ public void visitMethodInsn(int opcode, String owner, String name, String descri if (abstractInstruction instanceof LdcInsnNode ldcInsnNode && ldcInsnNode.cst instanceof String tvName && tvName.isEmpty() == false) { - results.add(new TransportVersionUtils.TransportVersionReference(tvName, location)); + results.add(new TransportVersionReference(tvName, location)); } else { // The instruction is not a LDC with a String constant (or an empty String), which is not allowed. throw new RuntimeException( diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionDefinition.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionDefinition.java new file mode 100644 index 0000000000000..8d44811589678 --- /dev/null +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionDefinition.java @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.gradle.internal.transport; + +import java.util.ArrayList; +import java.util.List; + +record TransportVersionDefinition(String name, List ids) { + public static TransportVersionDefinition fromString(String filename, String contents) { + assert filename.endsWith(".csv"); + String name = filename.substring(0, filename.length() - 4); + List ids = new ArrayList<>(); + + if (contents.isEmpty() == false) { + for (String rawId : contents.split(",")) { + try { + ids.add(TransportVersionUtils.parseId(rawId)); + } catch (NumberFormatException e) { + throw new IllegalStateException("Failed to parse id " + rawId + " in " + filename, e); + } + } + } + + return new TransportVersionDefinition(name, ids); + } +} diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionId.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionId.java new file mode 100644 index 0000000000000..1fa0d8f46eea8 --- /dev/null +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionId.java @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.gradle.internal.transport; + +record TransportVersionId(int complete, int major, int server, int subsidiary, int patch) implements Comparable { + + static TransportVersionId fromString(String s) { + int complete = Integer.parseInt(s); + int patch = complete % 100; + int subsidiary = (complete / 100) % 10; + int server = (complete / 1000) % 1000; + int major = complete / 1000000; + return new TransportVersionId(complete, major, server, subsidiary, patch); + } + + @Override + public int compareTo(TransportVersionId o) { + return Integer.compare(complete, o.complete); + } + + @Override + public String toString() { + return Integer.toString(complete); + } + + public int base() { + return (complete / 1000) * 1000; + } +} diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionLatest.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionLatest.java new file mode 100644 index 0000000000000..b113553c9e1f1 --- /dev/null +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionLatest.java @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.gradle.internal.transport; + +record TransportVersionLatest(String branch, String name, TransportVersionId id) { + public static TransportVersionLatest fromString(String filename, String contents) { + assert filename.endsWith(".csv"); + String branch = filename.substring(0, filename.length() - 4); + + String[] parts = contents.split(","); + if (parts.length != 2) { + throw new IllegalStateException("Invalid transport version latest file [" + filename + "]: " + contents); + } + + return new TransportVersionLatest(branch, parts[0], TransportVersionUtils.parseId(parts[1])); + } +} diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionReference.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionReference.java new file mode 100644 index 0000000000000..5c89b41db799d --- /dev/null +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionReference.java @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.gradle.internal.transport; + +import org.gradle.api.attributes.Attribute; +import org.gradle.api.attributes.AttributeContainer; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +import static org.gradle.api.artifacts.type.ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE; + +record TransportVersionReference(String name, String location) { + + private static final Attribute REFERENCES_ATTRIBUTE = Attribute.of("transport-version-references", Boolean.class); + + static List listFromFile(Path file) throws IOException { + assert file.endsWith(".csv"); + List results = new ArrayList<>(); + for (String line : Files.readAllLines(file, StandardCharsets.UTF_8)) { + String[] parts = line.split(",", 2); + if (parts.length != 2) { + throw new IOException("Invalid transport version data file [" + file + "]: " + line); + } + results.add(new TransportVersionReference(parts[0], parts[1])); + } + return results; + } + + static void addArtifactAttribute(AttributeContainer attributes) { + attributes.attribute(ARTIFACT_TYPE_ATTRIBUTE, "csv"); + attributes.attribute(REFERENCES_ATTRIBUTE, true); + } + + @Override + public String toString() { + return name + "," + location; + } +} diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionReferencesPlugin.java similarity index 94% rename from build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java rename to build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionReferencesPlugin.java index 88d419c598bea..60012feac5da3 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionReferencesPlugin.java @@ -20,7 +20,7 @@ import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.getDefinitionsDirectory; import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.getResourcesDirectory; -public class TransportVersionManagementPlugin implements Plugin { +public class TransportVersionReferencesPlugin implements Plugin { @Override public void apply(Project project) { @@ -38,7 +38,7 @@ public void apply(Project project) { Configuration tvReferencesConfig = project.getConfigurations().create("transportVersionReferences", c -> { c.setCanBeConsumed(true); c.setCanBeResolved(false); - c.attributes(TransportVersionUtils::addTransportVersionReferencesAttribute); + c.attributes(TransportVersionReference::addArtifactAttribute); }); project.getArtifacts().add(tvReferencesConfig.getName(), collectTask); diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java similarity index 90% rename from build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java rename to build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java index 19732f855b05b..d5591bf9a54de 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java @@ -23,7 +23,7 @@ import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.getDefinitionsDirectory; import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.getResourcesDirectory; -public class GlobalTransportVersionManagementPlugin implements Plugin { +public class TransportVersionResourcesPlugin implements Plugin { @Override public void apply(Project project) { @@ -33,17 +33,17 @@ public void apply(Project project) { Configuration tvReferencesConfig = project.getConfigurations().create("globalTvReferences"); tvReferencesConfig.setCanBeConsumed(false); tvReferencesConfig.setCanBeResolved(true); - tvReferencesConfig.attributes(TransportVersionUtils::addTransportVersionReferencesAttribute); + tvReferencesConfig.attributes(TransportVersionReference::addArtifactAttribute); // iterate through all projects, and if the management plugin is applied, add that project back as a dep to check for (Project subProject : project.getRootProject().getSubprojects()) { - subProject.getPlugins().withType(TransportVersionManagementPlugin.class).configureEach(plugin -> { + subProject.getPlugins().withType(TransportVersionReferencesPlugin.class).configureEach(plugin -> { tvReferencesConfig.getDependencies().add(depsHandler.project(Map.of("path", subProject.getPath()))); }); } var validateTask = project.getTasks() - .register("validateTransportVersionDefinitions", ValidateTransportVersionDefinitionsTask.class, t -> { + .register("validateTransportVersionDefinitions", ValidateTransportVersionResourcesTask.class, t -> { t.setGroup("Transport Versions"); t.setDescription("Validates that all defined TransportVersion constants are used in at least one project"); Directory resourcesDir = getResourcesDirectory(project); diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionUtils.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionUtils.java index 4e1cb86276634..1b2a82cec94c3 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionUtils.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionUtils.java @@ -10,89 +10,15 @@ package org.elasticsearch.gradle.internal.transport; import org.gradle.api.Project; -import org.gradle.api.attributes.Attribute; -import org.gradle.api.attributes.AttributeContainer; import org.gradle.api.file.Directory; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -import static org.gradle.api.artifacts.type.ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE; class TransportVersionUtils { - static final Attribute TRANSPORT_VERSION_REFERENCES_ATTRIBUTE = Attribute.of("transport-version-references", Boolean.class); - - record TransportVersionReference(String name, String location) { - @Override - public String toString() { - return name + "," + location; - } - } - - record TransportVersionDefinition(String name, List ids) { - public static TransportVersionDefinition fromString(String filename, String contents) { - assert filename.endsWith(".csv"); - String name = filename.substring(0, filename.length() - 4); - List ids = new ArrayList<>(); - - if (contents.isEmpty() == false) { - for (String rawId : contents.split(",")) { - try { - ids.add(parseId(rawId)); - } catch (NumberFormatException e) { - throw new IllegalStateException("Failed to parse id " + rawId + " in " + filename, e); - } - } - } - - return new TransportVersionDefinition(name, ids); - } - } - - record TransportVersionLatest(String branch, String name, TransportVersionId id) { - public static TransportVersionLatest fromString(String filename, String contents) { - assert filename.endsWith(".csv"); - String branch = filename.substring(0, filename.length() - 4); - - String[] parts = contents.split(","); - if (parts.length != 2) { - throw new IllegalStateException("Invalid transport version latest file [" + filename + "]: " + contents); - } - - return new TransportVersionLatest(branch, parts[0], parseId(parts[1])); - } - } - - record TransportVersionId(int complete, int major, int server, int subsidiary, int patch) implements Comparable { - - static TransportVersionId fromString(String s) { - int complete = Integer.parseInt(s); - int patch = complete % 100; - int subsidiary = (complete / 100) % 10; - int server = (complete / 1000) % 1000; - int major = complete / 1000000; - return new TransportVersionId(complete, major, server, subsidiary, patch); - } - - @Override - public int compareTo(TransportVersionId o) { - return Integer.compare(complete, o.complete); - } - - @Override - public String toString() { - return Integer.toString(complete); - } - - public int base() { - return (complete / 1000) * 1000; - } - } static Path definitionFilePath(Directory resourcesDirectory, String name) { return getDefinitionsDirectory(resourcesDirectory).getAsFile().toPath().resolve(name + ".csv"); @@ -112,28 +38,6 @@ static TransportVersionLatest readLatestFile(Path file) throws IOException { return TransportVersionLatest.fromString(file.getFileName().toString(), contents); } - static List readReferencesFile(Path file) throws IOException { - assert file.endsWith(".txt"); - List results = new ArrayList<>(); - for (String line : Files.readAllLines(file, StandardCharsets.UTF_8)) { - String[] parts = line.split(",", 2); - if (parts.length != 2) { - throw new IOException("Invalid transport version data file [" + file + "]: " + line); - } - results.add(new TransportVersionReference(parts[0], parts[1])); - } - return results; - } - - private static TransportVersionId parseId(String rawId) { - int complete = Integer.parseInt(rawId); - int patch = complete % 100; - int subsidiary = (complete / 100) % 10; - int server = (complete / 1000) % 1000; - int major = complete / 1000000; - return new TransportVersionId(complete, major, server, subsidiary, patch); - } - static Directory getDefinitionsDirectory(Directory resourcesDirectory) { return resourcesDirectory.dir("defined"); } @@ -150,10 +54,4 @@ static Directory getResourcesDirectory(Project project) { Directory projectDir = project.project(projectName.toString()).getLayout().getProjectDirectory(); return projectDir.dir("src/main/resources/transport"); } - - static void addTransportVersionReferencesAttribute(AttributeContainer attributes) { - attributes.attribute(ARTIFACT_TYPE_ATTRIBUTE, "txt"); - attributes.attribute(TransportVersionUtils.TRANSPORT_VERSION_REFERENCES_ATTRIBUTE, true); - } - } diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java index 79050f1b171a5..968146c6d6759 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java @@ -51,7 +51,7 @@ public void validateTransportVersions() throws IOException { } Path namesFile = getReferencesFile().get().getAsFile().toPath(); - for (var tvReference : TransportVersionUtils.readReferencesFile(namesFile)) { + for (var tvReference : TransportVersionReference.listFromFile(namesFile)) { if (referenceChecker.test(tvReference.name()) == false) { throw new RuntimeException( "TransportVersion.fromName(\"" diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionResourcesTask.java similarity index 95% rename from build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java rename to build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionResourcesTask.java index 34837dcbbeeac..2791aca9e323f 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionResourcesTask.java @@ -11,10 +11,6 @@ import com.google.common.collect.Comparators; -import org.elasticsearch.gradle.internal.transport.TransportVersionUtils.TransportVersionDefinition; -import org.elasticsearch.gradle.internal.transport.TransportVersionUtils.TransportVersionId; -import org.elasticsearch.gradle.internal.transport.TransportVersionUtils.TransportVersionLatest; -import org.elasticsearch.gradle.internal.transport.TransportVersionUtils.TransportVersionReference; import org.gradle.api.DefaultTask; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.DirectoryProperty; @@ -47,17 +43,17 @@ import javax.inject.Inject; +import static org.elasticsearch.gradle.internal.transport.TransportVersionReference.listFromFile; import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.definitionFilePath; import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.latestFilePath; import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.readDefinitionFile; import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.readLatestFile; -import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.readReferencesFile; /** * Validates that each defined transport version constant is referenced by at least one project. */ @CacheableTask -public abstract class ValidateTransportVersionDefinitionsTask extends DefaultTask { +public abstract class ValidateTransportVersionResourcesTask extends DefaultTask { @InputDirectory @Optional @@ -89,7 +85,7 @@ private record IdAndDefinition(TransportVersionId id, TransportVersionDefinition Map latestByBranch = new HashMap<>(); @Inject - public ValidateTransportVersionDefinitionsTask(ExecOperations execOperations) { + public ValidateTransportVersionResourcesTask(ExecOperations execOperations) { this.execOperations = execOperations; this.rootPath = getProject().getRootProject().getLayout().getProjectDirectory().getAsFile().toPath(); } @@ -105,7 +101,7 @@ public void validateTransportVersions() throws IOException { // then collect all names referenced in the codebase for (var referencesFile : getReferencesFiles()) { - readReferencesFile(referencesFile.toPath()).stream().map(TransportVersionReference::name).forEach(allNames::add); + listFromFile(referencesFile.toPath()).stream().map(TransportVersionReference::name).forEach(allNames::add); } // now load all definitions, do some validation and record them by various keys for later quick lookup diff --git a/server/build.gradle b/server/build.gradle index 59615e5f42ac5..20557aefba731 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -12,8 +12,8 @@ apply plugin: 'elasticsearch.publish' apply plugin: 'elasticsearch.internal-cluster-test' apply plugin: 'elasticsearch.internal-test-artifact' apply plugin: 'elasticsearch.test-build-info' -apply plugin: 'elasticsearch.transport-version-management' -apply plugin: 'elasticsearch.global-transport-version-management' +apply plugin: 'elasticsearch.transport-version-references' +apply plugin: 'elasticsearch.transport-version-resources' publishing { publications { diff --git a/x-pack/plugin/esql/compute/build.gradle b/x-pack/plugin/esql/compute/build.gradle index 1405ac0999d76..2d30ad7debb19 100644 --- a/x-pack/plugin/esql/compute/build.gradle +++ b/x-pack/plugin/esql/compute/build.gradle @@ -3,7 +3,7 @@ import org.elasticsearch.gradle.internal.util.SourceDirectoryCommandLineArgument apply plugin: 'elasticsearch.build' apply plugin: 'elasticsearch.string-templates' apply plugin: 'elasticsearch.publish' -apply plugin: 'elasticsearch.transport-version-management' +apply plugin: 'elasticsearch.transport-version-references' base { archivesName = 'x-pack-esql-compute' From b698d2fa26ee93905f667b07a61631ceee1b26b7 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Wed, 13 Aug 2025 11:54:53 -0700 Subject: [PATCH 2/7] revert rename --- build-tools-internal/build.gradle | 12 ++++++------ .../TransportVersionManagementPluginFuncTest.groovy | 6 +++--- .../internal/BaseInternalPluginBuildPlugin.java | 4 ++-- ...a => GlobalTransportVersionManagementPlugin.java} | 4 ++-- ...in.java => TransportVersionManagementPlugin.java} | 2 +- server/build.gradle | 4 ++-- x-pack/plugin/esql/compute/build.gradle | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) rename build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/{TransportVersionResourcesPlugin.java => GlobalTransportVersionManagementPlugin.java} (94%) rename build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/{TransportVersionReferencesPlugin.java => TransportVersionManagementPlugin.java} (97%) diff --git a/build-tools-internal/build.gradle b/build-tools-internal/build.gradle index 6f5dc5e0ca62c..035c43c15a2e9 100644 --- a/build-tools-internal/build.gradle +++ b/build-tools-internal/build.gradle @@ -220,13 +220,13 @@ gradlePlugin { id = 'elasticsearch.internal-yaml-rest-test' implementationClass = 'org.elasticsearch.gradle.internal.test.rest.InternalYamlRestTestPlugin' } - transportVersionReferencesPlugin { - id = 'elasticsearch.transport-version-references' - implementationClass = 'org.elasticsearch.gradle.internal.transport.TransportVersionReferencesPlugin' + transportVersionManagementPlugin { + id = 'elasticsearch.transport-version-management' + implementationClass = 'org.elasticsearch.gradle.internal.transport.TransportVersionManagementPlugin' } - transportVersionResourcesPlugin { - id = 'elasticsearch.transport-version-resources' - implementationClass = 'org.elasticsearch.gradle.internal.transport.TransportVersionResourcesPlugin' + globalTransportVersionManagementPlugin { + id = 'elasticsearch.transport-version-management' + implementationClass = 'org.elasticsearch.gradle.internal.transport.GlobalTransportVersionManagementPlugin' } } } diff --git a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPluginFuncTest.groovy b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPluginFuncTest.groovy index 7517eb686d045..0fcd2d0ae68c3 100644 --- a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPluginFuncTest.groovy +++ b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPluginFuncTest.groovy @@ -92,8 +92,8 @@ class TransportVersionManagementPluginFuncTest extends AbstractGradleFuncTest { file("myserver/build.gradle") << """ apply plugin: 'java-library' - apply plugin: 'elasticsearch.transport-version-references' - apply plugin: 'elasticsearch.transport-version-resources' + apply plugin: 'elasticsearch.transport-version-management' + apply plugin: 'elasticsearch.global-transport-version-management' """ definedTransportVersion("existing_91", "8012000") definedTransportVersion("existing_92", "8123000,8012001") @@ -112,7 +112,7 @@ class TransportVersionManagementPluginFuncTest extends AbstractGradleFuncTest { file("myplugin/build.gradle") << """ apply plugin: 'java-library' - apply plugin: 'elasticsearch.transport-version-resources' + apply plugin: 'elasticsearch.transport-version-management' dependencies { implementation project(":myserver") diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BaseInternalPluginBuildPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BaseInternalPluginBuildPlugin.java index bcdd2431d1f01..f89eb3131bc7f 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BaseInternalPluginBuildPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/BaseInternalPluginBuildPlugin.java @@ -15,7 +15,7 @@ import org.elasticsearch.gradle.internal.info.BuildParameterExtension; import org.elasticsearch.gradle.internal.precommit.JarHellPrecommitPlugin; import org.elasticsearch.gradle.internal.test.ClusterFeaturesMetadataPlugin; -import org.elasticsearch.gradle.internal.transport.TransportVersionReferencesPlugin; +import org.elasticsearch.gradle.internal.transport.TransportVersionManagementPlugin; import org.elasticsearch.gradle.plugin.PluginBuildPlugin; import org.elasticsearch.gradle.plugin.PluginPropertiesExtension; import org.elasticsearch.gradle.util.GradleUtils; @@ -37,7 +37,7 @@ public void apply(Project project) { project.getPluginManager().apply(JarHellPrecommitPlugin.class); project.getPluginManager().apply(ElasticsearchJavaPlugin.class); project.getPluginManager().apply(ClusterFeaturesMetadataPlugin.class); - project.getPluginManager().apply(TransportVersionReferencesPlugin.class); + project.getPluginManager().apply(TransportVersionManagementPlugin.class); boolean isCi = project.getRootProject().getExtensions().getByType(BuildParameterExtension.class).getCi(); // Clear default dependencies added by public PluginBuildPlugin as we add our // own project dependencies for internal builds diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java similarity index 94% rename from build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java rename to build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java index d5591bf9a54de..88f2f7fd8a908 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java @@ -23,7 +23,7 @@ import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.getDefinitionsDirectory; import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.getResourcesDirectory; -public class TransportVersionResourcesPlugin implements Plugin { +public class GlobalTransportVersionManagementPlugin implements Plugin { @Override public void apply(Project project) { @@ -37,7 +37,7 @@ public void apply(Project project) { // iterate through all projects, and if the management plugin is applied, add that project back as a dep to check for (Project subProject : project.getRootProject().getSubprojects()) { - subProject.getPlugins().withType(TransportVersionReferencesPlugin.class).configureEach(plugin -> { + subProject.getPlugins().withType(TransportVersionManagementPlugin.class).configureEach(plugin -> { tvReferencesConfig.getDependencies().add(depsHandler.project(Map.of("path", subProject.getPath()))); }); } diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionReferencesPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java similarity index 97% rename from build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionReferencesPlugin.java rename to build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java index 60012feac5da3..41c091dc886a4 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionReferencesPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java @@ -20,7 +20,7 @@ import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.getDefinitionsDirectory; import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.getResourcesDirectory; -public class TransportVersionReferencesPlugin implements Plugin { +public class TransportVersionManagementPlugin implements Plugin { @Override public void apply(Project project) { diff --git a/server/build.gradle b/server/build.gradle index 20557aefba731..59615e5f42ac5 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -12,8 +12,8 @@ apply plugin: 'elasticsearch.publish' apply plugin: 'elasticsearch.internal-cluster-test' apply plugin: 'elasticsearch.internal-test-artifact' apply plugin: 'elasticsearch.test-build-info' -apply plugin: 'elasticsearch.transport-version-references' -apply plugin: 'elasticsearch.transport-version-resources' +apply plugin: 'elasticsearch.transport-version-management' +apply plugin: 'elasticsearch.global-transport-version-management' publishing { publications { diff --git a/x-pack/plugin/esql/compute/build.gradle b/x-pack/plugin/esql/compute/build.gradle index 2d30ad7debb19..1405ac0999d76 100644 --- a/x-pack/plugin/esql/compute/build.gradle +++ b/x-pack/plugin/esql/compute/build.gradle @@ -3,7 +3,7 @@ import org.elasticsearch.gradle.internal.util.SourceDirectoryCommandLineArgument apply plugin: 'elasticsearch.build' apply plugin: 'elasticsearch.string-templates' apply plugin: 'elasticsearch.publish' -apply plugin: 'elasticsearch.transport-version-references' +apply plugin: 'elasticsearch.transport-version-management' base { archivesName = 'x-pack-esql-compute' From cd2dc1828bdf3d14d3a32335e125cb0d10a60c8d Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Wed, 13 Aug 2025 11:55:27 -0700 Subject: [PATCH 3/7] fix oops --- build-tools-internal/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-tools-internal/build.gradle b/build-tools-internal/build.gradle index 035c43c15a2e9..0b81ab90ceced 100644 --- a/build-tools-internal/build.gradle +++ b/build-tools-internal/build.gradle @@ -225,7 +225,7 @@ gradlePlugin { implementationClass = 'org.elasticsearch.gradle.internal.transport.TransportVersionManagementPlugin' } globalTransportVersionManagementPlugin { - id = 'elasticsearch.transport-version-management' + id = 'elasticsearch.global-transport-version-management' implementationClass = 'org.elasticsearch.gradle.internal.transport.GlobalTransportVersionManagementPlugin' } } From 4f77cc08ca84628440facbe1ec0374c5fdb137b4 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Wed, 13 Aug 2025 11:56:22 -0700 Subject: [PATCH 4/7] another accidental rename --- .../internal/transport/TransportVersionManagementPlugin.java | 2 +- ...esTask.java => ValidateTransportVersionDefinitionsTask.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/{ValidateTransportVersionReferencesTask.java => ValidateTransportVersionDefinitionsTask.java} (96%) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java index 41c091dc886a4..7e22faa790c0b 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java @@ -43,7 +43,7 @@ public void apply(Project project) { project.getArtifacts().add(tvReferencesConfig.getName(), collectTask); var validateTask = project.getTasks() - .register("validateTransportVersionReferences", ValidateTransportVersionReferencesTask.class, t -> { + .register("validateTransportVersionReferences", ValidateTransportVersionDefinitionsTask.class, t -> { t.setGroup("Transport Versions"); t.setDescription("Validates that all TransportVersion references used in the project have an associated definition file"); Directory definitionsDir = getDefinitionsDirectory(getResourcesDirectory(project)); diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java similarity index 96% rename from build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java rename to build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java index 968146c6d6759..2830a70f74b74 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java @@ -29,7 +29,7 @@ * Validates that each transport version named reference has a constant definition. */ @CacheableTask -public abstract class ValidateTransportVersionReferencesTask extends DefaultTask { +public abstract class ValidateTransportVersionDefinitionsTask extends DefaultTask { @InputDirectory @Optional From c827ff11b0cb20ce58da2c649ac585bc9c4b6bf2 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Wed, 13 Aug 2025 11:57:21 -0700 Subject: [PATCH 5/7] oops --- ...lobalTransportVersionManagementPlugin.java | 2 +- .../TransportVersionManagementPlugin.java | 2 +- ...lidateTransportVersionDefinitionsTask.java | 310 +++++++++++++++-- ...alidateTransportVersionReferencesTask.java | 67 ++++ ...ValidateTransportVersionResourcesTask.java | 327 ------------------ 5 files changed, 354 insertions(+), 354 deletions(-) create mode 100644 build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java delete mode 100644 build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionResourcesTask.java diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java index 88f2f7fd8a908..9f14c95f3591d 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java @@ -43,7 +43,7 @@ public void apply(Project project) { } var validateTask = project.getTasks() - .register("validateTransportVersionDefinitions", ValidateTransportVersionResourcesTask.class, t -> { + .register("validateTransportVersionDefinitions", ValidateTransportVersionDefinitionsTask.class, t -> { t.setGroup("Transport Versions"); t.setDescription("Validates that all defined TransportVersion constants are used in at least one project"); Directory resourcesDir = getResourcesDirectory(project); diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java index 7e22faa790c0b..41c091dc886a4 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionManagementPlugin.java @@ -43,7 +43,7 @@ public void apply(Project project) { project.getArtifacts().add(tvReferencesConfig.getName(), collectTask); var validateTask = project.getTasks() - .register("validateTransportVersionReferences", ValidateTransportVersionDefinitionsTask.class, t -> { + .register("validateTransportVersionReferences", ValidateTransportVersionReferencesTask.class, t -> { t.setGroup("Transport Versions"); t.setDescription("Validates that all TransportVersion references used in the project have an associated definition file"); Directory definitionsDir = getDefinitionsDirectory(getResourcesDirectory(project)); diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java index 2830a70f74b74..794c4645d6184 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java @@ -9,24 +9,48 @@ package org.elasticsearch.gradle.internal.transport; +import com.google.common.collect.Comparators; + import org.gradle.api.DefaultTask; +import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.DirectoryProperty; -import org.gradle.api.file.RegularFileProperty; import org.gradle.api.tasks.CacheableTask; import org.gradle.api.tasks.InputDirectory; -import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.PathSensitive; import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.process.ExecOperations; +import org.gradle.process.ExecResult; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.function.Predicate; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.regex.Pattern; + +import javax.inject.Inject; + +import static org.elasticsearch.gradle.internal.transport.TransportVersionReference.listFromFile; +import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.definitionFilePath; +import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.latestFilePath; +import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.readDefinitionFile; +import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.readLatestFile; /** - * Validates that each transport version named reference has a constant definition. + * Validates that each defined transport version constant is referenced by at least one project. */ @CacheableTask public abstract class ValidateTransportVersionDefinitionsTask extends DefaultTask { @@ -34,34 +58,270 @@ public abstract class ValidateTransportVersionDefinitionsTask extends DefaultTas @InputDirectory @Optional @PathSensitive(PathSensitivity.RELATIVE) - public abstract DirectoryProperty getDefinitionsDirectory(); + public abstract DirectoryProperty getResourcesDirectory(); - @InputFile + @InputFiles @PathSensitive(PathSensitivity.RELATIVE) - public abstract RegularFileProperty getReferencesFile(); + public abstract ConfigurableFileCollection getReferencesFiles(); + + private record IdAndDefinition(TransportVersionId id, TransportVersionDefinition definition) {} + + private static final Pattern NAME_FORMAT = Pattern.compile("[a-z0-9_]+"); + + private final Path rootPath; + private final ExecOperations execOperations; + + // all transport version names referenced + private final Set allNames = new HashSet<>(); + // direct lookup of definition by name + private final Map definitions = new HashMap<>(); + // which resource files already existed + private final Set existingResources = new HashSet<>(); + // reverse lookup of ids back to name + private final Map definedIds = new HashMap<>(); + // lookup of base ids back to definition + private final Map> idsByBase = new HashMap<>(); + // direct lookup of latest for each branch + Map latestByBranch = new HashMap<>(); + + @Inject + public ValidateTransportVersionDefinitionsTask(ExecOperations execOperations) { + this.execOperations = execOperations; + this.rootPath = getProject().getRootProject().getLayout().getProjectDirectory().getAsFile().toPath(); + } @TaskAction public void validateTransportVersions() throws IOException { - final Predicate referenceChecker; - if (getDefinitionsDirectory().isPresent()) { - Path definitionsDir = getDefinitionsDirectory().getAsFile().get().toPath(); - referenceChecker = (name) -> Files.exists(definitionsDir.resolve(name + ".csv")); - } else { - referenceChecker = (name) -> false; - } - Path namesFile = getReferencesFile().get().getAsFile().toPath(); - - for (var tvReference : TransportVersionReference.listFromFile(namesFile)) { - if (referenceChecker.test(tvReference.name()) == false) { - throw new RuntimeException( - "TransportVersion.fromName(\"" - + tvReference.name() - + "\") was used at " - + tvReference.location() - + ", but lacks a" - + " transport version definition. This can be generated with the task" // todo + Path resourcesDir = getResourcesDirectory().getAsFile().get().toPath(); + Path definitionsDir = resourcesDir.resolve("defined"); + Path latestDir = resourcesDir.resolve("latest"); + + // first check which resource files already exist in main + recordExistingResources(); + + // then collect all names referenced in the codebase + for (var referencesFile : getReferencesFiles()) { + listFromFile(referencesFile.toPath()).stream().map(TransportVersionReference::name).forEach(allNames::add); + } + + // now load all definitions, do some validation and record them by various keys for later quick lookup + // NOTE: this must run after loading referenced names and existing definitions + // NOTE: this is sorted so that the order of cross validation is deterministic + try (var definitionsStream = Files.list(definitionsDir).sorted()) { + for (var definitionFile : definitionsStream.toList()) { + recordAndValidateDefinition(readDefinitionFile(definitionFile)); + } + } + + // cleanup base lookup so we can check ids + // NOTE: this must run after definition recording + for (var entry : idsByBase.entrySet()) { + cleanupAndValidateBase(entry.getKey(), entry.getValue()); + } + + // now load all latest versions and do validation + // NOTE: this must run after definition recording and idsByBase cleanup + try (var latestStream = Files.list(latestDir)) { + for (var latestFile : latestStream.toList()) { + recordAndValidateLatest(readLatestFile(latestFile)); + } + } + } + + private String gitCommand(String... args) { + final ByteArrayOutputStream stdout = new ByteArrayOutputStream(); + + List command = new ArrayList<>(); + Collections.addAll(command, "git", "-C", rootPath.toAbsolutePath().toString()); + Collections.addAll(command, args); + + ExecResult result = execOperations.exec(spec -> { + spec.setCommandLine(command); + spec.setStandardOutput(stdout); + spec.setErrorOutput(stdout); + spec.setIgnoreExitValue(true); + }); + + if (result.getExitValue() != 0) { + throw new RuntimeException( + "git command failed with exit code " + + result.getExitValue() + + System.lineSeparator() + + "command: " + + String.join(" ", command) + + System.lineSeparator() + + "output:" + + System.lineSeparator() + + stdout.toString(StandardCharsets.UTF_8) + ); + } + + return stdout.toString(StandardCharsets.UTF_8); + } + + private void recordExistingResources() { + String resourcesPath = relativePath(getResourcesDirectory().getAsFile().get().toPath()); + String output = gitCommand("ls-tree", "--name-only", "-r", "main", resourcesPath); + Collections.addAll(existingResources, output.split(System.lineSeparator())); + } + + private void recordAndValidateDefinition(TransportVersionDefinition definition) { + definitions.put(definition.name(), definition); + // record the ids for each base id so we can ensure compactness later + for (TransportVersionId id : definition.ids()) { + idsByBase.computeIfAbsent(id.base(), k -> new ArrayList<>()).add(new IdAndDefinition(id, definition)); + } + + // validate any modifications + Map existingIdsByBase = new HashMap<>(); + TransportVersionDefinition originalDefinition = readExistingDefinition(definition.name()); + if (originalDefinition != null) { + + int primaryId = definition.ids().get(0).complete(); + int originalPrimaryId = originalDefinition.ids().get(0).complete(); + if (primaryId != originalPrimaryId) { + throwDefinitionFailure(definition.name(), "has modified primary id from " + originalPrimaryId + " to " + primaryId); + } + + originalDefinition.ids().forEach(id -> existingIdsByBase.put(id.base(), id)); + } + + if (allNames.contains(definition.name()) == false && definition.name().startsWith("initial_") == false) { + throwDefinitionFailure(definition.name(), "is not referenced"); + } + if (NAME_FORMAT.matcher(definition.name()).matches() == false) { + throwDefinitionFailure(definition.name(), "does not have a valid name, must be lowercase alphanumeric and underscore"); + } + if (definition.ids().isEmpty()) { + throwDefinitionFailure(definition.name(), "does not contain any ids"); + } + if (Comparators.isInOrder(definition.ids(), Comparator.reverseOrder()) == false) { + throwDefinitionFailure(definition.name(), "does not have ordered ids"); + } + for (int ndx = 0; ndx < definition.ids().size(); ++ndx) { + TransportVersionId id = definition.ids().get(ndx); + + String existing = definedIds.put(id.complete(), definition.name()); + if (existing != null) { + throwDefinitionFailure( + definition.name(), + "contains id " + id + " already defined in [" + definitionRelativePath(existing) + "]" + ); + } + + if (ndx == 0) { + // TODO: initial versions will only be applicable to a release branch, so they won't have an associated + // main version. They will also be loaded differently in the future, but until they are separate, we ignore them here. + if (id.patch() != 0 && definition.name().startsWith("initial_") == false) { + throwDefinitionFailure(definition.name(), "has patch version " + id.complete() + " as primary id"); + } + } else { + if (id.patch() == 0) { + throwDefinitionFailure(definition.name(), "contains bwc id [" + id + "] with a patch part of 0"); + } + } + + // check modifications of ids on same branch, ie sharing same base + TransportVersionId maybeModifiedId = existingIdsByBase.get(id.base()); + if (maybeModifiedId != null && maybeModifiedId.complete() != id.complete()) { + throwDefinitionFailure(definition.name(), "modifies existing patch id from " + maybeModifiedId + " to " + id); + } + } + } + + private TransportVersionDefinition readExistingDefinition(String name) { + return readExistingFile(name, this::definitionRelativePath, TransportVersionDefinition::fromString); + } + + private TransportVersionLatest readExistingLatest(String branch) { + return readExistingFile(branch, this::latestRelativePath, TransportVersionLatest::fromString); + } + + private T readExistingFile(String name, Function pathFunction, BiFunction parser) { + String relativePath = pathFunction.apply(name); + if (existingResources.contains(relativePath) == false) { + return null; + } + String content = gitCommand("show", "main:" + relativePath).strip(); + return parser.apply(relativePath, content); + } + + private void recordAndValidateLatest(TransportVersionLatest latest) { + latestByBranch.put(latest.branch(), latest); + + TransportVersionDefinition latestDefinition = definitions.get(latest.name()); + if (latestDefinition == null) { + throwLatestFailure(latest.branch(), "contains transport version name [" + latest.name() + "] which is not defined"); + } + if (latestDefinition.ids().contains(latest.id()) == false) { + throwLatestFailure( + latest.branch(), + "has id " + latest.id() + " which is not in definition [" + definitionRelativePath(latest.name()) + "]" + ); + } + + List baseIds = idsByBase.get(latest.id().base()); + IdAndDefinition lastId = baseIds.getLast(); + if (lastId.id().complete() != latest.id().complete()) { + throwLatestFailure( + latest.branch(), + "has id " + + latest.id() + + " from [" + + latest.name() + + "] with base " + + latest.id().base() + + " but another id " + + lastId.id().complete() + + " from [" + + lastId.definition().name() + + "] is later for that base" + ); + } + + TransportVersionLatest existingLatest = readExistingLatest(latest.branch()); + if (existingLatest != null) { + if (latest.id().patch() != 0 && latest.id().base() != existingLatest.id().base()) { + throwLatestFailure(latest.branch(), "modifies base id from " + existingLatest.id().base() + " to " + latest.id().base()); + } + } + } + + private void cleanupAndValidateBase(int base, List ids) { + // first sort the ids list so we can check compactness and quickly lookup the highest id later + ids.sort(Comparator.comparingInt(a -> a.id().complete())); + + // TODO: switch this to a fully dense check once all existing transport versions have been migrated + IdAndDefinition previous = ids.getLast(); + for (int ndx = ids.size() - 2; ndx >= 0; --ndx) { + IdAndDefinition next = ids.get(ndx); + // note that next and previous are reversed here because we are iterating in reverse order + if (previous.id().complete() - 1 != next.id().complete()) { + throw new IllegalStateException( + "Transport version base id " + base + " is missing patch ids between " + next.id() + " and " + previous.id() ); } + previous = next; } } + + private void throwDefinitionFailure(String name, String message) { + throw new IllegalStateException("Transport version definition file [" + definitionRelativePath(name) + "] " + message); + } + + private void throwLatestFailure(String branch, String message) { + throw new IllegalStateException("Latest transport version file [" + latestRelativePath(branch) + "] " + message); + } + + private String definitionRelativePath(String name) { + return relativePath(definitionFilePath(getResourcesDirectory().get(), name)); + } + + private String latestRelativePath(String branch) { + return relativePath(latestFilePath(getResourcesDirectory().get(), branch)); + } + + private String relativePath(Path file) { + return rootPath.relativize(file).toString(); + } } diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java new file mode 100644 index 0000000000000..968146c6d6759 --- /dev/null +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionReferencesTask.java @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.gradle.internal.transport; + +import org.gradle.api.DefaultTask; +import org.gradle.api.file.DirectoryProperty; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.tasks.CacheableTask; +import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.Optional; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; +import org.gradle.api.tasks.TaskAction; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.function.Predicate; + +/** + * Validates that each transport version named reference has a constant definition. + */ +@CacheableTask +public abstract class ValidateTransportVersionReferencesTask extends DefaultTask { + + @InputDirectory + @Optional + @PathSensitive(PathSensitivity.RELATIVE) + public abstract DirectoryProperty getDefinitionsDirectory(); + + @InputFile + @PathSensitive(PathSensitivity.RELATIVE) + public abstract RegularFileProperty getReferencesFile(); + + @TaskAction + public void validateTransportVersions() throws IOException { + final Predicate referenceChecker; + if (getDefinitionsDirectory().isPresent()) { + Path definitionsDir = getDefinitionsDirectory().getAsFile().get().toPath(); + referenceChecker = (name) -> Files.exists(definitionsDir.resolve(name + ".csv")); + } else { + referenceChecker = (name) -> false; + } + Path namesFile = getReferencesFile().get().getAsFile().toPath(); + + for (var tvReference : TransportVersionReference.listFromFile(namesFile)) { + if (referenceChecker.test(tvReference.name()) == false) { + throw new RuntimeException( + "TransportVersion.fromName(\"" + + tvReference.name() + + "\") was used at " + + tvReference.location() + + ", but lacks a" + + " transport version definition. This can be generated with the task" // todo + ); + } + } + } +} diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionResourcesTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionResourcesTask.java deleted file mode 100644 index 2791aca9e323f..0000000000000 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionResourcesTask.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -package org.elasticsearch.gradle.internal.transport; - -import com.google.common.collect.Comparators; - -import org.gradle.api.DefaultTask; -import org.gradle.api.file.ConfigurableFileCollection; -import org.gradle.api.file.DirectoryProperty; -import org.gradle.api.tasks.CacheableTask; -import org.gradle.api.tasks.InputDirectory; -import org.gradle.api.tasks.InputFiles; -import org.gradle.api.tasks.Optional; -import org.gradle.api.tasks.PathSensitive; -import org.gradle.api.tasks.PathSensitivity; -import org.gradle.api.tasks.TaskAction; -import org.gradle.process.ExecOperations; -import org.gradle.process.ExecResult; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.regex.Pattern; - -import javax.inject.Inject; - -import static org.elasticsearch.gradle.internal.transport.TransportVersionReference.listFromFile; -import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.definitionFilePath; -import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.latestFilePath; -import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.readDefinitionFile; -import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.readLatestFile; - -/** - * Validates that each defined transport version constant is referenced by at least one project. - */ -@CacheableTask -public abstract class ValidateTransportVersionResourcesTask extends DefaultTask { - - @InputDirectory - @Optional - @PathSensitive(PathSensitivity.RELATIVE) - public abstract DirectoryProperty getResourcesDirectory(); - - @InputFiles - @PathSensitive(PathSensitivity.RELATIVE) - public abstract ConfigurableFileCollection getReferencesFiles(); - - private record IdAndDefinition(TransportVersionId id, TransportVersionDefinition definition) {} - - private static final Pattern NAME_FORMAT = Pattern.compile("[a-z0-9_]+"); - - private final Path rootPath; - private final ExecOperations execOperations; - - // all transport version names referenced - private final Set allNames = new HashSet<>(); - // direct lookup of definition by name - private final Map definitions = new HashMap<>(); - // which resource files already existed - private final Set existingResources = new HashSet<>(); - // reverse lookup of ids back to name - private final Map definedIds = new HashMap<>(); - // lookup of base ids back to definition - private final Map> idsByBase = new HashMap<>(); - // direct lookup of latest for each branch - Map latestByBranch = new HashMap<>(); - - @Inject - public ValidateTransportVersionResourcesTask(ExecOperations execOperations) { - this.execOperations = execOperations; - this.rootPath = getProject().getRootProject().getLayout().getProjectDirectory().getAsFile().toPath(); - } - - @TaskAction - public void validateTransportVersions() throws IOException { - Path resourcesDir = getResourcesDirectory().getAsFile().get().toPath(); - Path definitionsDir = resourcesDir.resolve("defined"); - Path latestDir = resourcesDir.resolve("latest"); - - // first check which resource files already exist in main - recordExistingResources(); - - // then collect all names referenced in the codebase - for (var referencesFile : getReferencesFiles()) { - listFromFile(referencesFile.toPath()).stream().map(TransportVersionReference::name).forEach(allNames::add); - } - - // now load all definitions, do some validation and record them by various keys for later quick lookup - // NOTE: this must run after loading referenced names and existing definitions - // NOTE: this is sorted so that the order of cross validation is deterministic - try (var definitionsStream = Files.list(definitionsDir).sorted()) { - for (var definitionFile : definitionsStream.toList()) { - recordAndValidateDefinition(readDefinitionFile(definitionFile)); - } - } - - // cleanup base lookup so we can check ids - // NOTE: this must run after definition recording - for (var entry : idsByBase.entrySet()) { - cleanupAndValidateBase(entry.getKey(), entry.getValue()); - } - - // now load all latest versions and do validation - // NOTE: this must run after definition recording and idsByBase cleanup - try (var latestStream = Files.list(latestDir)) { - for (var latestFile : latestStream.toList()) { - recordAndValidateLatest(readLatestFile(latestFile)); - } - } - } - - private String gitCommand(String... args) { - final ByteArrayOutputStream stdout = new ByteArrayOutputStream(); - - List command = new ArrayList<>(); - Collections.addAll(command, "git", "-C", rootPath.toAbsolutePath().toString()); - Collections.addAll(command, args); - - ExecResult result = execOperations.exec(spec -> { - spec.setCommandLine(command); - spec.setStandardOutput(stdout); - spec.setErrorOutput(stdout); - spec.setIgnoreExitValue(true); - }); - - if (result.getExitValue() != 0) { - throw new RuntimeException( - "git command failed with exit code " - + result.getExitValue() - + System.lineSeparator() - + "command: " - + String.join(" ", command) - + System.lineSeparator() - + "output:" - + System.lineSeparator() - + stdout.toString(StandardCharsets.UTF_8) - ); - } - - return stdout.toString(StandardCharsets.UTF_8); - } - - private void recordExistingResources() { - String resourcesPath = relativePath(getResourcesDirectory().getAsFile().get().toPath()); - String output = gitCommand("ls-tree", "--name-only", "-r", "main", resourcesPath); - Collections.addAll(existingResources, output.split(System.lineSeparator())); - } - - private void recordAndValidateDefinition(TransportVersionDefinition definition) { - definitions.put(definition.name(), definition); - // record the ids for each base id so we can ensure compactness later - for (TransportVersionId id : definition.ids()) { - idsByBase.computeIfAbsent(id.base(), k -> new ArrayList<>()).add(new IdAndDefinition(id, definition)); - } - - // validate any modifications - Map existingIdsByBase = new HashMap<>(); - TransportVersionDefinition originalDefinition = readExistingDefinition(definition.name()); - if (originalDefinition != null) { - - int primaryId = definition.ids().get(0).complete(); - int originalPrimaryId = originalDefinition.ids().get(0).complete(); - if (primaryId != originalPrimaryId) { - throwDefinitionFailure(definition.name(), "has modified primary id from " + originalPrimaryId + " to " + primaryId); - } - - originalDefinition.ids().forEach(id -> existingIdsByBase.put(id.base(), id)); - } - - if (allNames.contains(definition.name()) == false && definition.name().startsWith("initial_") == false) { - throwDefinitionFailure(definition.name(), "is not referenced"); - } - if (NAME_FORMAT.matcher(definition.name()).matches() == false) { - throwDefinitionFailure(definition.name(), "does not have a valid name, must be lowercase alphanumeric and underscore"); - } - if (definition.ids().isEmpty()) { - throwDefinitionFailure(definition.name(), "does not contain any ids"); - } - if (Comparators.isInOrder(definition.ids(), Comparator.reverseOrder()) == false) { - throwDefinitionFailure(definition.name(), "does not have ordered ids"); - } - for (int ndx = 0; ndx < definition.ids().size(); ++ndx) { - TransportVersionId id = definition.ids().get(ndx); - - String existing = definedIds.put(id.complete(), definition.name()); - if (existing != null) { - throwDefinitionFailure( - definition.name(), - "contains id " + id + " already defined in [" + definitionRelativePath(existing) + "]" - ); - } - - if (ndx == 0) { - // TODO: initial versions will only be applicable to a release branch, so they won't have an associated - // main version. They will also be loaded differently in the future, but until they are separate, we ignore them here. - if (id.patch() != 0 && definition.name().startsWith("initial_") == false) { - throwDefinitionFailure(definition.name(), "has patch version " + id.complete() + " as primary id"); - } - } else { - if (id.patch() == 0) { - throwDefinitionFailure(definition.name(), "contains bwc id [" + id + "] with a patch part of 0"); - } - } - - // check modifications of ids on same branch, ie sharing same base - TransportVersionId maybeModifiedId = existingIdsByBase.get(id.base()); - if (maybeModifiedId != null && maybeModifiedId.complete() != id.complete()) { - throwDefinitionFailure(definition.name(), "modifies existing patch id from " + maybeModifiedId + " to " + id); - } - } - } - - private TransportVersionDefinition readExistingDefinition(String name) { - return readExistingFile(name, this::definitionRelativePath, TransportVersionDefinition::fromString); - } - - private TransportVersionLatest readExistingLatest(String branch) { - return readExistingFile(branch, this::latestRelativePath, TransportVersionLatest::fromString); - } - - private T readExistingFile(String name, Function pathFunction, BiFunction parser) { - String relativePath = pathFunction.apply(name); - if (existingResources.contains(relativePath) == false) { - return null; - } - String content = gitCommand("show", "main:" + relativePath).strip(); - return parser.apply(relativePath, content); - } - - private void recordAndValidateLatest(TransportVersionLatest latest) { - latestByBranch.put(latest.branch(), latest); - - TransportVersionDefinition latestDefinition = definitions.get(latest.name()); - if (latestDefinition == null) { - throwLatestFailure(latest.branch(), "contains transport version name [" + latest.name() + "] which is not defined"); - } - if (latestDefinition.ids().contains(latest.id()) == false) { - throwLatestFailure( - latest.branch(), - "has id " + latest.id() + " which is not in definition [" + definitionRelativePath(latest.name()) + "]" - ); - } - - List baseIds = idsByBase.get(latest.id().base()); - IdAndDefinition lastId = baseIds.getLast(); - if (lastId.id().complete() != latest.id().complete()) { - throwLatestFailure( - latest.branch(), - "has id " - + latest.id() - + " from [" - + latest.name() - + "] with base " - + latest.id().base() - + " but another id " - + lastId.id().complete() - + " from [" - + lastId.definition().name() - + "] is later for that base" - ); - } - - TransportVersionLatest existingLatest = readExistingLatest(latest.branch()); - if (existingLatest != null) { - if (latest.id().patch() != 0 && latest.id().base() != existingLatest.id().base()) { - throwLatestFailure(latest.branch(), "modifies base id from " + existingLatest.id().base() + " to " + latest.id().base()); - } - } - } - - private void cleanupAndValidateBase(int base, List ids) { - // first sort the ids list so we can check compactness and quickly lookup the highest id later - ids.sort(Comparator.comparingInt(a -> a.id().complete())); - - // TODO: switch this to a fully dense check once all existing transport versions have been migrated - IdAndDefinition previous = ids.getLast(); - for (int ndx = ids.size() - 2; ndx >= 0; --ndx) { - IdAndDefinition next = ids.get(ndx); - // note that next and previous are reversed here because we are iterating in reverse order - if (previous.id().complete() - 1 != next.id().complete()) { - throw new IllegalStateException( - "Transport version base id " + base + " is missing patch ids between " + next.id() + " and " + previous.id() - ); - } - previous = next; - } - } - - private void throwDefinitionFailure(String name, String message) { - throw new IllegalStateException("Transport version definition file [" + definitionRelativePath(name) + "] " + message); - } - - private void throwLatestFailure(String branch, String message) { - throw new IllegalStateException("Latest transport version file [" + latestRelativePath(branch) + "] " + message); - } - - private String definitionRelativePath(String name) { - return relativePath(definitionFilePath(getResourcesDirectory().get(), name)); - } - - private String latestRelativePath(String branch) { - return relativePath(latestFilePath(getResourcesDirectory().get(), branch)); - } - - private String relativePath(Path file) { - return rootPath.relativize(file).toString(); - } -} From 43e1e1757bdf3c6a00119ee6c416ff75d812f35b Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Wed, 13 Aug 2025 12:06:18 -0700 Subject: [PATCH 6/7] fix compile --- .../gradle/internal/transport/TransportVersionDefinition.java | 2 +- .../gradle/internal/transport/TransportVersionLatest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionDefinition.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionDefinition.java index 8d44811589678..327d2f7d632f5 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionDefinition.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionDefinition.java @@ -21,7 +21,7 @@ public static TransportVersionDefinition fromString(String filename, String cont if (contents.isEmpty() == false) { for (String rawId : contents.split(",")) { try { - ids.add(TransportVersionUtils.parseId(rawId)); + ids.add(TransportVersionId.fromString(rawId)); } catch (NumberFormatException e) { throw new IllegalStateException("Failed to parse id " + rawId + " in " + filename, e); } diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionLatest.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionLatest.java index b113553c9e1f1..072409bdf9698 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionLatest.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionLatest.java @@ -19,6 +19,6 @@ public static TransportVersionLatest fromString(String filename, String contents throw new IllegalStateException("Invalid transport version latest file [" + filename + "]: " + contents); } - return new TransportVersionLatest(branch, parts[0], TransportVersionUtils.parseId(parts[1])); + return new TransportVersionLatest(branch, parts[0], TransportVersionId.fromString(parts[1])); } } From eac3a2342bdb7a2877465fe2cc82e2230ef00769 Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Wed, 13 Aug 2025 19:13:21 +0000 Subject: [PATCH 7/7] [CI] Auto commit changes from spotless --- .../transport/CollectTransportVersionReferencesTask.java | 6 ++---- .../gradle/internal/transport/TransportVersionUtils.java | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/CollectTransportVersionReferencesTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/CollectTransportVersionReferencesTask.java index 34aa7d3dc274a..d572abb848d1c 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/CollectTransportVersionReferencesTask.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/CollectTransportVersionReferencesTask.java @@ -74,8 +74,7 @@ public void checkTransportVersion() throws IOException { Files.writeString(outputFile, String.join("\n", results.stream().map(Object::toString).sorted().toList())); } - private void addNamesFromClassesDirectory(Set results, Path basePath) - throws IOException { + private void addNamesFromClassesDirectory(Set results, Path basePath) throws IOException { Files.walkFileTree(basePath, new SimpleFileVisitor<>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { @@ -90,8 +89,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO }); } - private void addNamesFromClass(Set results, InputStream classBytes, String classname) - throws IOException { + private void addNamesFromClass(Set results, InputStream classBytes, String classname) throws IOException { ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM9) { @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionUtils.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionUtils.java index 1b2a82cec94c3..d8fe1ffed147b 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionUtils.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionUtils.java @@ -19,7 +19,6 @@ class TransportVersionUtils { - static Path definitionFilePath(Directory resourcesDirectory, String name) { return getDefinitionsDirectory(resourcesDirectory).getAsFile().toPath().resolve(name + ".csv"); }