You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2020/02/13 13:37:36 UTC
[camel-quarkus] 02/03: Update via -Pformat
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 559fbdb74f511208335b205f1be159d2062d2544
Author: Peter Palaga <pp...@redhat.com>
AuthorDate: Wed Feb 12 09:14:03 2020 +0100
Update <mvnd.builder.rule> via -Pformat
---
pom.xml | 1 +
tooling/scripts/sort-poms.groovy | 122 +++++++++++++++++++++++++++++++++++++++
2 files changed, 123 insertions(+)
diff --git a/pom.xml b/pom.xml
index 191a8b4..aa66c18 100644
--- a/pom.xml
+++ b/pom.xml
@@ -426,6 +426,7 @@
<properties>
<sortModulesPaths>extensions/pom.xml,integration-tests/pom.xml</sortModulesPaths>
<sortDependencyManagementPaths>poms/bom/pom.xml,poms/bom-deployment/pom.xml</sortDependencyManagementPaths>
+ <updateMvndRuleDirs>examples,integration-tests</updateMvndRuleDirs>
</properties>
<source>file:///${project.basedir}/tooling/scripts/sort-poms.groovy</source>
</configuration>
diff --git a/tooling/scripts/sort-poms.groovy b/tooling/scripts/sort-poms.groovy
index 0b63cd1..a4a3919 100644
--- a/tooling/scripts/sort-poms.groovy
+++ b/tooling/scripts/sort-poms.groovy
@@ -26,6 +26,8 @@ import java.nio.file.Files
import java.util.regex.Matcher
import java.util.regex.Pattern
+import groovy.util.NodeList
+
@groovy.transform.Field
final Path baseDir = basedir.toPath()
@@ -35,6 +37,9 @@ sortDependencyManagement(sortDepManagementPaths)
final String[] sortModulesPaths = properties['sortModulesPaths'].split(',')
sortModules(sortModulesPaths)
+final String[] updateMvndRuleDirs = properties['updateMvndRuleDirs'].split(',')
+updateMvndRules(updateMvndRuleDirs)
+
void sortDependencyManagement(String[] pomPaths) {
for (pomPath in pomPaths) {
final Path pomXmlPath = baseDir.resolve(pomPath.trim())
@@ -179,3 +184,120 @@ void sortModules(String[] sortModulesPaths) {
}
}
}
+
+void updateMvndRules(String[] updateMvndRuleDirs) {
+ final Set<String> extensionArtifactIds = [] as TreeSet
+ Files.list(baseDir.resolve('extensions'))
+ .filter { p -> Files.isDirectory(p) && Files.exists(p.resolve('pom.xml')) && Files.exists(p.resolve('runtime')) }
+ .map { p -> p.getFileName().toString() }
+ .filter { dirName -> !dirName.equals('support') }
+ .map { dirName -> 'camel-quarkus-' + dirName }
+ .forEach { aid -> extensionArtifactIds << aid }
+
+ Files.list(baseDir.resolve('extensions/support'))
+ .filter { p -> Files.isDirectory(p) && Files.exists(p.resolve('pom.xml')) && Files.exists(p.resolve('runtime')) }
+ .map { p -> p.getFileName().toString() }
+ .map { dirName -> 'camel-quarkus-support-' + dirName }
+ .forEach { aid -> extensionArtifactIds << aid }
+
+ Files.list(baseDir.resolve('integration-tests/support'))
+ .filter { p -> Files.isDirectory(p) && Files.exists(p.resolve('pom.xml')) && Files.exists(p.resolve('runtime')) }
+ .map { p -> p.getFileName().toString() }
+ .map { dirName -> 'camel-quarkus-integration-test-support-' + dirName + '-ext' }
+ .forEach { aid -> extensionArtifactIds << aid }
+
+ /* Policy may disappear at some point */
+ final boolean policyExtensionExists = extensionArtifactIds.contains('camel-quarkus-support-policy')
+
+ final Pattern dependenciesPattern = Pattern.compile('([^\n<]*)<dependenc')
+ final Pattern propsPattern = Pattern.compile('([^\n<]*)</properties>')
+ final Pattern rulePattern = Pattern.compile('<mvnd.builder.rule>[^<]*</mvnd.builder.rule>')
+
+ for (updateMvndRuleDir in updateMvndRuleDirs) {
+ Files.list(baseDir.resolve(updateMvndRuleDir))
+ .filter { p -> Files.isDirectory(p) && !'support'.equals(p.getFileName().toString()) }
+ .map { p -> p.resolve('pom.xml') }
+ .filter { p -> Files.exists(p) }
+ .forEach { pomXmlPath ->
+
+ final Path relativePomPath = baseDir.relativize(pomXmlPath)
+
+ String pomXmlText = pomXmlPath.toFile().getText('UTF-8')
+
+ Node pomXmlProject = null
+ try {
+ pomXmlProject = new XmlParser().parseText(pomXmlText)
+ } catch (Exception e) {
+ throw new RuntimeException('Could not parse ' + relativePomPath, e)
+ }
+ final List<String> extensionDependencies = pomXmlProject.dependencies.dependency
+ .findAll { dep -> "org.apache.camel.quarkus".equals(dep.groupId.text()) && extensionArtifactIds.contains(dep.artifactId.text()) }
+ .collect { dep -> dep.artifactId.text() + '-deployment' }
+ if (policyExtensionExists) {
+ extensionDependencies.add('camel-quarkus-support-policy-deployment')
+ }
+
+ final String expectedRule = extensionDependencies
+ .toSorted()
+ .join(',')
+
+ final Matcher depsMatcher = dependenciesPattern.matcher(pomXmlText)
+ if (depsMatcher.find()) {
+ final String indent = depsMatcher.group(1)
+ final int insertionPos = depsMatcher.start()
+
+ final NodeList props = pomXmlProject.properties
+ if (props.isEmpty()) {
+ final String insert = indent + '<properties>\n' +
+ indent + indent + '<!-- mvnd, a.k.a. Maven Daemon: https://github.com/gnodet/mvnd -->\n' +
+ indent + indent + '<!-- The following rule tells mvnd to build the listed deployment modules before this module. -->\n' +
+ indent + indent + '<!-- This is important because mvnd builds modules in parallel by default. The deployment modules are not -->\n' +
+ indent + indent + '<!-- explicit dependencies of this module in the Maven sense, although they are required by the Quarkus Maven plugin. -->\n' +
+ indent + indent + '<!-- Please update rule whenever you change the dependencies of this module by running -->\n' +
+ indent + indent + '<!-- mvn process-resources -Pformat from the root directory -->\n' +
+ indent + indent + '<mvnd.builder.rule>' + expectedRule + '</mvnd.builder.rule>\n' +
+ indent + '</properties>\n\n'
+ pomXmlText = new StringBuilder(pomXmlText).insert(insertionPos, insert).toString()
+ Files.write(pomXmlPath, pomXmlText.getBytes('UTF-8'))
+ } else {
+ final NodeList mvndRule = props.'mvnd.builder.rule'
+ if (mvndRule.isEmpty()) {
+ final Matcher propsMatcher = propsPattern.matcher(pomXmlText)
+ if (propsMatcher.find()) {
+ final int insPos = propsMatcher.start()
+ final String insert = indent + indent + '<mvnd.builder.rule>' + expectedRule + '</mvnd.builder.rule>\n'
+ pomXmlText = new StringBuilder(pomXmlText).insert(insPos, insert).toString()
+ Files.write(pomXmlPath, pomXmlText.getBytes('UTF-8'))
+ } else {
+ throw new IllegalStateException('Could not find ' + propsPattern.pattern() + ' in ' + relativePomPath)
+ }
+ } else {
+ final String actualRule = mvndRule.get(0).text()
+ .split(',')
+ .collect{ it -> it.trim() }
+ .toSorted()
+ .join(',')
+ if (!expectedRule.equals(actualRule)) {
+ final Matcher ruleMatcher = rulePattern.matcher(pomXmlText)
+ if (ruleMatcher.find()) {
+ final StringBuffer buf = new StringBuffer(pomXmlText.length() + 128)
+ final String replacement = '<mvnd.builder.rule>' + expectedRule + '</mvnd.builder.rule>'
+ ruleMatcher.appendReplacement(buf, Matcher.quoteReplacement(replacement))
+ ruleMatcher.appendTail(buf)
+ Files.write(pomXmlPath, buf.toString().getBytes('UTF-8'))
+ } else {
+ throw new IllegalStateException('Could not find ' + rulePattern.pattern() + ' in ' + relativePomPath)
+ }
+ }
+ }
+ }
+
+ } else {
+ throw new IllegalStateException('Could not find ' + dependenciesPattern.pattern() + ' in ' + relativePomPath)
+ }
+
+
+
+ }
+ }
+}