From ae5e4fb4355f1185097f887787f2de13cb2fd463 Mon Sep 17 00:00:00 2001 From: Andy Damevin Date: Tue, 11 Apr 2023 11:30:33 +0200 Subject: [PATCH 1/2] Fix Quarkus Update fetch latest --- devtools/cli/src/main/java/io/quarkus/cli/Update.java | 2 +- .../main/java/io/quarkus/cli/build/GradleRunner.java | 2 +- .../java/io/quarkus/gradle/tasks/QuarkusUpdate.java | 11 ++++++++--- .../src/main/java/io/quarkus/maven/UpdateMojo.java | 5 +++-- .../handlers/UpdateProjectCommandHandler.java | 2 ++ 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/devtools/cli/src/main/java/io/quarkus/cli/Update.java b/devtools/cli/src/main/java/io/quarkus/cli/Update.java index c017b3ba91b26..7cd4237227f68 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/Update.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/Update.java @@ -15,7 +15,7 @@ public class Update extends BaseBuildCommand implements Callable { @CommandLine.ArgGroup(order = 0, heading = "%nTarget Quarkus version:%n", multiplicity = "0..1") TargetQuarkusVersionGroup targetQuarkusVersion = new TargetQuarkusVersionGroup(); - @CommandLine.ArgGroup(order = 1, heading = "%nRewrite:%n") + @CommandLine.ArgGroup(order = 1, heading = "%nRewrite:%n", exclusive = false) RewriteGroup rewrite = new RewriteGroup(); @CommandLine.Option(order = 2, names = { "--per-module" }, description = "Display information per project module.") diff --git a/devtools/cli/src/main/java/io/quarkus/cli/build/GradleRunner.java b/devtools/cli/src/main/java/io/quarkus/cli/build/GradleRunner.java index f0737db487ae0..9611986e102a0 100644 --- a/devtools/cli/src/main/java/io/quarkus/cli/build/GradleRunner.java +++ b/devtools/cli/src/main/java/io/quarkus/cli/build/GradleRunner.java @@ -163,7 +163,7 @@ public Integer updateProject(TargetQuarkusVersionGroup targetQuarkusVersion, Rew args.add(targetQuarkusVersion.platformVersion); } if (!StringUtil.isNullOrEmpty(targetQuarkusVersion.streamId)) { - args.add("--streamId"); + args.add("--stream"); args.add(targetQuarkusVersion.streamId); } if (rewrite.pluginVersion != null) { diff --git a/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusUpdate.java b/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusUpdate.java index 724ef30430997..d5ef9326ac495 100644 --- a/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusUpdate.java +++ b/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusUpdate.java @@ -29,7 +29,7 @@ public abstract class QuarkusUpdate extends QuarkusPlatformTask { private String rewritePluginVersion = QuarkusUpdateCommand.DEFAULT_GRADLE_REWRITE_PLUGIN_VERSION; - private String rewriteUpdateRecipesVersion; + private String rewriteUpdateRecipesVersion = null; @Input @Optional @@ -93,7 +93,7 @@ public String getTargetStreamId() { return targetStreamId; } - @Option(description = "A target stream id, for example: 2.0", option = "streamId") + @Option(description = "A target stream, for example: 2.0", option = "stream") public void setStreamId(String targetStreamId) { this.targetStreamId = targetStreamId; } @@ -141,7 +141,12 @@ public void logUpdates() { final UpdateProject invoker = new UpdateProject(quarkusProject); invoker.latestCatalog(targetCatalog); - invoker.rewritePluginVersion(rewritePluginVersion); + if (rewriteUpdateRecipesVersion != null) { + invoker.rewriteUpdateRecipesVersion(rewriteUpdateRecipesVersion); + } + if (rewritePluginVersion != null) { + invoker.rewritePluginVersion(rewritePluginVersion); + } invoker.targetPlatformVersion(targetPlatformVersion); invoker.rewriteDryRun(rewriteDryRun); invoker.noRewrite(noRewrite); diff --git a/devtools/maven/src/main/java/io/quarkus/maven/UpdateMojo.java b/devtools/maven/src/main/java/io/quarkus/maven/UpdateMojo.java index 902e0027559c3..98ddc7105a369 100644 --- a/devtools/maven/src/main/java/io/quarkus/maven/UpdateMojo.java +++ b/devtools/maven/src/main/java/io/quarkus/maven/UpdateMojo.java @@ -15,6 +15,7 @@ import io.quarkus.devtools.commands.data.QuarkusCommandException; import io.quarkus.devtools.commands.data.QuarkusCommandOutcome; import io.quarkus.devtools.project.QuarkusProject; +import io.quarkus.devtools.project.QuarkusProjectHelper; import io.quarkus.devtools.project.update.QuarkusUpdateCommand; import io.quarkus.maven.dependency.ArtifactCoords; import io.quarkus.registry.RegistryResolutionException; @@ -91,7 +92,7 @@ protected void validateParameters() throws MojoExecutionException { @Override protected void processProjectState(QuarkusProject quarkusProject) throws MojoExecutionException { - + QuarkusProjectHelper.setArtifactResolver(artifactResolver()); final ExtensionCatalog targetCatalog; try { if (platformVersion != null) { @@ -120,7 +121,7 @@ protected void processProjectState(QuarkusProject quarkusProject) throws MojoExe invoker.rewritePluginVersion(rewritePluginVersion); } if (rewriteUpdateRecipesVersion != null) { - invoker.rewritePluginVersion(rewriteUpdateRecipesVersion); + invoker.rewriteUpdateRecipesVersion(rewriteUpdateRecipesVersion); } invoker.rewriteDryRun(rewriteDryRun); invoker.noRewrite(noRewrite); 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 95a3ee6914ecc..e66706a7ea608 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 @@ -83,6 +83,8 @@ public QuarkusCommandOutcome execute(QuarkusCommandInvocation invocation) throws QuarkusProjectHelper.artifactResolver(), updateRecipesVersion, request); final String rewritePluginVersion = invocation.getValue(UpdateProject.REWRITE_PLUGIN_VERSION); final boolean rewriteDryRun = invocation.getValue(UpdateProject.REWRITE_DRY_RUN, false); + invocation.log().warn( + "The update feature does not yet handle updates of the extension versions. If needed, update your extensions manually."); QuarkusUpdateCommand.handle( invocation.log(), quarkusProject.getExtensionManager().getBuildTool(), From b4bd1a1833e50ccf6acd0a228dd3f5d120cebd63 Mon Sep 17 00:00:00 2001 From: Andy Damevin Date: Tue, 11 Apr 2023 14:27:54 +0200 Subject: [PATCH 2/2] Use plugin versions from the quarkus-updates-recipes repo props --- .../quarkus/gradle/tasks/QuarkusUpdate.java | 4 +- .../java/io/quarkus/maven/UpdateMojo.java | 3 +- .../handlers/UpdateProjectCommandHandler.java | 14 ++-- .../project/update/QuarkusUpdateCommand.java | 3 - .../project/update/QuarkusUpdates.java | 11 ++- .../update/QuarkusUpdatesRepository.java | 74 ++++++++++++++++++- 6 files changed, 89 insertions(+), 20 deletions(-) diff --git a/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusUpdate.java b/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusUpdate.java index d5ef9326ac495..20013bd73b3fe 100644 --- a/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusUpdate.java +++ b/devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/tasks/QuarkusUpdate.java @@ -10,7 +10,6 @@ import io.quarkus.devtools.commands.UpdateProject; import io.quarkus.devtools.project.QuarkusProject; -import io.quarkus.devtools.project.update.QuarkusUpdateCommand; import io.quarkus.maven.dependency.ArtifactCoords; import io.quarkus.registry.RegistryResolutionException; import io.quarkus.registry.catalog.ExtensionCatalog; @@ -27,7 +26,7 @@ public abstract class QuarkusUpdate extends QuarkusPlatformTask { private String targetStreamId; private String targetPlatformVersion; - private String rewritePluginVersion = QuarkusUpdateCommand.DEFAULT_GRADLE_REWRITE_PLUGIN_VERSION; + private String rewritePluginVersion = null; private String rewriteUpdateRecipesVersion = null; @@ -66,6 +65,7 @@ public void setPerModule(boolean perModule) { } @Input + @Optional public String getRewritePluginVersion() { return rewritePluginVersion; } diff --git a/devtools/maven/src/main/java/io/quarkus/maven/UpdateMojo.java b/devtools/maven/src/main/java/io/quarkus/maven/UpdateMojo.java index 98ddc7105a369..f2dcb342faf0b 100644 --- a/devtools/maven/src/main/java/io/quarkus/maven/UpdateMojo.java +++ b/devtools/maven/src/main/java/io/quarkus/maven/UpdateMojo.java @@ -16,7 +16,6 @@ import io.quarkus.devtools.commands.data.QuarkusCommandOutcome; import io.quarkus.devtools.project.QuarkusProject; import io.quarkus.devtools.project.QuarkusProjectHelper; -import io.quarkus.devtools.project.update.QuarkusUpdateCommand; import io.quarkus.maven.dependency.ArtifactCoords; import io.quarkus.registry.RegistryResolutionException; import io.quarkus.registry.catalog.ExtensionCatalog; @@ -50,7 +49,7 @@ public class UpdateMojo extends QuarkusProjectStateMojoBase { /** * The OpenRewrite plugin version */ - @Parameter(property = "rewritePluginVersion", required = true, defaultValue = QuarkusUpdateCommand.DEFAULT_MAVEN_REWRITE_PLUGIN_VERSION) + @Parameter(property = "rewritePluginVersion", required = false) private String rewritePluginVersion; /** 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 e66706a7ea608..7631651898479 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 @@ -20,6 +20,7 @@ import io.quarkus.devtools.commands.data.QuarkusCommandOutcome; import io.quarkus.devtools.commands.handlers.ProjectInfoCommandHandler.PlatformInfo; import io.quarkus.devtools.messagewriter.MessageWriter; +import io.quarkus.devtools.project.BuildTool; import io.quarkus.devtools.project.QuarkusProject; import io.quarkus.devtools.project.QuarkusProjectHelper; import io.quarkus.devtools.project.state.ExtensionProvider; @@ -71,23 +72,26 @@ public QuarkusCommandOutcome execute(QuarkusCommandInvocation invocation) throws final boolean noRewrite = invocation.getValue(UpdateProject.NO_REWRITE, false); if (!noRewrite) { + final BuildTool buildTool = quarkusProject.getExtensionManager().getBuildTool(); QuarkusUpdates.ProjectUpdateRequest request = new QuarkusUpdates.ProjectUpdateRequest( - quarkusProject.getExtensionManager().getBuildTool(), + buildTool, projectQuarkusPlatformBom.getVersion(), targetPlatformVersion); Path recipe = null; try { recipe = Files.createTempFile("quarkus-project-recipe-", ".yaml"); final String updateRecipesVersion = invocation.getValue(UpdateProject.REWRITE_UPDATE_RECIPES_VERSION, QuarkusUpdatesRepository.DEFAULT_UPDATE_RECIPES_VERSION); - QuarkusUpdates.createRecipe(recipe, - QuarkusProjectHelper.artifactResolver(), updateRecipesVersion, request); - final String rewritePluginVersion = invocation.getValue(UpdateProject.REWRITE_PLUGIN_VERSION); + final QuarkusUpdatesRepository.FetchResult fetchResult = QuarkusUpdates.createRecipe(invocation.log(), + recipe, + QuarkusProjectHelper.artifactResolver(), buildTool, updateRecipesVersion, request); + final String rewritePluginVersion = invocation.getValue(UpdateProject.REWRITE_PLUGIN_VERSION, + fetchResult.getRewritePluginVersion()); final boolean rewriteDryRun = invocation.getValue(UpdateProject.REWRITE_DRY_RUN, false); invocation.log().warn( "The update feature does not yet handle updates of the extension versions. If needed, update your extensions manually."); QuarkusUpdateCommand.handle( invocation.log(), - quarkusProject.getExtensionManager().getBuildTool(), + buildTool, quarkusProject.getProjectDirPath(), rewritePluginVersion, recipe, diff --git a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdateCommand.java b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdateCommand.java index 7c7a7a76d36e2..10cbf50fb82b9 100644 --- a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdateCommand.java +++ b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdateCommand.java @@ -24,9 +24,6 @@ public class QuarkusUpdateCommand { public static final String MAVEN_REWRITE_PLUGIN_GROUP = "org.openrewrite.maven"; public static final String MAVEN_REWRITE_PLUGIN_ARTIFACT = "rewrite-maven-plugin"; - public static final String DEFAULT_MAVEN_REWRITE_PLUGIN_VERSION = "4.41.0"; - public static final String DEFAULT_GRADLE_REWRITE_PLUGIN_VERSION = "5.38.0"; - public static Set ADDITIONAL_SOURCE_FILES_SET = Set.of("**/META-INF/services/**", "**/*.txt", "**/*.adoc", diff --git a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdates.java b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdates.java index 2925175cb29d9..7f306cdace203 100644 --- a/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdates.java +++ b/independent-projects/tools/devtools-common/src/main/java/io/quarkus/devtools/project/update/QuarkusUpdates.java @@ -2,10 +2,11 @@ import java.io.IOException; import java.nio.file.Path; -import java.util.List; import io.quarkus.bootstrap.resolver.maven.MavenArtifactResolver; +import io.quarkus.devtools.messagewriter.MessageWriter; import io.quarkus.devtools.project.BuildTool; +import io.quarkus.devtools.project.update.QuarkusUpdatesRepository.FetchResult; import io.quarkus.devtools.project.update.operations.UpdatePropertyOperation; public final class QuarkusUpdates { @@ -13,10 +14,11 @@ public final class QuarkusUpdates { private QuarkusUpdates() { } - public static void createRecipe(Path target, MavenArtifactResolver artifactResolver, String updateRecipesVersion, + public static FetchResult createRecipe(MessageWriter log, Path target, MavenArtifactResolver artifactResolver, + BuildTool buildTool, String updateRecipesVersion, ProjectUpdateRequest request) throws IOException { - final List recipes = QuarkusUpdatesRepository.fetchRecipes(artifactResolver, updateRecipesVersion, + final FetchResult result = QuarkusUpdatesRepository.fetchRecipes(log, artifactResolver, buildTool, updateRecipesVersion, request.currentVersion, request.targetVersion); QuarkusUpdateRecipe recipe = new QuarkusUpdateRecipe() @@ -34,10 +36,11 @@ public static void createRecipe(Path target, MavenArtifactResolver artifactResol break; } - for (String s : recipes) { + for (String s : result.getRecipes()) { recipe.addRecipes(QuarkusUpdateRecipeIO.readRecipesYaml(s)); } QuarkusUpdateRecipeIO.write(target, recipe); + return result; } public static class ProjectUpdateRequest { 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 bef1aa28ccab0..1cc149745034f 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 @@ -1,17 +1,23 @@ package io.quarkus.devtools.project.update; import java.io.IOException; +import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import java.util.Optional; +import java.util.Properties; import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; +import org.eclipse.aether.artifact.Artifact; import io.quarkus.bootstrap.resolver.maven.BootstrapMavenException; import io.quarkus.bootstrap.resolver.maven.MavenArtifactResolver; import io.quarkus.bootstrap.util.DependencyUtils; +import io.quarkus.devtools.messagewriter.MessageWriter; +import io.quarkus.devtools.project.BuildTool; import io.quarkus.platform.descriptor.loader.json.ResourceLoader; import io.quarkus.platform.descriptor.loader.json.ResourceLoaders; @@ -23,14 +29,20 @@ private QuarkusUpdatesRepository() { private static final String QUARKUS_RECIPE_GA = "io.quarkus:quarkus-update-recipes"; public static final String DEFAULT_UPDATE_RECIPES_VERSION = "LATEST"; - public static List fetchRecipes(MavenArtifactResolver artifactResolver, String recipeVersion, String currentVersion, + public static final String DEFAULT_MAVEN_REWRITE_PLUGIN_VERSION = "4.41.0"; + public static final String DEFAULT_GRADLE_REWRITE_PLUGIN_VERSION = "5.38.0"; + public static final String PROP_REWRITE_MAVEN_PLUGIN_VERSION = "rewrite-maven-plugin-version"; + public static final String PROP_REWRITE_GRADLE_PLUGIN_VERSION = "rewrite-gradle-plugin-version"; + + public static FetchResult fetchRecipes(MessageWriter log, MavenArtifactResolver artifactResolver, BuildTool buildTool, + String recipeVersion, String currentVersion, String targetVersion) { final String gav = QUARKUS_RECIPE_GA + ":" + recipeVersion; try { + final Artifact artifact = artifactResolver.resolve(DependencyUtils.toArtifact(gav)).getArtifact(); final ResourceLoader resourceLoader = ResourceLoaders.resolveFileResourceLoader( - artifactResolver.resolve(DependencyUtils.toArtifact(gav)).getArtifact().getFile()); - - return resourceLoader.loadResourceAsPath("quarkus-updates/core", + artifact.getFile()); + final List recipes = resourceLoader.loadResourceAsPath("quarkus-updates/core", path -> { try (final Stream pathStream = Files.walk(path)) { return pathStream @@ -45,6 +57,27 @@ public static List fetchRecipes(MavenArtifactResolver artifactResolver, }).collect(Collectors.toList()); } }); + final Properties props = resourceLoader.loadResourceAsPath("quarkus-updates/", p -> { + final Properties properties = new Properties(); + final Path propPath = p.resolve("recipes.properties"); + if (Files.isRegularFile(propPath)) { + try (final InputStream inStream = Files.newInputStream(propPath)) { + properties.load(inStream); + } + } + return properties; + }); + final String propRewritePluginVersion = getPropRewritePluginVersion(props, buildTool); + + log.info(String.format( + "Resolved io.quarkus:quarkus-updates-recipes:%s with %s recipe(s) to update from %s to %s (initially made for OpenRewrite %s plugin version: %s) ", + artifact.getVersion(), + recipes.size(), + currentVersion, + targetVersion, + buildTool, + propRewritePluginVersion)); + return new FetchResult(recipes, propRewritePluginVersion); } catch (BootstrapMavenException e) { throw new RuntimeException("Failed to resolve artifact: " + gav, e); } catch (IOException e) { @@ -52,6 +85,39 @@ public static List fetchRecipes(MavenArtifactResolver artifactResolver, } } + private static String getPropRewritePluginVersion(Properties props, BuildTool buildTool) { + switch (buildTool) { + case MAVEN: + return Optional.ofNullable(props.getProperty(PROP_REWRITE_MAVEN_PLUGIN_VERSION)) + .orElse(DEFAULT_MAVEN_REWRITE_PLUGIN_VERSION); + case GRADLE: + case GRADLE_KOTLIN_DSL: + return Optional.ofNullable(props.getProperty(PROP_REWRITE_GRADLE_PLUGIN_VERSION)) + .orElse(DEFAULT_GRADLE_REWRITE_PLUGIN_VERSION); + default: + throw new IllegalStateException("This build tool does not support update " + buildTool); + } + } + + public static class FetchResult { + + private final List recipes; + private final String rewritePluginVersion; + + public FetchResult(List recipes, String rewritePluginVersion) { + this.rewritePluginVersion = rewritePluginVersion; + this.recipes = recipes; + } + + public List getRecipes() { + return recipes; + } + + public String getRewritePluginVersion() { + return rewritePluginVersion; + } + } + static boolean shouldApplyRecipe(String recipeFileName, String currentVersion, String targetVersion) { String recipeVersion = recipeFileName.replaceFirst("[.][^.]+$", ""); final DefaultArtifactVersion recipeAVersion = new DefaultArtifactVersion(recipeVersion);