You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pp...@apache.org on 2020/03/18 17:24:19 UTC
[camel-quarkus] 02/02: Sort poms using the CQ plugin instead of a
groovy script
This is an automated email from the ASF dual-hosted git repository.
ppalaga pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 5bc3404156026e2ef9811f5ba24fb65b2ca31b76
Author: Peter Palaga <pp...@redhat.com>
AuthorDate: Wed Mar 18 15:01:22 2020 +0100
Sort poms using the CQ plugin instead of a groovy script
---
extensions-support/pom.xml | 1 +
pom.xml | 47 ++++--
tooling/scripts/sort-poms.groovy | 306 ---------------------------------------
3 files changed, 39 insertions(+), 315 deletions(-)
diff --git a/extensions-support/pom.xml b/extensions-support/pom.xml
index 724b440..1f74b06 100644
--- a/extensions-support/pom.xml
+++ b/extensions-support/pom.xml
@@ -32,6 +32,7 @@
<packaging>pom</packaging>
<modules>
+ <!-- extensions a..z; do not remove this comment, it is important when sorting via mvn process-resources -Pformat -->
<module>ahc</module>
<module>aws</module>
<module>common</module>
diff --git a/pom.xml b/pom.xml
index ab78a97..a10dd2f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -482,23 +482,52 @@
</executions>
</plugin>
<plugin>
- <groupId>org.codehaus.gmaven</groupId>
- <artifactId>groovy-maven-plugin</artifactId>
+ <groupId>org.l2x6.cq</groupId>
+ <artifactId>cq-maven-plugin</artifactId>
<executions>
<execution>
<id>sort-poms</id>
<inherited>false</inherited>
<goals>
- <goal>execute</goal>
+ <goal>format</goal>
</goals>
<phase>process-resources</phase>
<configuration>
- <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>
+ <sortModulesPaths>
+ <sortModulesPath>extensions/pom.xml</sortModulesPath>
+ <sortModulesPath>extensions-jvm/pom.xml</sortModulesPath>
+ <sortModulesPath>integration-tests/pom.xml</sortModulesPath>
+ </sortModulesPaths>
+ <sortDependencyManagementPaths>
+ <sortDependencyManagementPath>poms/bom/pom.xml</sortDependencyManagementPath>
+ <sortDependencyManagementPath>poms/bom-deployment/pom.xml</sortDependencyManagementPath>
+ </sortDependencyManagementPaths>
+ <updateMvndRuleDirs>
+ <updateMvndRuleDir>examples</updateMvndRuleDir>
+ <updateMvndRuleDir>integration-tests</updateMvndRuleDir>
+ </updateMvndRuleDirs>
+ <extensionDirs>
+ <extensionDir>
+ <path>extensions</path>
+ <artifactIdPrefix>camel-quarkus-</artifactIdPrefix>
+ </extensionDir>
+ <extensionDir>
+ <path>extensions-core</path>
+ <artifactIdPrefix>camel-quarkus-</artifactIdPrefix>
+ </extensionDir>
+ <extensionDir>
+ <path>extensions-jvm</path>
+ <artifactIdPrefix>camel-quarkus-</artifactIdPrefix>
+ </extensionDir>
+ <extensionDir>
+ <path>extensions-support</path>
+ <artifactIdPrefix>camel-quarkus-support-</artifactIdPrefix>
+ </extensionDir>
+ <extensionDir>
+ <path>integration-tests/support</path>
+ <artifactIdPrefix>camel-quarkus-integration-test-support-</artifactIdPrefix>
+ </extensionDir>
+ </extensionDirs>
</configuration>
</execution>
</executions>
diff --git a/tooling/scripts/sort-poms.groovy b/tooling/scripts/sort-poms.groovy
deleted file mode 100644
index 7a67b37..0000000
--- a/tooling/scripts/sort-poms.groovy
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * A script for sorting child modules and dependencyManagement dependencies in pom.xml files.
- * Only elements will be sorted that occur after a comment containing the {@code a..z} marker string.
- */
-
-import java.nio.file.Path
-import java.nio.file.Paths
-import java.nio.file.Files
-import java.util.regex.Matcher
-import java.util.regex.Pattern
-import java.util.stream.Stream
-
-import groovy.util.NodeList
-
-@groovy.transform.Field
-final Path baseDir = basedir.toPath()
-
-final String[] sortDepManagementPaths = properties['sortDependencyManagementPaths'].split(',')
-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())
- final String xmlSource = new String(Files.readAllBytes(pomXmlPath), 'UTF-8')
-
- final Pattern sortSpanPattern = Pattern.compile('(a\\.\\.z[^>]*>)(.*)</dependencies>(\\r?\\n)([ ]*)</dependencyManagement>', Pattern.DOTALL)
- final Pattern groupIdPattern = Pattern.compile('<groupId>([^<]+)</groupId>')
-
- final Matcher matcher = sortSpanPattern.matcher(xmlSource)
- if (matcher.find()) {
- String dependenciesString = matcher.group(2)
- final String eol = matcher.group(3)
- final String indent = matcher.group(4)
-
- dependenciesString = dependenciesString.replaceAll('<!--\\$[^>]*\\$-->', '')
- final String[] dependenciesArray = dependenciesString.split('</dependency>')
- /* Sort by adding to a TreeMap */
- final Map<String, Map<String, String>> sortedDeps = new TreeMap<>();
- for (dep in dependenciesArray) {
- dep = dep.trim()
- if (!dep.isEmpty()) {
- String key = dep
- .replaceAll('>[ \n\r\t]+', '>')
- .replaceAll('[ \n\r\t]+<', '<')
- final Matcher gMatcher = groupIdPattern.matcher(key)
- gMatcher.find()
- final String groupId = gMatcher.group(1)
- key = key.replaceAll('<[^>]+>', ' ').replaceAll(' +', ' ')
-
- Map<String, String> groupMap = sortedDeps.get(groupId)
- if (groupMap == null) {
- groupMap = new TreeMap<String, String>()
- sortedDeps.put(groupId, groupMap)
- }
- groupMap.put(key, dep);
- }
- }
- final StringBuilder result = new StringBuilder(xmlSource)
- result.setLength(matcher.end(1))
-
- final Appender appender = new Appender(eol, indent, sortedDeps, result)
-
- appender.appendGroup('org.apache.camel', true)
- appender.appendGroup('org.apache.camel.quarkus', true)
-
- appender.appendOther()
- appender.result().append(eol).append(indent).append(indent).append(xmlSource.substring(matcher.end(2)))
-
- Files.write(pomXmlPath, result.toString().getBytes('UTF-8'));
- } else {
- throw new RuntimeException('Could not match ' + sortSpanPattern + ' in ' + pomXmlPath)
- }
- }
-}
-
-class Appender {
- private final Set<String> processedGroupIds = new HashSet<>()
- private final String eol
- private final String indent
- private final Map<String, Map<String, String>> sortedDeps
- private final StringBuilder result
-
- public Appender(String eol, String indent, Map<String, Map<String, String>> sortedDeps, StringBuilder result) {
- this.eol = eol
- this.indent = indent
- this.sortedDeps = sortedDeps
- this.result = result
- }
-
- public void comment(String comment) {
- result.append(eol).append(eol)
- .append(indent).append(indent).append(indent).append('<!--$ '+ comment +' $-->')
- }
-
- public void appendGroup(String groupId, boolean isComment) {
- final Map<String, String> deps = sortedDeps.get(groupId)
- if (deps == null || processedGroupIds.contains(groupId)) {
- return
- }
- processedGroupIds.add(groupId)
- if (isComment) {
- comment(groupId)
- }
- for (dep in deps.values()) {
- result.append(eol)
- .append(indent).append(indent).append(indent).append(dep)
- .append(eol).append(indent).append(indent).append(indent).append('</dependency>')
- }
- }
-
- public void appendOther() {
- if (processedGroupIds.size() < sortedDeps.size()) {
- comment('Other third party dependencies')
- for (group in sortedDeps.entrySet()) {
- appendGroup(group.getKey(), false)
- }
- }
- }
-
- public StringBuilder result() {
- return result
- }
-}
-
-void sortModules(String[] sortModulesPaths) {
- for (pomPath in sortModulesPaths) {
- final Path pomXmlPath = basedir.toPath().resolve(pomPath.trim())
- final String xmlSource = new String(Files.readAllBytes(pomXmlPath), 'UTF-8')
-
- final Pattern sortSpanPattern = Pattern.compile('(a\\.\\.z[^>]*>)(.*)(\\r?\\n)([ ]*)</modules>', Pattern.DOTALL)
-
- final Matcher matcher = sortSpanPattern.matcher(xmlSource)
- if (matcher.find()) {
- final String modulesString = matcher.group(2)
- final String eol = matcher.group(3)
- final String indent = matcher.group(4)
- final String[] modulesArray = modulesString.split('[\r\n]+ *')
- final Map<String, String> sortedModules = new TreeMap<String, String>()
- for (module in modulesArray) {
- module = module.trim()
- if (!module.isEmpty()) {
- String key = module
- .replaceAll('>[ \n\r\t]+', '>')
- .replaceAll('[ \n\r\t]+<', '<')
- key = key.replaceAll('<[^>]+>', '')
- if (!key.isEmpty()) {
- sortedModules.put(key, module);
- }
- }
- }
-
- final StringBuilder result = new StringBuilder(xmlSource)
- result.setLength(matcher.end(1))
- for (module in sortedModules.values()) {
- result.append(eol).append(indent).append(indent).append(module)
- }
- result.append(eol).append(indent).append(xmlSource.substring(matcher.end(4)))
-
- Files.write(pomXmlPath, result.toString().getBytes('UTF-8'));
- } else {
- throw new RuntimeException('Could not match ' + sortSpanPattern + ' in ' + pomXmlPath)
- }
- }
-}
-
-void updateMvndRules(String[] updateMvndRuleDirs) {
- final Set<String> extensionArtifactIds = [] as TreeSet
- Stream.of('extensions', 'extensions-core')
- .map { relPath -> baseDir.resolve(relPath) }
- .flatMap { extensionsDir -> Files.list(extensionsDir) }
- .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-' + 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)
- }
-
-
-
- }
- }
-}