diff --git a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionGenerationFuncTest.groovy b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionGenerationFuncTest.groovy index 0f2571d7ede9d..6fedcedf8e80f 100644 --- a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionGenerationFuncTest.groovy +++ b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionGenerationFuncTest.groovy @@ -513,4 +513,19 @@ class TransportVersionGenerationFuncTest extends AbstractTransportVersionFuncTes assertGenerateAndValidateSuccess(result) assertUpperBound("9.2", "existing_92,8123000") } + + def "generation cannot run on release branch"() { + given: + file("myserver/build.gradle") << """ + tasks.named('generateTransportVersion') { + currentUpperBoundName = '9.1' + } + """ + + when: + def result = runGenerateTask().buildAndFail() + + then: + assertGenerateFailure(result, "Transport version generation cannot run on release branches") + } } diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateTransportVersionDefinitionTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateTransportVersionDefinitionTask.java index 2ea758a551611..619b01168c473 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateTransportVersionDefinitionTask.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateTransportVersionDefinitionTask.java @@ -96,6 +96,12 @@ public abstract class GenerateTransportVersionDefinitionTask extends DefaultTask @TaskAction public void run() throws IOException { TransportVersionResourcesService resources = getResourceService().get(); + List upstreamUpperBounds = resources.getUpperBoundsFromGitBase(); + boolean onReleaseBranch = resources.checkIfDefinitelyOnReleaseBranch(upstreamUpperBounds, getCurrentUpperBoundName().get()); + if (onReleaseBranch) { + throw new IllegalArgumentException("Transport version generation cannot run on release branches"); + } + Set referencedNames = TransportVersionReference.collectNames(getReferencesFiles()); Set changedDefinitionNames = resources.getChangedReferableDefinitionNames(); String targetDefinitionName = getTargetDefinitionName(resources, referencedNames, changedDefinitionNames); @@ -109,7 +115,7 @@ public void run() throws IOException { resetAllUpperBounds(resources, idsByBase); } else { getLogger().lifecycle("Generating transport version name: " + targetDefinitionName); - List upstreamUpperBounds = resources.getUpperBoundsFromGitBase(); + Set targetUpperBoundNames = getTargetUpperBoundNames(resources, upstreamUpperBounds, targetDefinitionName); List ids = updateUpperBounds( diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesService.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesService.java index e7e9a2eb566f7..41f929100825c 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesService.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesService.java @@ -25,6 +25,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -259,6 +260,20 @@ private Path getUpperBoundRelativePath(String name) { return UPPER_BOUNDS_DIR.resolve(name + ".csv"); } + boolean checkIfDefinitelyOnReleaseBranch(Collection upperBounds, String currentUpperBoundName) { + // only want to look at definitions <= the current upper bound. + // TODO: we should filter all of the upper bounds/definitions that are validated by this, not just in this method + TransportVersionUpperBound currentUpperBound = upperBounds.stream() + .filter(u -> u.name().equals(currentUpperBoundName)) + .findFirst() + .orElse(null); + if (currentUpperBound == null) { + // since there is no current upper bound, we don't know if we are on a release branch + return false; + } + return upperBounds.stream().anyMatch(u -> u.definitionId().complete() > currentUpperBound.definitionId().complete()); + } + private String getBaseRefName() { if (baseRefName.get() == null) { synchronized (baseRefName) { 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 index 77dff562ca314..0cdfbd5787fd3 100644 --- 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 @@ -84,7 +84,7 @@ public void validateTransportVersions() throws IOException { Map> idsByBase = resources.getIdsByBase(); Map upperBounds = resources.getUpperBounds(); TransportVersionUpperBound currentUpperBound = upperBounds.get(getCurrentUpperBoundName().get()); - boolean onReleaseBranch = checkIfDefinitelyOnReleaseBranch(upperBounds); + boolean onReleaseBranch = resources.checkIfDefinitelyOnReleaseBranch(upperBounds.values(), getCurrentUpperBoundName().get()); boolean validateModifications = onReleaseBranch == false || getCI().get(); for (var definition : referableDefinitions.values()) { @@ -330,15 +330,6 @@ private void validatePrimaryIds( ); } - private boolean checkIfDefinitelyOnReleaseBranch(Map upperBounds) { - // only want to look at definitions <= the current upper bound. - // TODO: we should filter all of the upper bounds/definitions that are validated by this, not just in this method - String currentUpperBoundName = getCurrentUpperBoundName().get(); - TransportVersionUpperBound currentUpperBound = upperBounds.get(currentUpperBoundName); - - return upperBounds.values().stream().anyMatch(u -> u.definitionId().complete() > currentUpperBound.definitionId().complete()); - } - private void throwDefinitionFailure(TransportVersionDefinition definition, String message) { Path relativePath = getResources().get().getDefinitionPath(definition); throw new VerificationException("Transport version definition file [" + relativePath + "] " + message);