Skip to content

Commit 026b73b

Browse files
authored
Add --resolve-conflict flag to transport version generate task (#134421) (#134660)
When merge conflicts arise with transport versions we want to be able to regenerate ids for all the branches currently defined in the newly added transport version definition. This commit adds a --resolve-conflict flag to the generate task which figures out the appropriate branches automatically from the outstanding definition. With this the command line to regenerate on a merge conflict is as simple as: ./gradlew generateTransportVersion --resolve-conflict
1 parent 725a860 commit 026b73b

File tree

4 files changed

+133
-8
lines changed

4 files changed

+133
-8
lines changed

build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionGenerationFuncTest.groovy

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,77 @@ class TransportVersionGenerationFuncTest extends AbstractTransportVersionFuncTes
277277
assertUpperBound("9.2", "second_tv,8124000")
278278
}
279279

280+
def "update flag works with current"() {
281+
given:
282+
referableAndReferencedTransportVersion("new_tv", "8123000")
283+
file("myserver/src/main/resources/transport/latest/9.2.csv").text =
284+
"""
285+
<<<<<<< HEAD
286+
existing_92,8123000
287+
=======
288+
new_tv,8123000
289+
>>>>>> name
290+
""".strip()
291+
292+
when:
293+
def result = runGenerateAndValidateTask("--resolve-conflict").build()
294+
295+
then:
296+
assertGenerateAndValidateSuccess(result)
297+
assertReferableDefinition("existing_92", "8123000,8012001")
298+
assertReferableDefinition("new_tv", "8124000")
299+
assertUpperBound("9.2", "new_tv,8124000")
300+
}
301+
302+
def "update flag works with multiple branches"() {
303+
given:
304+
referableAndReferencedTransportVersion("new_tv", "8123000,8012001,7123001")
305+
file("myserver/src/main/resources/transport/latest/9.2.csv").text =
306+
"""
307+
<<<<<<< HEAD
308+
existing_92,8123000
309+
=======
310+
new_tv,8123000
311+
>>>>>> name
312+
""".strip()
313+
file("myserver/src/main/resources/transport/latest/9.1.csv").text =
314+
"""
315+
<<<<<<< HEAD
316+
existing_92,8012001
317+
=======
318+
new_tv,8012001
319+
>>>>>> name
320+
""".strip()
321+
file("myserver/src/main/resources/transport/latest/8.19.csv").text =
322+
"""
323+
<<<<<<< HEAD
324+
initial_8.19.7,7123001
325+
=======
326+
new_tv,7123001
327+
>>>>>> name
328+
""".strip()
329+
330+
when:
331+
def result = runGenerateAndValidateTask("--resolve-conflict").build()
332+
333+
then:
334+
assertGenerateAndValidateSuccess(result)
335+
assertReferableDefinition("existing_92", "8123000,8012001")
336+
assertUnreferableDefinition("initial_8.19.7", "7123001")
337+
assertReferableDefinition("new_tv", "8124000,8012002,7123002")
338+
assertUpperBound("9.2", "new_tv,8124000")
339+
assertUpperBound("9.1", "new_tv,8012002")
340+
assertUpperBound("8.19", "new_tv,7123002")
341+
}
342+
343+
def "update flag cannot be used with backport branches"() {
344+
when:
345+
def result = runGenerateTask("--resolve-conflict", "--backport-branches=9.1").buildAndFail()
346+
347+
then:
348+
assertGenerateFailure(result, "Cannot use --resolve-conflict with --backport-branches")
349+
}
350+
280351
def "branches param order does not matter"() {
281352
given:
282353
referencedTransportVersion("test_tv")

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@ public void run() throws IOException {
5555
var definition = new TransportVersionDefinition(initialDefinitionName, List.of(id));
5656
resources.writeUnreferableDefinition(definition);
5757
var newUpperBound = new TransportVersionUpperBound(upperBoundName, initialDefinitionName, id);
58-
resources.writeUpperBound(newUpperBound);
58+
resources.writeUpperBound(newUpperBound, false);
5959

6060
if (releaseVersion.getRevision() == 0) {
6161
Version currentVersion = getCurrentVersion().get();
6262
String currentUpperBoundName = getUpperBoundName(currentVersion);
6363
var currentUpperBound = new TransportVersionUpperBound(currentUpperBoundName, initialDefinitionName, id);
64-
resources.writeUpperBound(currentUpperBound);
64+
resources.writeUpperBound(currentUpperBound, false);
6565
}
6666
}
6767

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

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ public abstract class GenerateTransportVersionDefinitionTask extends DefaultTask
7272
@Option(option = "increment", description = "The amount to increment the id from the current upper bounds file by")
7373
public abstract Property<Integer> getIncrement();
7474

75+
@Input
76+
@Optional
77+
@Option(
78+
option = "resolve-conflict",
79+
description = "Regenerate the transport version currently being added to upstream to resolve a merge conflict"
80+
)
81+
public abstract Property<Boolean> getResolveConflict();
82+
7583
/**
7684
* The name of the upper bounds file which will be used at runtime on the current branch. Normally
7785
* this equates to VersionProperties.getElasticsearchVersion().
@@ -95,7 +103,7 @@ public void run() throws IOException {
95103
String targetDefinitionName = getTargetDefinitionName(resources, referencedNames, changedDefinitionNames);
96104

97105
List<TransportVersionUpperBound> upstreamUpperBounds = resources.getUpperBoundsFromUpstream();
98-
Set<String> targetUpperBoundNames = getTargetUpperBoundNames(upstreamUpperBounds);
106+
Set<String> targetUpperBoundNames = getTargetUpperBoundNames(resources, upstreamUpperBounds, targetDefinitionName);
99107

100108
getLogger().lifecycle("Generating transport version name: " + targetDefinitionName);
101109
if (targetDefinitionName.isEmpty()) {
@@ -121,6 +129,7 @@ private List<TransportVersionId> updateUpperBounds(
121129
throw new IllegalArgumentException("Invalid increment " + increment + ", must be a positive integer");
122130
}
123131
List<TransportVersionId> ids = new ArrayList<>();
132+
boolean stageInGit = getResolveConflict().getOrElse(false);
124133

125134
TransportVersionDefinition existingDefinition = resources.getReferableDefinitionFromUpstream(definitionName);
126135
for (TransportVersionUpperBound existingUpperBound : existingUpperBounds) {
@@ -134,12 +143,12 @@ private List<TransportVersionId> updateUpperBounds(
134143
int targetIncrement = upperBoundName.equals(currentUpperBoundName) ? increment : 1;
135144
targetId = createTargetId(existingUpperBound, targetIncrement);
136145
var newUpperBound = new TransportVersionUpperBound(upperBoundName, definitionName, targetId);
137-
resources.writeUpperBound(newUpperBound);
146+
resources.writeUpperBound(newUpperBound, stageInGit);
138147
}
139148
ids.add(targetId);
140149
} else {
141150
// Default case: we're not targeting this branch so reset it
142-
resources.writeUpperBound(existingUpperBound);
151+
resources.writeUpperBound(existingUpperBound, false);
143152
}
144153
}
145154

@@ -180,7 +189,19 @@ private String getTargetDefinitionName(
180189
}
181190
}
182191

183-
private Set<String> getTargetUpperBoundNames(List<TransportVersionUpperBound> upstreamUpperBounds) {
192+
private Set<String> getTargetUpperBoundNames(
193+
TransportVersionResourcesService resources,
194+
List<TransportVersionUpperBound> upstreamUpperBounds,
195+
String targetDefinitionName
196+
) throws IOException {
197+
if (getResolveConflict().getOrElse(false)) {
198+
if (getBackportBranches().isPresent()) {
199+
throw new IllegalArgumentException("Cannot use --resolve-conflict with --backport-branches");
200+
}
201+
202+
return getUpperBoundNamesFromDefinition(resources, upstreamUpperBounds, targetDefinitionName);
203+
}
204+
184205
Set<String> targetUpperBoundNames = new HashSet<>();
185206
targetUpperBoundNames.add(getCurrentUpperBoundName().get());
186207
if (getBackportBranches().isPresent()) {
@@ -204,9 +225,32 @@ private Set<String> getTargetUpperBoundNames(List<TransportVersionUpperBound> up
204225
return targetUpperBoundNames;
205226
}
206227

228+
private Set<String> getUpperBoundNamesFromDefinition(
229+
TransportVersionResourcesService resources,
230+
List<TransportVersionUpperBound> upstreamUpperBounds,
231+
String targetDefinitionName
232+
) throws IOException {
233+
TransportVersionDefinition definition = resources.getReferableDefinition(targetDefinitionName);
234+
Set<String> upperBoundNames = new HashSet<>();
235+
upperBoundNames.add(getCurrentUpperBoundName().get());
236+
237+
// skip the primary id as that is current, which we always add
238+
for (int i = 1; i < definition.ids().size(); ++i) {
239+
TransportVersionId id = definition.ids().get(i);
240+
// we have a small number of upper bound files, so just scan for the ones we want
241+
for (TransportVersionUpperBound upperBound : upstreamUpperBounds) {
242+
if (upperBound.definitionId().base() == id.base()) {
243+
upperBoundNames.add(upperBound.name());
244+
}
245+
}
246+
}
247+
248+
return upperBoundNames;
249+
}
250+
207251
private void resetAllUpperBounds(TransportVersionResourcesService resources) throws IOException {
208252
for (TransportVersionUpperBound upperBound : resources.getUpperBoundsFromUpstream()) {
209-
resources.writeUpperBound(upperBound);
253+
resources.writeUpperBound(upperBound, false);
210254
}
211255
}
212256

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ Map<String, TransportVersionDefinition> getReferableDefinitions() throws IOExcep
107107
return readDefinitions(transportResourcesDir.resolve(REFERABLE_DIR));
108108
}
109109

110+
/** Return a single referable definition by name */
111+
TransportVersionDefinition getReferableDefinition(String name) throws IOException {
112+
Path resourcePath = transportResourcesDir.resolve(getReferableDefinitionRelativePath(name));
113+
return TransportVersionDefinition.fromString(resourcePath, Files.readString(resourcePath, StandardCharsets.UTF_8));
114+
}
115+
110116
/** Get a referable definition from upstream if it exists there, or null otherwise */
111117
TransportVersionDefinition getReferableDefinitionFromUpstream(String name) {
112118
Path resourcePath = getReferableDefinitionRelativePath(name);
@@ -218,10 +224,14 @@ List<TransportVersionUpperBound> getUpperBoundsFromUpstream() throws IOException
218224
}
219225

220226
/** Write the given upper bound to a file in the transport resources */
221-
void writeUpperBound(TransportVersionUpperBound upperBound) throws IOException {
227+
void writeUpperBound(TransportVersionUpperBound upperBound, boolean stageInGit) throws IOException {
222228
Path path = transportResourcesDir.resolve(getUpperBoundRelativePath(upperBound.name()));
223229
logger.debug("Writing upper bound [" + upperBound + "] to [" + path + "]");
224230
Files.writeString(path, upperBound.definitionName() + "," + upperBound.definitionId().complete() + "\n", StandardCharsets.UTF_8);
231+
232+
if (stageInGit) {
233+
gitCommand("add", path.toString());
234+
}
225235
}
226236

227237
/** Return the path within the repository of the given latest */

0 commit comments

Comments
 (0)