Skip to content

Commit 7b143fe

Browse files
authored
Only add a Maven Wrapper if it doesn't exist yet (#6247)
1 parent 2eae35a commit 7b143fe

2 files changed

Lines changed: 153 additions & 0 deletions

File tree

rewrite-maven/src/main/java/org/openrewrite/maven/UpdateMavenWrapper.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.openrewrite.internal.StringUtils;
2626
import org.openrewrite.marker.BuildTool;
2727
import org.openrewrite.marker.Markers;
28+
import org.openrewrite.maven.search.FindMavenProject;
2829
import org.openrewrite.maven.utilities.MavenWrapper;
2930
import org.openrewrite.properties.PropertiesIsoVisitor;
3031
import org.openrewrite.properties.PropertiesParser;
@@ -153,6 +154,7 @@ private MavenWrapper getMavenWrapper(ExecutionContext ctx) {
153154
}
154155

155156
static class MavenWrapperState {
157+
boolean mavenProject = false;
156158
boolean needsWrapperUpdate = false;
157159

158160
@Nullable BuildTool updatedMarker;
@@ -244,6 +246,10 @@ public boolean isAcceptable(SourceFile sourceFile, ExecutionContext ctx) {
244246
return false;
245247
}
246248

249+
if (new FindMavenProject().getVisitor().visitNonNull(sourceFile, ctx) != sourceFile) {
250+
acc.mavenProject = true;
251+
}
252+
247253
MavenWrapper mavenWrapper = getMavenWrapper(ctx);
248254

249255
if (sourceFile instanceof Quark || sourceFile instanceof Remote) {
@@ -284,6 +290,10 @@ public Collection<SourceFile> generate(MavenWrapperState acc, ExecutionContext c
284290
return emptyList();
285291
}
286292

293+
if (!acc.mavenProject) {
294+
return emptyList();
295+
}
296+
287297
MavenWrapper mavenWrapper = getMavenWrapper(ctx);
288298
if (mavenWrapper.getWrapperDistributionType() == DistributionType.Bin) {
289299
if (!(acc.addMavenWrapperJar || acc.addMavenWrapperProperties || acc.addMavenBatchScript || acc.addMavenShellScript)) {

rewrite-maven/src/test/java/org/openrewrite/maven/UpdateMavenWrapperTest.java

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545

4646
import static org.assertj.core.api.Assertions.assertThat;
4747
import static org.assertj.core.api.Assertions.assertThatThrownBy;
48+
import static org.openrewrite.maven.Assertions.pomXml;
4849
import static org.openrewrite.maven.utilities.MavenWrapper.*;
4950
import static org.openrewrite.properties.Assertions.properties;
5051
import static org.openrewrite.test.SourceSpecs.*;
@@ -92,6 +93,15 @@ void addMavenWrapper() {
9293
assertThat(mavenWrapperJar.getUri()).isEqualTo(URI.create("https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"));
9394
assertThat(isValidWrapperJar(mavenWrapperJar)).as("Wrapper jar is not valid").isTrue();
9495
}),
96+
pomXml(
97+
"""
98+
<project>
99+
<groupId>com.example</groupId>
100+
<artifactId>demo</artifactId>
101+
<version>1.0.0</version>
102+
</project>
103+
"""
104+
),
95105
properties(
96106
doesNotExist(),
97107
withLicenseHeader("""
@@ -126,6 +136,15 @@ void addMavenWrapperWithWrapperJarChecksumEnabled() {
126136
assertThat(mavenWrapperJar.getUri()).isEqualTo(URI.create("https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"));
127137
assertThat(isValidWrapperJar(mavenWrapperJar)).as("Wrapper jar is not valid").isTrue();
128138
}),
139+
pomXml(
140+
"""
141+
<project>
142+
<groupId>com.example</groupId>
143+
<artifactId>demo</artifactId>
144+
<version>1.0.0</version>
145+
</project>
146+
"""
147+
),
129148
properties(
130149
doesNotExist(),
131150
withLicenseHeader("""
@@ -276,6 +295,109 @@ void updateWrapperWithWrapperJarChecksumEnabled() {
276295
);
277296
}
278297

298+
@Test
299+
void doesNotAddWrapperToNonMavenProject() {
300+
rewriteRun(
301+
spec -> spec.recipe(new UpdateMavenWrapper("3.1.x", null, "3.8.x", null, null, null))
302+
.afterRecipe(run ->
303+
assertThat(run.getChangeset().getAllResults()).isEmpty()
304+
),
305+
text(
306+
"""
307+
Some random file content
308+
"""
309+
)
310+
);
311+
}
312+
313+
/**
314+
* When multiple independent Maven projects exist in subdirectories without a root {@code pom.xml},
315+
* the recipe adds wrapper files at the root level. This allows all subprojects to use
316+
* the same wrapper from the repository root.
317+
*/
318+
@Test
319+
void addsWrapperToRootWhenMultipleIndependentMavenProjectsExist() {
320+
rewriteRun(
321+
spec -> spec.recipe(new UpdateMavenWrapper("3.1.x", null, "3.8.x", null, null, null))
322+
.expectedCyclesThatMakeChanges(1)
323+
.afterRecipe(run -> {
324+
assertThat(run.getChangeset().getAllResults()).hasSize(4);
325+
326+
// Verify wrapper files are added at root, not in subdirectories
327+
var mvnw = run.getChangeset().getAllResults().stream()
328+
.map(Result::getAfter)
329+
.filter(Objects::nonNull)
330+
.filter(r -> r.getSourcePath().endsWith("mvnw"))
331+
.findFirst();
332+
assertThat(mvnw).isPresent();
333+
assertThat(mvnw.get().getSourcePath().toString()).isEqualTo("mvnw");
334+
335+
var mavenWrapperJar = run.getChangeset().getAllResults().stream()
336+
.map(Result::getAfter)
337+
.filter(Objects::nonNull)
338+
.filter(r -> r.getSourcePath().endsWith("maven-wrapper.jar"))
339+
.findFirst();
340+
assertThat(mavenWrapperJar).isPresent();
341+
assertThat(mavenWrapperJar.get().getSourcePath().toString()).isEqualTo(".mvn/wrapper/maven-wrapper.jar");
342+
343+
var mvnwCmd = run.getChangeset().getAllResults().stream()
344+
.map(Result::getAfter)
345+
.filter(Objects::nonNull)
346+
.filter(r -> r.getSourcePath().endsWith("mvnw.cmd"))
347+
.findFirst();
348+
assertThat(mvnwCmd).isPresent();
349+
350+
var properties = run.getChangeset().getAllResults().stream()
351+
.map(Result::getAfter)
352+
.filter(Objects::nonNull)
353+
.filter(r -> r.getSourcePath().endsWith("maven-wrapper.properties"))
354+
.findFirst();
355+
assertThat(properties).isPresent();
356+
357+
// Verify subdirectories do NOT contain wrapper files
358+
var filesInProjectA = run.getChangeset().getAllResults().stream()
359+
.map(Result::getAfter)
360+
.filter(Objects::nonNull)
361+
.filter(r -> r.getSourcePath().toString().startsWith("project-a/") &&
362+
(r.getSourcePath().toString().contains("mvnw") ||
363+
r.getSourcePath().toString().contains("maven-wrapper")))
364+
.toList();
365+
assertThat(filesInProjectA).isEmpty();
366+
367+
var filesInProjectB = run.getChangeset().getAllResults().stream()
368+
.map(Result::getAfter)
369+
.filter(Objects::nonNull)
370+
.filter(r -> r.getSourcePath().toString().startsWith("project-b/") &&
371+
(r.getSourcePath().toString().contains("mvnw") ||
372+
r.getSourcePath().toString().contains("maven-wrapper")))
373+
.toList();
374+
assertThat(filesInProjectB).isEmpty();
375+
}),
376+
dir("project-a",
377+
pomXml(
378+
"""
379+
<project>
380+
<groupId>com.example</groupId>
381+
<artifactId>project-a</artifactId>
382+
<version>1.0.0</version>
383+
</project>
384+
"""
385+
)
386+
),
387+
dir("project-b",
388+
pomXml(
389+
"""
390+
<project>
391+
<groupId>com.example</groupId>
392+
<artifactId>project-b</artifactId>
393+
<version>1.0.0</version>
394+
</project>
395+
"""
396+
)
397+
)
398+
);
399+
}
400+
279401
@Test
280402
void updateWrapperInSubDirectory() {
281403
rewriteRun(
@@ -327,6 +449,27 @@ void updateVersionUsingSourceDistribution() {
327449
assertThat(mvnwDownloaderJava.getSourcePath()).isEqualTo(WRAPPER_DOWNLOADER_LOCATION);
328450
assertThat(mvnwDownloaderJava.getUri()).isEqualTo(URI.create("https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper-distribution/3.1.1/maven-wrapper-distribution-3.1.1-source.zip"));
329451
}),
452+
pomXml(
453+
"""
454+
<project>
455+
<groupId>com.example</groupId>
456+
<artifactId>demo</artifactId>
457+
<version>1.0.0</version>
458+
</project>
459+
""",
460+
"""
461+
<project>
462+
<groupId>com.example</groupId>
463+
<artifactId>demo</artifactId>
464+
<version>1.0.0</version>
465+
</project>
466+
""",
467+
spec -> spec.afterRecipe(pom ->
468+
assertThat(pom.getMarkers().findFirst(BuildTool.class)).hasValueSatisfying(buildTool -> {
469+
assertThat(buildTool.getType()).isEqualTo(BuildTool.Type.Maven);
470+
assertThat(buildTool.getVersion()).isEqualTo("3.8.9");
471+
}))
472+
),
330473
properties(
331474
withLicenseHeader("""
332475
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.0/apache-maven-3.8.0-bin.zip

0 commit comments

Comments
 (0)