Skip to content

Commit 7130d8b

Browse files
committed
wip
1 parent 949f836 commit 7130d8b

File tree

4 files changed

+104
-73
lines changed

4 files changed

+104
-73
lines changed

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateTransportVersionDataTask.java

Lines changed: 35 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,26 @@
1010
package org.elasticsearch.gradle.internal.transport;
1111

1212
import com.google.common.collect.Streams;
13-
1413
import org.elasticsearch.gradle.VersionProperties;
1514
import org.gradle.api.DefaultTask;
1615
import org.gradle.api.file.RegularFileProperty;
16+
import org.gradle.api.provider.ListProperty;
1717
import org.gradle.api.provider.Property;
1818
import org.gradle.api.tasks.Input;
1919
import org.gradle.api.tasks.InputDirectory;
20+
import org.gradle.api.tasks.Optional;
2021
import org.gradle.api.tasks.TaskAction;
2122

2223
import java.io.IOException;
2324
import java.nio.file.Path;
2425
import java.util.List;
2526
import java.util.Objects;
27+
import java.util.function.Function;
2628
import java.util.stream.Stream;
2729

30+
import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.IdIncrement;
31+
import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.getDefinedFile;
32+
import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.getLatestFile;
2833
import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.updateLatestFile;
2934
import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.writeDefinitionFile;
3035

@@ -50,96 +55,60 @@ public abstract class GenerateTransportVersionDataTask extends DefaultTask {
5055
*
5156
* @return
5257
*/
58+
@Optional
5359
@InputDirectory
5460
public abstract RegularFileProperty getDataFileDirectory();
5561

5662
/**
5763
* Used to set the name of the TransportVersionSet for which a data file will be generated.
5864
*/
65+
@Optional
5966
@Input
6067
public abstract Property<String> getTVName();
6168

6269
/**
6370
* Used to set the `major.minor` release version for which the specific TransportVersion ID will be generated.
6471
* E.g.: "9.2", "8.18", etc.
6572
*/
73+
@Optional
74+
@Input
75+
public abstract ListProperty<String> getMinorVersionsForTV();
76+
77+
@Optional
6678
@Input
67-
public abstract Property<String> getMinorVersionForTV();
79+
public abstract Property<Function<String, IdIncrement>> getIdIncrementSupplier();
80+
6881

6982
@TaskAction
7083
public void generateTransportVersionData() throws IOException {
7184
final Path tvDataDir = Objects.requireNonNull(getDataFileDirectory().getAsFile().get()).toPath();
7285
final var tvName = Objects.requireNonNull(getTVName().get());
73-
final var forMinorVersion = Objects.requireNonNull(getMinorVersionForTV().get());
86+
final var forMinorVersions = Objects.requireNonNull(getMinorVersionsForTV().get());
7487

75-
// Get the latest transport version data for the specified minor version.
76-
final var latestTV = TransportVersionUtils.getLatestFile(tvDataDir, forMinorVersion);
88+
// TODO
89+
// - do we need to validate that the minorVersions don't contain duplicates?
90+
// - is there an order we need to apply? ( I don't think so)
7791

78-
// Create the new version
79-
final var mainReleaseVersion = VersionProperties.getElasticsearchVersion();
80-
final var areWeOnMain = forMinorVersion.equals(mainReleaseVersion);
81-
int newVersion = bumpVersionNumber(latestTV.ids().getFirst(), areWeOnMain ? PartToBump.SERVER : PartToBump.PATCH);
92+
for (var forMinorVersion : forMinorVersions) {
93+
// Get the latest transport version data for the specified minor version.
94+
final var latestTV = getLatestFile(tvDataDir, forMinorVersion);
8295

83-
// Load the tvSetData for the specified name, if it exists
84-
final var tvSetDataFromFile = TransportVersionUtils.getDefinedFile(tvDataDir, tvName);
85-
final var tvSetFileExists = tvSetDataFromFile != null;
96+
// Create the new version
8697

87-
// Write the definition file.
88-
final var ids = tvSetFileExists
89-
? Streams.concat(tvSetDataFromFile.ids().stream(), Stream.of(newVersion)).sorted().toList().reversed()
90-
: List.of(newVersion);
91-
writeDefinitionFile(tvDataDir, tvName, ids);
98+
// TODO
9299

93-
// Update the LATEST file.
94-
updateLatestFile(tvDataDir, forMinorVersion, tvName, newVersion);
95-
}
100+
// Load the tvSetData for the specified name, if it exists
101+
final var tvSetDataFromFile = getDefinedFile(tvDataDir, tvName);
102+
final var tvSetFileExists = tvSetDataFromFile != null;
96103

97-
public enum PartToBump {
98-
SERVER,
99-
SUBSIDIARY,
100-
PATCH
101-
}
104+
// Write the definition file.
105+
final var ids = tvSetFileExists
106+
? Streams.concat(tvSetDataFromFile.ids().stream(), Stream.of(newVersion)).sorted().toList().reversed()
107+
: List.of(newVersion);
108+
writeDefinitionFile(tvDataDir, tvName, ids);
102109

103-
// TODO Do I need to remove the patch when updating the server portion? NO, but probably need some additional checks
104-
private static int bumpVersionNumber(int tvIDToBump, PartToBump partToBump) {
105-
106-
/* The TV format:
107-
*
108-
* MM_NNN_S_PP
109-
*
110-
* M - The major version of Elasticsearch
111-
* NNN - The server version part
112-
* S - The subsidiary version part. It should always be 0 here, it is only used in subsidiary repositories.
113-
* PP - The patch version part
114-
*/
115-
return switch (partToBump) {
116-
case SERVER -> {
117-
var newId = tvIDToBump + 1000;
118-
if ((newId / 1000) % 100 == 0) {
119-
throw new IllegalStateException(
120-
"Insufficient server version section in TransportVersion: " + tvIDToBump + ", Cannot bump."
121-
);
122-
}
123-
yield tvIDToBump + 1000;
124-
}
125-
case SUBSIDIARY -> {
126-
var newId = tvIDToBump + 100;
127-
if ((newId / 100) == 0) {
128-
throw new IllegalStateException(
129-
"Insufficient subsidiary version section in TransportVersion: " + tvIDToBump + ", Cannot bump."
130-
);
131-
}
132-
yield newId;
133-
}
134-
case PATCH -> {
135-
var newId = tvIDToBump + 1;
136-
if (newId % 10 == 0) {
137-
throw new IllegalStateException(
138-
"Insufficient patch version section in TransportVersion: " + tvIDToBump + ", Cannot bump."
139-
);
140-
}
141-
yield newId;
142-
}
143-
};
110+
// Update the LATEST file.
111+
updateLatestFile(tvDataDir, forMinorVersion, tvName, newVersion);
112+
}
144113
}
145114
}

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GlobalTransportVersionManagementPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public void apply(Project project) {
4747
.register("validateTransportVersionConstants", ValidateTransportVersionDefinitionsTask.class, t -> {
4848
t.setGroup("Transport Versions");
4949
t.setDescription("Validates that all defined TransportVersion constants are used in at least one project");
50-
t.getDefinitionsDirectory().set(TransportVersionUtils.getDefinitionsDirectory(project));
50+
t.getTVDataDirectory().set(TransportVersionUtils.getDefinitionsDirectory(project));
5151
t.getReferencesFiles().setFrom(tvReferencesConfig);
5252
});
5353

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionUtils.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
package org.elasticsearch.gradle.internal.transport;
1111

1212
import com.google.common.collect.Comparators;
13-
1413
import org.gradle.api.GradleException;
1514
import org.gradle.api.Project;
1615
import org.gradle.api.attributes.Attribute;
@@ -32,8 +31,8 @@
3231
class TransportVersionUtils {
3332
static final Attribute<Boolean> TRANSPORT_VERSION_REFERENCES_ATTRIBUTE = Attribute.of("transport-version-references", Boolean.class);
3433

35-
private static final String LATEST_DIR = "latest";
36-
private static final String DEFINED_DIR = "defined";
34+
static final String LATEST_DIR = "latest";
35+
static final String DEFINED_DIR = "defined";
3736

3837
record TransportVersionDefinition(String name, List<Integer> ids) {}
3938

@@ -123,4 +122,40 @@ static void addTransportVersionReferencesAttribute(AttributeContainer attributes
123122
attributes.attribute(ARTIFACT_TYPE_ATTRIBUTE, "txt");
124123
attributes.attribute(TransportVersionUtils.TRANSPORT_VERSION_REFERENCES_ATTRIBUTE, true);
125124
}
125+
126+
/**
127+
* Specifies which part of the TransportVersion id to bump. The TV format:
128+
* <p>
129+
* MM_NNN_S_PP
130+
* <p>
131+
* M - The major version of Elasticsearch
132+
* NNN - The server version part
133+
* S - The subsidiary version part. It should always be 0 here, it is only used in subsidiary repositories.
134+
* PP - The patch version part
135+
*/
136+
public enum IdIncrement {
137+
MAJOR(1_000_0_00, 2),
138+
SERVER(1_0_00, 3),
139+
SUBSIDIARY(1_00, 1),
140+
PATCH(1, 2);
141+
142+
private final int value;
143+
private final int max;
144+
145+
IdIncrement(int value, int numDigits) {
146+
this.value = value;
147+
this.max = (int) Math.pow(10, numDigits);
148+
}
149+
150+
public int bumpVersionNumber(int tvIDToBump) {
151+
int zeroesCleared = (tvIDToBump / value) * value;
152+
int newId = zeroesCleared + value;
153+
if ((newId / value) % max == 0) {
154+
throw new IllegalStateException(
155+
"Insufficient" + name() + " version section in TransportVersion: " + tvIDToBump + ", Cannot bump."
156+
);
157+
}
158+
return newId;
159+
}
160+
}
126161
}

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/ValidateTransportVersionDefinitionsTask.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
package org.elasticsearch.gradle.internal.transport;
1111

12+
import com.google.common.collect.Comparators;
1213
import org.elasticsearch.gradle.internal.transport.TransportVersionUtils.TransportVersionReference;
1314
import org.gradle.api.DefaultTask;
1415
import org.gradle.api.file.ConfigurableFileCollection;
@@ -20,9 +21,11 @@
2021
import java.io.IOException;
2122
import java.nio.file.Files;
2223
import java.nio.file.Path;
24+
import java.util.Comparator;
2325
import java.util.HashSet;
2426
import java.util.Set;
2527

28+
import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.DEFINED_DIR;
2629
import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.readDefinitionFile;
2730
import static org.elasticsearch.gradle.internal.transport.TransportVersionUtils.readReferencesFile;
2831

@@ -32,27 +35,51 @@
3235
public abstract class ValidateTransportVersionDefinitionsTask extends DefaultTask {
3336

3437
@InputDirectory
35-
public abstract DirectoryProperty getDefinitionsDirectory();
38+
public abstract DirectoryProperty getTVDataDirectory();
3639

3740
@InputFiles
3841
public abstract ConfigurableFileCollection getReferencesFiles();
3942

4043
@TaskAction
4144
public void validateTransportVersions() throws IOException {
42-
Path definitionsDir = getDefinitionsDirectory().getAsFile().get().toPath();
45+
Path dataDir = getTVDataDirectory().getAsFile().get().toPath();
46+
Path definitionsDir = dataDir.resolve(DEFINED_DIR);
4347

4448
Set<String> allTvNames = new HashSet<>();
4549
for (var tvReferencesFile : getReferencesFiles()) {
4650
readReferencesFile(tvReferencesFile.toPath()).stream().map(TransportVersionReference::name).forEach(allTvNames::add);
4751
}
4852

53+
// TODO validate that all files:
54+
// - have only have a single ID per release version
55+
// - have TVs in order
56+
// - have the correct name
57+
// - have the correct data format
58+
// - Don't have duplicate IDs across any files
59+
// - no duplicate names? Should be impossible due to filename conflicts
60+
61+
4962
try (var definitionsStream = Files.list(definitionsDir)) {
5063
for (var definitionFile : definitionsStream.toList()) {
64+
// Validate that all definitions are referenced in the code.
5165
var tv = readDefinitionFile(definitionFile, false);
5266
if (allTvNames.contains(tv.name()) == false) {
53-
throw new IllegalStateException("Transport version constant " + tv.name() + " is not referenced");
67+
throw new IllegalStateException("Transport version definition " + tv.name()
68+
+ " in file " + definitionFile + "is not referenced in the code.");
5469
}
70+
71+
// Validate that all Ids are in decending order:
72+
if (Comparators.isInOrder(tv.ids(), Comparator.reverseOrder()) == false) {
73+
throw new IllegalStateException("Transport version definition file " + definitionFile
74+
+ " does not have ordered ids");
75+
}
76+
77+
78+
79+
5580
}
5681
}
5782
}
83+
84+
5885
}

0 commit comments

Comments
 (0)