diff --git a/src/main/java/org/openrewrite/java/migrate/UpdateSdkMan.java b/src/main/java/org/openrewrite/java/migrate/UpdateSdkMan.java index 10d639c270..f33983050b 100644 --- a/src/main/java/org/openrewrite/java/migrate/UpdateSdkMan.java +++ b/src/main/java/org/openrewrite/java/migrate/UpdateSdkMan.java @@ -43,7 +43,7 @@ public class UpdateSdkMan extends Recipe { @Option(displayName = "Java version", - description = "The Java version to update to.", + description = "The Java version to update to. Use `latest.patch` to upgrade to the latest version within the current major version.", required = false, example = "17") @Nullable @@ -85,7 +85,14 @@ public Tree visit(@Nullable Tree tree, ExecutionContext ctx) { Pattern pattern = Pattern.compile("java=(.*?)([.a-z]*-.*)"); Matcher matcher = pattern.matcher(plainText.getText()); if (matcher.find()) { - String ver = newVersion == null ? matcher.group(1) : newVersion; + String ver; + if ("latest.patch".equalsIgnoreCase(newVersion)) { + ver = matcher.group(1).split("\\.")[0]; + } else if (newVersion == null) { + ver = matcher.group(1); + } else { + ver = newVersion; + } String dist = newDistribution == null ? matcher.group(2) : "-" + newDistribution; String newBasis = ver + dist; Pattern majorPattern = Pattern.compile("^" + ver + "[.-].*"); diff --git a/src/test/java/org/openrewrite/java/migrate/UpdateSdkManTest.java b/src/test/java/org/openrewrite/java/migrate/UpdateSdkManTest.java index 99ecf648f5..ec14f1aa15 100644 --- a/src/test/java/org/openrewrite/java/migrate/UpdateSdkManTest.java +++ b/src/test/java/org/openrewrite/java/migrate/UpdateSdkManTest.java @@ -199,6 +199,58 @@ void upgradeIfNewVersionIsStillSameVersionBasisAndDifferentDistribution() { ); } + @Test + void minorUpgradesWithinSameMajorVersion() { + rewriteRun( + spec -> spec.recipe(new UpdateSdkMan("latest.patch", null)), + text( + """ + java=21.0.6-zulu + """, + spec -> spec.path(".sdkmanrc") + .after(str -> assertThat(str) + .startsWith("java=21.0.") + .doesNotContain("21.0.6") + .endsWith("-zulu") + .actual()) + ) + ); + } + + @Test + void minorUpgradeWithNewDistribution() { + rewriteRun( + spec -> spec.recipe(new UpdateSdkMan("latest.patch", "amzn")), + text( + """ + java=21.0.6-zulu + """, + spec -> spec.path(".sdkmanrc") + .after(str -> assertThat(str) + .startsWith("java=21.0.") + .endsWith("-amzn") + .actual()) + ) + ); + } + + @Test + void minorDoesNotCrossMajorVersion() { + rewriteRun( + spec -> spec.recipe(new UpdateSdkMan("latest.patch", null)), + text( + """ + java=11.0.25-tem + """, + spec -> spec.path(".sdkmanrc") + .after(str -> assertThat(str) + .startsWith("java=11.0.") + .endsWith("-tem") + .actual()) + ) + ); + } + @Test void doNotDowngradeVersionIfAlreadyHighEnoughSameDistribution() { rewriteRun(