From b8cb31c391c49b0e91d237d38b8c6f94bc1d6413 Mon Sep 17 00:00:00 2001 From: Alexey Loubyansky Date: Tue, 29 Aug 2023 10:17:13 +0200 Subject: [PATCH] logLatestPncBuilds option for depsToBuild --- .../domino/ProjectDependencyResolver.java | 54 +++++++++++++++++- .../domino/pnc}/PncArtifactLatestVersion.java | 2 +- .../domino/pnc}/PncVersionProvider.java | 55 ++++++++++++++++++- .../platformgen/NextPlatformVersionMojo.java | 2 +- .../version/PncVersionIncrementor.java | 1 + 5 files changed, 109 insertions(+), 5 deletions(-) rename {platform-bom/src/main/java/io/quarkus/bom/platform/version => domino/api/src/main/java/io/quarkus/domino/pnc}/PncArtifactLatestVersion.java (97%) rename {platform-bom/src/main/java/io/quarkus/bom/platform/version => domino/api/src/main/java/io/quarkus/domino/pnc}/PncVersionProvider.java (67%) diff --git a/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java b/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java index 90efcef2..319c4327 100644 --- a/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java +++ b/domino/api/src/main/java/io/quarkus/domino/ProjectDependencyResolver.java @@ -14,6 +14,7 @@ import io.quarkus.bootstrap.resolver.maven.MavenArtifactResolver; import io.quarkus.bootstrap.resolver.maven.workspace.ModelUtils; import io.quarkus.devtools.messagewriter.MessageWriter; +import io.quarkus.domino.pnc.PncVersionProvider; import io.quarkus.maven.dependency.ArtifactCoords; import java.io.IOException; import java.io.PrintStream; @@ -34,6 +35,7 @@ import java.util.Properties; import java.util.ServiceLoader; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.function.Function; @@ -293,11 +295,17 @@ public void log() { codeReposTotal = releaseRepos.size(); final List sorted = ReleaseCollection.sort(releaseRepos.values()); + boolean logLatestPncBuilds = Boolean.getBoolean("logLatestPncBuilds"); + AtomicInteger counter = new AtomicInteger(); for (ReleaseRepo e : sorted) { logComment("repo-url " + e.id().origin()); logComment("tag " + e.id().version().asString()); - for (String s : toSortedStrings(e.artifacts.keySet(), config.isLogModulesToBuild())) { - log(s); + if (logLatestPncBuilds) { + logLatestPncBuilds(e); + } else { + for (String s : toSortedStrings(e.artifacts.keySet(), config.isLogModulesToBuild())) { + log(s); + } } } @@ -388,6 +396,48 @@ public void log() { } } + private void logLatestPncBuilds(ReleaseRepo e) { + log.info("Checking the latest PNC builds of " + e.id()); + var gavSet = new HashSet(e.artifacts.size()); + var artifactSet = e.artifacts.keySet(); + for (var c : artifactSet) { + gavSet.add(new io.quarkus.maven.dependency.GAV(c.getGroupId(), c.getArtifactId(), c.getVersion())); + } + var latestVersions = PncVersionProvider.getLastRedHatBuildVersions(gavSet); + var pncRebuilds = new HashMap(latestVersions.size()); + for (var latest : latestVersions) { + if (latest.getLatestVersion() != null && !latest.getLatestVersion().equals(latest.getVersion())) { + pncRebuilds.put( + new io.quarkus.maven.dependency.GAV(latest.getGroupId(), latest.getArtifactId(), latest.getVersion()), + latest.getLatestVersion()); + } + } + final List lines = new ArrayList<>(latestVersions.size()); + for (var c : artifactSet) { + var gav = new io.quarkus.maven.dependency.GAV(c.getGroupId(), c.getArtifactId(), c.getVersion()); + StringBuilder sb = null; + if (!config.isLogModulesToBuild()) { + sb = new StringBuilder(); + sb.append(c.toGACTVString()); + } else if (gavSet.remove(gav)) { + sb = new StringBuilder(); + sb.append(gav); + } + + if (sb != null) { + String latestVersion = pncRebuilds.get(gav); + if (latestVersion != null) { + sb.append(" # was rebuilt as ").append(latestVersion); + } + lines.add(sb.toString()); + } + } + Collections.sort(lines); + for (var line : lines) { + log(line); + } + } + public void resolveDependencies() { var enforcedConstraints = getBomConstraints(config.getProjectBom()); for (var bomCoords : config.getNonProjectBoms()) { diff --git a/platform-bom/src/main/java/io/quarkus/bom/platform/version/PncArtifactLatestVersion.java b/domino/api/src/main/java/io/quarkus/domino/pnc/PncArtifactLatestVersion.java similarity index 97% rename from platform-bom/src/main/java/io/quarkus/bom/platform/version/PncArtifactLatestVersion.java rename to domino/api/src/main/java/io/quarkus/domino/pnc/PncArtifactLatestVersion.java index afa3e4f1..90e77f90 100644 --- a/platform-bom/src/main/java/io/quarkus/bom/platform/version/PncArtifactLatestVersion.java +++ b/domino/api/src/main/java/io/quarkus/domino/pnc/PncArtifactLatestVersion.java @@ -1,4 +1,4 @@ -package io.quarkus.bom.platform.version; +package io.quarkus.domino.pnc; import java.util.Objects; diff --git a/platform-bom/src/main/java/io/quarkus/bom/platform/version/PncVersionProvider.java b/domino/api/src/main/java/io/quarkus/domino/pnc/PncVersionProvider.java similarity index 67% rename from platform-bom/src/main/java/io/quarkus/bom/platform/version/PncVersionProvider.java rename to domino/api/src/main/java/io/quarkus/domino/pnc/PncVersionProvider.java index b3428ede..559291b8 100644 --- a/platform-bom/src/main/java/io/quarkus/bom/platform/version/PncVersionProvider.java +++ b/domino/api/src/main/java/io/quarkus/domino/pnc/PncVersionProvider.java @@ -1,10 +1,11 @@ -package io.quarkus.bom.platform.version; +package io.quarkus.domino.pnc; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import io.quarkus.domino.RhVersionPattern; +import io.quarkus.maven.dependency.GAV; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; @@ -14,7 +15,10 @@ import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; public class PncVersionProvider { @@ -79,6 +83,27 @@ public static String getLastRedHatBuildVersion(String groupId, String artifactId return versions.get(0).getLatestVersion(); } + public static Collection getLastRedHatBuildVersions(Collection artifactList) { + final String jsonRequest = getLatestVersionJsonRequest(artifactList); + final byte[] postData = jsonRequest.getBytes(StandardCharsets.UTF_8); + + final HttpURLConnection conn = initConnection(LATEST_VERSION_REQUEST_URL); + conn.setRequestProperty("Content-Length", Integer.toString(postData.length)); + try (DataOutputStream wr = new DataOutputStream(conn.getOutputStream())) { + wr.write(postData); + } catch (IOException e) { + throw new RuntimeException(e); + } + + final List versions; + try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { + versions = Arrays.asList(getMapper().readerForArrayOf(PncArtifactLatestVersion.class).readValue(reader)); + } catch (IOException e) { + throw new RuntimeException(e); + } + return versions; + } + private static HttpURLConnection initConnection(String url) { HttpURLConnection conn = null; try { @@ -99,6 +124,34 @@ private static HttpURLConnection initConnection(String url) { return conn; } + private static String getLatestVersionJsonRequest(Collection artifactList) { + if (artifactList.isEmpty()) { + return null; + } + var sb = new StringBuilder(); + sb.append("{\"mode\":\"PERSISTENT\",\"artifacts\":["); + var i = artifactList.iterator(); + var c = i.next(); + sb.append(toJson(c)); + if (i.hasNext()) { + final Set gavs = new HashSet<>(artifactList.size()); + gavs.add(c); + while (i.hasNext()) { + c = i.next(); + if (gavs.add(c)) { + sb.append(",").append(toJson(c)); + } + } + } + return sb.append("]}").toString(); + } + + private static String toJson(GAV gav) { + return "{\"groupId\":\"" + gav.getGroupId() + + "\",\"artifactId\":\"" + gav.getArtifactId() + + "\",\"version\":\"" + gav.getVersion() + "\"}"; + } + private static String getLatestVersionJsonRequest(String groupId, String artifactId, String version) { return "{\"mode\":\"PERSISTENT\",\"artifacts\":[{\"groupId\":\"" + groupId + "\",\"artifactId\":\"" + artifactId + "\",\"version\":\"" + version + "\"}]}"; diff --git a/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/NextPlatformVersionMojo.java b/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/NextPlatformVersionMojo.java index e473e5d4..0d001fc9 100644 --- a/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/NextPlatformVersionMojo.java +++ b/maven-plugin/src/main/java/io/quarkus/bom/decomposer/maven/platformgen/NextPlatformVersionMojo.java @@ -1,6 +1,6 @@ package io.quarkus.bom.decomposer.maven.platformgen; -import io.quarkus.bom.platform.version.PncVersionProvider; +import io.quarkus.domino.pnc.PncVersionProvider; import java.io.BufferedWriter; import java.io.IOException; import java.nio.file.Files; diff --git a/platform-bom/src/main/java/io/quarkus/bom/platform/version/PncVersionIncrementor.java b/platform-bom/src/main/java/io/quarkus/bom/platform/version/PncVersionIncrementor.java index fe916667..0d8d9f78 100644 --- a/platform-bom/src/main/java/io/quarkus/bom/platform/version/PncVersionIncrementor.java +++ b/platform-bom/src/main/java/io/quarkus/bom/platform/version/PncVersionIncrementor.java @@ -1,6 +1,7 @@ package io.quarkus.bom.platform.version; import io.quarkus.domino.RhVersionPattern; +import io.quarkus.domino.pnc.PncVersionProvider; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; public class PncVersionIncrementor implements PlatformVersionIncrementor {