|
@@ -9,6 +9,7 @@
|
|
|
|
|
|
package org.elasticsearch.gradle.internal.transport;
|
|
|
|
|
|
+import org.elasticsearch.gradle.internal.transport.TransportVersionResourcesService.IdAndDefinition;
|
|
|
import org.gradle.api.DefaultTask;
|
|
|
import org.gradle.api.file.ConfigurableFileCollection;
|
|
|
import org.gradle.api.file.RegularFileProperty;
|
|
@@ -31,6 +32,7 @@ import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
|
|
|
/**
|
|
@@ -95,29 +97,39 @@ public abstract class GenerateTransportVersionDefinitionTask extends DefaultTask
|
|
|
public void run() throws IOException {
|
|
|
TransportVersionResourcesService resources = getResourceService().get();
|
|
|
Set<String> referencedNames = TransportVersionReference.collectNames(getReferencesFiles());
|
|
|
- List<String> changedDefinitionNames = resources.getChangedReferableDefinitionNames();
|
|
|
+ Set<String> changedDefinitionNames = resources.getChangedReferableDefinitionNames();
|
|
|
String targetDefinitionName = getTargetDefinitionName(resources, referencedNames, changedDefinitionNames);
|
|
|
|
|
|
- getLogger().lifecycle("Generating transport version name: " + targetDefinitionName);
|
|
|
+ // First check for any unused definitions. This later generation to not get confused by a definition that can't be used.
|
|
|
+ removeUnusedNamedDefinitions(resources, referencedNames, changedDefinitionNames);
|
|
|
+
|
|
|
+ Map<Integer, List<IdAndDefinition>> idsByBase = resources.getIdsByBase();
|
|
|
if (targetDefinitionName.isEmpty()) {
|
|
|
- // TODO: resetting upper bounds needs to be done locally, otherwise it pulls in some (incomplete) changes from upstream main
|
|
|
- // resetAllUpperBounds(resources);
|
|
|
+ getLogger().lifecycle("No transport version name detected, resetting upper bounds");
|
|
|
+ resetAllUpperBounds(resources, idsByBase);
|
|
|
} else {
|
|
|
+ getLogger().lifecycle("Generating transport version name: " + targetDefinitionName);
|
|
|
List<TransportVersionUpperBound> upstreamUpperBounds = resources.getUpperBoundsFromUpstream();
|
|
|
Set<String> targetUpperBoundNames = getTargetUpperBoundNames(resources, upstreamUpperBounds, targetDefinitionName);
|
|
|
|
|
|
- List<TransportVersionId> ids = updateUpperBounds(resources, upstreamUpperBounds, targetUpperBoundNames, targetDefinitionName);
|
|
|
+ List<TransportVersionId> ids = updateUpperBounds(
|
|
|
+ resources,
|
|
|
+ upstreamUpperBounds,
|
|
|
+ targetUpperBoundNames,
|
|
|
+ idsByBase,
|
|
|
+ targetDefinitionName
|
|
|
+ );
|
|
|
// (Re)write the definition file.
|
|
|
resources.writeDefinition(new TransportVersionDefinition(targetDefinitionName, ids, true));
|
|
|
}
|
|
|
|
|
|
- removeUnusedNamedDefinitions(resources, referencedNames, changedDefinitionNames);
|
|
|
}
|
|
|
|
|
|
private List<TransportVersionId> updateUpperBounds(
|
|
|
TransportVersionResourcesService resources,
|
|
|
List<TransportVersionUpperBound> existingUpperBounds,
|
|
|
Set<String> targetUpperBoundNames,
|
|
|
+ Map<Integer, List<IdAndDefinition>> idsByBase,
|
|
|
String definitionName
|
|
|
) throws IOException {
|
|
|
String currentUpperBoundName = getCurrentUpperBoundName().get();
|
|
@@ -146,9 +158,9 @@ public abstract class GenerateTransportVersionDefinitionTask extends DefaultTask
|
|
|
resources.writeUpperBound(newUpperBound, stageInGit);
|
|
|
}
|
|
|
ids.add(targetId);
|
|
|
- } else {
|
|
|
+ } else if (resources.getChangedUpperBoundNames().contains(upperBoundName)) {
|
|
|
// Default case: we're not targeting this branch so reset it
|
|
|
- resources.writeUpperBound(existingUpperBound, false);
|
|
|
+ resetUpperBound(resources, existingUpperBound, idsByBase, definitionName);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -159,7 +171,7 @@ public abstract class GenerateTransportVersionDefinitionTask extends DefaultTask
|
|
|
private String getTargetDefinitionName(
|
|
|
TransportVersionResourcesService resources,
|
|
|
Set<String> referencedNames,
|
|
|
- List<String> changedDefinitions
|
|
|
+ Set<String> changedDefinitions
|
|
|
) {
|
|
|
if (getDefinitionName().isPresent()) {
|
|
|
// an explicit name was passed in, so use it
|
|
@@ -180,7 +192,7 @@ public abstract class GenerateTransportVersionDefinitionTask extends DefaultTask
|
|
|
if (changedDefinitions.isEmpty()) {
|
|
|
return "";
|
|
|
} else {
|
|
|
- String changedDefinitionName = changedDefinitions.getFirst();
|
|
|
+ String changedDefinitionName = changedDefinitions.iterator().next();
|
|
|
if (referencedNames.contains(changedDefinitionName)) {
|
|
|
return changedDefinitionName;
|
|
|
} else {
|
|
@@ -248,16 +260,38 @@ public abstract class GenerateTransportVersionDefinitionTask extends DefaultTask
|
|
|
return upperBoundNames;
|
|
|
}
|
|
|
|
|
|
- private void resetAllUpperBounds(TransportVersionResourcesService resources) throws IOException {
|
|
|
- for (TransportVersionUpperBound upperBound : resources.getUpperBoundsFromUpstream()) {
|
|
|
- resources.writeUpperBound(upperBound, false);
|
|
|
+ private void resetAllUpperBounds(TransportVersionResourcesService resources, Map<Integer, List<IdAndDefinition>> idsByBase)
|
|
|
+ throws IOException {
|
|
|
+ for (String upperBoundName : resources.getChangedUpperBoundNames()) {
|
|
|
+ TransportVersionUpperBound upstreamUpperBound = resources.getUpperBoundFromUpstream(upperBoundName);
|
|
|
+ resetUpperBound(resources, upstreamUpperBound, idsByBase, null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void resetUpperBound(
|
|
|
+ TransportVersionResourcesService resources,
|
|
|
+ TransportVersionUpperBound upperBound,
|
|
|
+ Map<Integer, List<IdAndDefinition>> idsByBase,
|
|
|
+ String ignoreDefinitionName
|
|
|
+ ) throws IOException {
|
|
|
+ List<IdAndDefinition> idsForUpperBound = idsByBase.get(upperBound.definitionId().base());
|
|
|
+ if (idsForUpperBound == null) {
|
|
|
+ throw new RuntimeException("Could not find base id: " + upperBound.definitionId().base());
|
|
|
+ }
|
|
|
+ IdAndDefinition resetValue = idsForUpperBound.getLast();
|
|
|
+ if (resetValue.definition().name().equals(ignoreDefinitionName)) {
|
|
|
+ // there must be another definition in this base since the ignored definition is new
|
|
|
+ assert idsForUpperBound.size() >= 2;
|
|
|
+ resetValue = idsForUpperBound.get(idsForUpperBound.size() - 2);
|
|
|
}
|
|
|
+ var resetUpperBound = new TransportVersionUpperBound(upperBound.name(), resetValue.definition().name(), resetValue.id());
|
|
|
+ resources.writeUpperBound(resetUpperBound, false);
|
|
|
}
|
|
|
|
|
|
private void removeUnusedNamedDefinitions(
|
|
|
TransportVersionResourcesService resources,
|
|
|
Set<String> referencedNames,
|
|
|
- List<String> changedDefinitions
|
|
|
+ Set<String> changedDefinitions
|
|
|
) throws IOException {
|
|
|
for (String definitionName : changedDefinitions) {
|
|
|
if (referencedNames.contains(definitionName) == false) {
|