diff --git a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/ProjectInfoCommandHandler.java b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/ProjectInfoCommandHandler.java index ed9e14a7e5b4f7..2578dc74dc1bce 100644 --- a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/ProjectInfoCommandHandler.java +++ b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/ProjectInfoCommandHandler.java @@ -105,9 +105,9 @@ protected static boolean logState(ProjectState projectState, boolean perModule, } else { if (rectify) { sb.append(String.format(UpdateProjectCommandHandler.PLATFORM_RECTIFY_FORMAT, "", - platform.imported.toCompactCoords())); + platform.imported.toCompactCoords())).append(" ✔"); } else { - sb.append(" ").append(platform.imported.toCompactCoords()); + sb.append(" ").append(platform.imported.toCompactCoords()).append(" | up-to-date"); } } log.info(sb.toString()); @@ -193,6 +193,12 @@ private static boolean logExtensionInfo(TopExtensionDependency dep, boolean rect sb.append(" -> remove version (managed)"); } recommendationsAvailable = true; + } else { + if (rectify) { + sb.append(" ✔"); + } else { + sb.append(" | up-to-date"); + } } } else { sb.append(" ").append(dep.getArtifact().getGroupId()).append(':') diff --git a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/UpdateProjectCommandHandler.java b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/UpdateProjectCommandHandler.java index cb62a099a5af70..dbbf1382b72b9b 100644 --- a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/UpdateProjectCommandHandler.java +++ b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/commands/handlers/UpdateProjectCommandHandler.java @@ -1,5 +1,7 @@ package io.quarkus.devtools.commands.handlers; +import static io.quarkus.devtools.project.update.QuarkusUpdateRecipe.RECIPE_IO_QUARKUS_OPENREWRITE_QUARKUS; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -66,18 +68,25 @@ public QuarkusCommandOutcome execute(QuarkusCommandInvocation invocation) throws invocation.log().info("Instructions to update this project from '%s' to '%s':", projectQuarkusPlatformBom.getVersion(), targetPlatformVersion); logUpdates(currentState, latestCatalog, false, perModule, invocation.getQuarkusProject().log()); - } - if (generateRewriteConfig) { - QuarkusUpdates.ProjectUpdateRequest request = new QuarkusUpdates.ProjectUpdateRequest( - projectQuarkusPlatformBom.getVersion(), targetPlatformVersion); - try { - final Path tempFile = Files.createTempFile("quarkus-project-recipe-", ".yaml"); - QuarkusUpdates.createRecipe(tempFile, - QuarkusProjectHelper.artifactResolver(), request); - invocation.log().info("Project update recipe has been created: %s", tempFile.toString()); - } catch (IOException e) { - throw new QuarkusCommandException("Failed to create project update recipe", e); + if (generateRewriteConfig) { + QuarkusUpdates.ProjectUpdateRequest request = new QuarkusUpdates.ProjectUpdateRequest( + projectQuarkusPlatformBom.getVersion(), targetPlatformVersion); + try { + final Path tempFile = Files.createTempFile("quarkus-project-recipe-", ".yaml"); + QuarkusUpdates.createRecipe(tempFile, + QuarkusProjectHelper.artifactResolver(), request); + invocation.log().info("Project update recipe has been created:\n%s", tempFile.toString()); + + invocation.log().info("The command to update this project: \n" + + "mvn org.openrewrite.maven:rewrite-maven-plugin:4.39.0:run quarkus-update \\\n" + + " -Drewrite.configLocation=%s \\\n" + + " -DactiveRecipes=%s -e", + tempFile.toString(), RECIPE_IO_QUARKUS_OPENREWRITE_QUARKUS); + + } catch (IOException e) { + throw new QuarkusCommandException("Failed to create project update recipe", e); + } } } diff --git a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdateRecipe.java b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdateRecipe.java index 321cef54a3ffca..6df006981e3673 100644 --- a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdateRecipe.java +++ b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdateRecipe.java @@ -10,9 +10,10 @@ public class QuarkusUpdateRecipe { + public static final String RECIPE_IO_QUARKUS_OPENREWRITE_QUARKUS = "io.quarkus.openrewrite.Quarkus"; public static final Map QUARKUS_RECIPE = Map.of( "type", "specs.openrewrite.org/v1beta/recipe", - "name", "io.quarkus.openrewrite.Quarkus", + "name", RECIPE_IO_QUARKUS_OPENREWRITE_QUARKUS, "displayName", "Migrate quarkus project to a new version", "description", "Update Quarkus version and refactor imports and resources if needed.", "tags", List.of("quarkus")); diff --git a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdatesRepository.java b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdatesRepository.java index 0db05e1be9351d..f28731835596e9 100644 --- a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdatesRepository.java +++ b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdatesRepository.java @@ -27,11 +27,12 @@ public static List fetchLatestRecipes(MavenArtifactResolver artifactReso try { final ResourceLoader resourceLoader = ResourceLoaders.resolveFileResourceLoader( artifactResolver.resolve(DependencyUtils.toArtifact(QUARKUS_RECIPE_GAV)).getArtifact().getFile()); + return resourceLoader.loadResourceAsPath("quarkus-updates/core", path -> { try (final Stream pathStream = Files.walk(path)) { return pathStream - .filter(p -> p.getFileName().toString().matches("^\\d\\.\\d(\\.\\d)?\\.ya?ml$")) + .filter(p -> p.getFileName().toString().matches("^\\d\\.\\H+.ya?ml$")) .filter(p -> shouldApplyRecipe(p.getFileName().toString(), currentVersion, targetVersion)) .map(p -> { try { diff --git a/independent-projects/tools/devtools-common/src/test/java/io/quarkus/devtools/project/update/QuarkusUpdatesRepositoryTest.java b/independent-projects/tools/devtools-common/src/test/java/io/quarkus/devtools/project/update/QuarkusUpdatesRepositoryTest.java new file mode 100644 index 00000000000000..5e4dd6d4935d60 --- /dev/null +++ b/independent-projects/tools/devtools-common/src/test/java/io/quarkus/devtools/project/update/QuarkusUpdatesRepositoryTest.java @@ -0,0 +1,19 @@ +package io.quarkus.devtools.project.update; + +import static io.quarkus.devtools.project.update.QuarkusUpdatesRepository.shouldApplyRecipe; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvFileSource; + +class QuarkusUpdatesRepositoryTest { + + @ParameterizedTest + @CsvFileSource(resources = "/should_apply_recipe_test_cases.csv", numLinesToSkip = 1) + void testShouldApplyRecipeWithCSV(String recipeVersion, String currentVersion, String targetVersion, + boolean expectedResult) { + boolean result = shouldApplyRecipe(recipeVersion, currentVersion, targetVersion); + assertEquals(expectedResult, result); + } + +} diff --git a/independent-projects/tools/devtools-common/src/test/resources/should_apply_recipe_test_cases.csv b/independent-projects/tools/devtools-common/src/test/resources/should_apply_recipe_test_cases.csv index 8b1cfc47e3635e..702af67245b4ab 100644 --- a/independent-projects/tools/devtools-common/src/test/resources/should_apply_recipe_test_cases.csv +++ b/independent-projects/tools/devtools-common/src/test/resources/should_apply_recipe_test_cases.csv @@ -1,4 +1,5 @@ recipeFileName,currentVersion,targetVersion,expectedResult +3alpha.yaml,2.0.0.Final,3.0.0.Alpha4,true 3.0.yaml,2.0.0.Final,3.0.0.Final,true 2.9.yaml,2.0.0.Final,3.0.0.Final,true 2.7.yaml,2.0.0.Final,3.0.0.Final,true