Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package maven-filtering for openSUSE:Factory checked in at 2026-03-05 17:30:48 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/maven-filtering (Old) and /work/SRC/openSUSE:Factory/.maven-filtering.new.561 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "maven-filtering" Thu Mar 5 17:30:48 2026 rev:12 rq:1336714 version:3.5.0 Changes: -------- --- /work/SRC/openSUSE:Factory/maven-filtering/maven-filtering.changes 2025-10-10 17:13:09.330853848 +0200 +++ /work/SRC/openSUSE:Factory/.maven-filtering.new.561/maven-filtering.changes 2026-03-05 17:33:39.056681507 +0100 @@ -1,0 +2,25 @@ +Mon Mar 2 12:38:14 UTC 2026 - Fridrich Strba <[email protected]> + +- Upgrade to upstream version 3.5.0 + * New features and improvements + + Introduce ChangeDetection + + Use Release Drafter from shared and improvements + * Bug Fixes + + Issue 289: filter file names one component at a time on 3.x + branch + * Maintenance + + Update site descriptor + + Cleanup tests + + Enable Github Issues (3.x) + + Add PR Automation + * Dependency updates + + Bump org.apache.maven.shared:maven-shared-components from 43 + to 47 + + Bump org.codehaus.plexus:plexus-testing from 1.3.0 to 2.1.0 + + Bump Maven to 3.9.12 + + Bump org.apache.commons:commons-lang3 from 3.16.0 to 3.20.0 + + Bump org.codehaus.plexus:plexus-interpolation from 1.27 to 1.29 + + Bump commons-io:commons-io from 2.16.1 to 2.21.0 + + Bump org.hamcrest:hamcrest from 2.2 to 3.0 + +------------------------------------------------------------------- Old: ---- maven-filtering-3.4.0-source-release.zip New: ---- maven-filtering-3.5.0-source-release.zip ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ maven-filtering.spec ++++++ --- /var/tmp/diff_new_pack.jhHLAB/_old 2026-03-05 17:33:39.712708748 +0100 +++ /var/tmp/diff_new_pack.jhHLAB/_new 2026-03-05 17:33:39.712708748 +0100 @@ -1,7 +1,7 @@ # # spec file for package maven-filtering # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: maven-filtering -Version: 3.4.0 +Version: 3.5.0 Release: 0 Summary: Shared component providing resource filtering License: Apache-2.0 @@ -59,8 +59,6 @@ %pom_xpath_remove pom:project/pom:parent/pom:relativePath -%pom_remove_dep :plexus-xml - %build mkdir -p lib build-jar-repository -s lib \ ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.jhHLAB/_old 2026-03-05 17:33:39.744710076 +0100 +++ /var/tmp/diff_new_pack.jhHLAB/_new 2026-03-05 17:33:39.748710243 +0100 @@ -1,6 +1,6 @@ -mtime: 1760085168 -commit: 1efd3a3789568c9c8e69506eac45e0c3a721e592aabbf92048fd417b0192f635 +mtime: 1772456459 +commit: 672fafcb418d0e85ea6bef472fd6909c371c348d7dba09387a53db7c8d68fab1 url: https://src.opensuse.org/java-packages/maven-filtering.git -revision: 1efd3a3789568c9c8e69506eac45e0c3a721e592aabbf92048fd417b0192f635 +revision: 672fafcb418d0e85ea6bef472fd6909c371c348d7dba09387a53db7c8d68fab1 projectscmsync: https://src.opensuse.org/java-packages/_ObsPrj ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-03-02 14:01:33.000000000 +0100 @@ -0,0 +1 @@ +.osc ++++++ maven-filtering-3.4.0-source-release.zip -> maven-filtering-3.5.0-source-release.zip ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/.gitignore new/maven-filtering-3.5.0/.gitignore --- old/maven-filtering-3.4.0/.gitignore 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/.gitignore 1970-01-01 01:00:00.000000000 +0100 @@ -1,19 +0,0 @@ -target/ -.project -.classpath -.settings/ -.svn/ -bin/ -# Intellij -*.ipr -*.iml -*~ -.idea -out/ -.DS_Store -/bootstrap -/dependencies.xml -.java-version -*.versionsBackup -.checkstyle - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/DEPENDENCIES new/maven-filtering-3.5.0/DEPENDENCIES --- old/maven-filtering-3.4.0/DEPENDENCIES 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/DEPENDENCIES 2026-03-02 11:11:22.000000000 +0100 @@ -8,22 +8,19 @@ From: 'an unknown organization' - - javax.inject (http://code.google.com/p/atinject/) javax.inject:javax.inject:jar:1 - License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - - plexus-build-api (http://forge.sonatype.com/spice-parent/plexus-build-api/) org.sonatype.plexus:plexus-build-api:jar:0.0.7 License: Apache Public License 2.0 (http://www.apache.org/licenses/LICENSE-2.0) From: 'Codehaus Plexus' (https://codehaus-plexus.github.io/) - - Plexus Interpolation API (https://codehaus-plexus.github.io/plexus-pom/plexus-interpolation/) org.codehaus.plexus:plexus-interpolation:bundle:1.27 + - plexus-build-api (https://codehaus-plexus.github.io/plexus-pom/plexus-build-api/) org.codehaus.plexus:plexus-build-api:jar:1.2.0 License: Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) - - Plexus Common Utilities (https://codehaus-plexus.github.io/plexus-utils/) org.codehaus.plexus:plexus-utils:jar:4.0.1 - License: Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) + - Plexus Interpolation API (https://codehaus-plexus.github.io/plexus-pom/plexus-interpolation/) org.codehaus.plexus:plexus-interpolation:bundle:1.29 + License: Apache-2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) - - Plexus XML Utilities (https://codehaus-plexus.github.io/plexus-xml/) org.codehaus.plexus:plexus-xml:jar:3.0.1 + - Plexus Common Utilities (https://codehaus-plexus.github.io/plexus-utils/) org.codehaus.plexus:plexus-utils:jar:3.6.0 License: Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) @@ -33,15 +30,6 @@ License: MIT License (http://www.opensource.org/licenses/mit-license.php) -From: 'The Apache Software Foundation' (https://www.apache.org/) - - - Apache Commons IO (https://commons.apache.org/proper/commons-io/) commons-io:commons-io:jar:2.16.1 - License: Apache-2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) - - - Apache Commons Lang (https://commons.apache.org/proper/commons-lang/) org.apache.commons:commons-lang3:jar:3.16.0 - License: Apache-2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) - - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/NOTICE new/maven-filtering-3.5.0/NOTICE --- old/maven-filtering-3.4.0/NOTICE 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/NOTICE 2026-03-02 11:11:22.000000000 +0100 @@ -1,5 +1,5 @@ Apache Maven Filtering -Copyright 2002-2024 The Apache Software Foundation +Copyright 2002-2026 The Apache Software Foundation This product includes software developed at diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/README.md new/maven-filtering-3.5.0/README.md --- old/maven-filtering-3.4.0/README.md 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/README.md 2026-03-02 11:11:22.000000000 +0100 @@ -17,15 +17,20 @@ Contributing to [Apache Maven Filtering](https://maven.apache.org/shared/maven-filtering/) ====================== -[][jira] [][license] +[](https://search.maven.org/artifact/org.apache.maven.shared/maven-filtering) +[](https://github.com/jvm-repo-rebuild/reproducible-central/blob/master/content/org/apache/maven/shared/maven-filtering/README.md) +[][build-3] +[][test-results-3] + +Maven 4: [master](https://github.com/apache/maven-filtering/tree/master) [](https://search.maven.org/artifact/org.apache.maven.shared/maven-filtering) -[](https://github.com/jvm-repo-rebuild/reproducible-central/blob/master/content/org/apache/maven/shared/maven-filtering/README.md) +[](https://github.com/jvm-repo-rebuild/reproducible-central/blob/master/content/org/apache/maven/shared/maven-filtering/README.md) [][build] [][test-results] -You have found a bug or you have an idea for a cool new feature? Contributing +You have found a bug, or you have an idea for a cool new feature? Contributing code is a great way to give something back to the open source community. Before you dig right into the code, there are a few guidelines that we need contributors to follow so that we can have a chance of keeping on top of @@ -34,7 +39,6 @@ Getting Started --------------- -+ Make sure you have a [JIRA account](https://issues.apache.org/jira/). + Make sure you have a [GitHub account](https://github.com/signup/free). + If you're planning to implement a new feature, it makes sense to discuss your changes on the [dev list][ml-list] first. @@ -60,41 +64,29 @@ + Create minimal diffs - disable on save actions like reformat source code or organize imports. If you feel the source code should be reformatted, create a separate PR for this change. + Check for unnecessary whitespace with `git diff --check` before committing. -+ Make sure your commit messages are in the proper format. Your commit message should contain the key of the JIRA issue. -``` -[MSHARED-XXX] - Subject of the JIRA Ticket - Optional supplemental description. -``` + Make sure you have added the necessary tests (JUnit/IT) for your changes. + Run all the tests with `mvn -Prun-its verify` to assure nothing else was accidentally broken. + Submit a pull request to the repository in the Apache organization. -+ Update your JIRA ticket and include a link to the pull request in the ticket. If you plan to contribute on a regular basis, please consider filing a [contributor license agreement][cla]. -Making Trivial Changes ----------------------- - -For changes of a trivial nature to comments and documentation, it is not always -necessary to create a new ticket in JIRA. In this case, it is appropriate to -start the first line of a commit with '(doc)' instead of a ticket number. - Additional Resources -------------------- + [Contributing patches](https://maven.apache.org/guides/development/guide-maven-development.html#Creating_and_submitting_a_patch) -+ [Apache Maven Shared Components project page][jira] + [Contributor License Agreement][cla] + [General GitHub documentation](https://help.github.com/) + [GitHub pull request documentation](https://help.github.com/send-pull-requests/) -+ [Apache Maven Twitter Account](https://twitter.com/ASFMavenProject) -+ #Maven IRC channel on freenode.org ++ [Apache Maven X Account](https://x.com/ASFMavenProject) ++ [Apache Maven Bluesky Account](https://bsky.app/profile/maven.apache.org) ++ [Apache Maven Mastodon Account](https://mastodon.social/deck/@[email protected]) -[jira]: https://issues.apache.org/jira/projects/MSHARED/ [license]: https://www.apache.org/licenses/LICENSE-2.0 [ml-list]: https://maven.apache.org/mailing-lists.html [code-style]: https://maven.apache.org/developers/conventions/code.html [cla]: https://www.apache.org/licenses/#clas [maven-wiki]: https://cwiki.apache.org/confluence/display/MAVEN/Index [test-results]: https://ci-maven.apache.org/job/Maven/job/maven-box/job/maven-filtering/job/master/lastCompletedBuild/testReport/ +[test-results-3]: https://ci-maven.apache.org/job/Maven/job/maven-box/job/maven-filtering/job/maven-filtering-3.x/lastCompletedBuild/testReport/ [build]: https://ci-maven.apache.org/job/Maven/job/maven-box/job/maven-filtering/job/master/ +[build-3]: https://ci-maven.apache.org/job/Maven/job/maven-box/job/maven-filtering/job/maven-filtering-3.x/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/pom.xml new/maven-filtering-3.5.0/pom.xml --- old/maven-filtering-3.4.0/pom.xml 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/pom.xml 2026-03-02 11:11:22.000000000 +0100 @@ -23,12 +23,12 @@ <parent> <groupId>org.apache.maven.shared</groupId> <artifactId>maven-shared-components</artifactId> - <version>43</version> + <version>47</version> <relativePath /> </parent> <artifactId>maven-filtering</artifactId> - <version>3.4.0</version> + <version>3.5.0</version> <name>Apache Maven Filtering</name> <description>A component to assist in filtering of resource files with properties from a Maven project.</description> @@ -42,12 +42,12 @@ <scm> <connection>scm:git:https://gitbox.apache.org/repos/asf/maven-filtering.git</connection> <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/maven-filtering.git</developerConnection> - <tag>maven-filtering-3.4.0</tag> + <tag>maven-filtering-3.5.0</tag> <url>https://github.com/apache/maven-filtering/tree/${project.scm.tag}</url> </scm> <issueManagement> - <system>JIRA</system> - <url>https://issues.apache.org/jira/issues/?jql=project%20%3D%20MSHARED%20AND%20component%20%3D%20maven-filtering</url> + <system>GitHub Issues</system> + <url>https://github.com/apache/maven-filtering/issues</url> </issueManagement> <ciManagement> <system>Jenkins</system> @@ -61,10 +61,10 @@ </distributionManagement> <properties> - <mavenVersion>3.6.3</mavenVersion> + <mavenVersion>3.9.12</mavenVersion> <slf4jVersion>1.7.36</slf4jVersion> - <plexusBuildApiVersion>0.0.7</plexusBuildApiVersion> - <project.build.outputTimestamp>2024-08-28T15:27:34Z</project.build.outputTimestamp> + <version.plexus-utils>3.6.0</version.plexus-utils> + <project.build.outputTimestamp>2026-03-02T11:11:22Z</project.build.outputTimestamp> <!-- don't fail check for some rules that are too hard to enforce (could even be told broken for some) and those that are enforced by the formatting checks from spotless --> <checkstyle.violation.ignore>ParameterNumber,MethodLength,FileLength</checkstyle.violation.ignore> @@ -72,19 +72,30 @@ <dependencies> <dependency> - <groupId>javax.inject</groupId> - <artifactId>javax.inject</artifactId> - <version>1</version> - </dependency> - <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4jVersion}</version> </dependency> <dependency> - <groupId>org.sonatype.plexus</groupId> + <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-build-api</artifactId> - <version>${plexusBuildApiVersion}</version> + <version>1.2.0</version> + </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-utils</artifactId> + </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-interpolation</artifactId> + <version>1.29</version> + </dependency> + + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + <version>1</version> + <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.maven</groupId> @@ -104,29 +115,6 @@ <version>${mavenVersion}</version> <scope>provided</scope> </dependency> - <dependency> - <groupId>org.codehaus.plexus</groupId> - <artifactId>plexus-utils</artifactId> - </dependency> - <dependency> - <groupId>org.codehaus.plexus</groupId> - <artifactId>plexus-xml</artifactId> - </dependency> - <dependency> - <groupId>org.codehaus.plexus</groupId> - <artifactId>plexus-interpolation</artifactId> - <version>1.27</version> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>2.16.1</version> - </dependency> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-lang3</artifactId> - <version>3.16.0</version> - </dependency> <dependency> <groupId>org.mockito</groupId> @@ -137,13 +125,13 @@ <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-testing</artifactId> - <version>1.3.0</version> + <version>2.1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest</artifactId> - <version>2.2</version> + <version>3.0</version> <scope>test</scope> </dependency> <dependency> @@ -167,7 +155,12 @@ <artifactId>org.eclipse.sisu.inject</artifactId> <scope>test</scope> </dependency> - + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.21.0</version> + <scope>test</scope> + </dependency> </dependencies> <build> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/AbstractMavenFilteringRequest.java new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/AbstractMavenFilteringRequest.java --- old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/AbstractMavenFilteringRequest.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/AbstractMavenFilteringRequest.java 2026-03-02 11:11:22.000000000 +0100 @@ -28,6 +28,8 @@ import org.apache.maven.project.MavenProject; import org.codehaus.plexus.interpolation.Interpolator; +import static java.util.Objects.requireNonNull; + /** * @since 1.0-beta-3 */ @@ -84,6 +86,13 @@ private Consumer<Interpolator> interpolatorCustomizer; /** + * Change detection strategy to determine whether an existing file should be overwritten. + * + * @since 3.5.0 + */ + private ChangeDetection changeDetection = ChangeDetection.CONTENT; + + /** * Create instance. */ protected AbstractMavenFilteringRequest() { @@ -360,4 +369,23 @@ public void setInterpolatorCustomizer(Consumer<Interpolator> interpolatorCustomizer) { this.interpolatorCustomizer = interpolatorCustomizer; } + + /** + * Change detection strategy to determine whether an existing file should be overwritten. + * + * @since 3.5.0 + */ + public ChangeDetection getChangeDetection() { + return changeDetection; + } + + /** + * Sets the change detection strategy to determine whether an existing file should be overwritten. + * + * @param changeDetection the change detection strategy to use, must not be {@code null}. + * @since 3.5.0 + */ + public void setChangeDetection(ChangeDetection changeDetection) { + this.changeDetection = requireNonNull(changeDetection); + } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/ChangeDetection.java new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/ChangeDetection.java --- old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/ChangeDetection.java 1970-01-01 01:00:00.000000000 +0100 +++ new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/ChangeDetection.java 2026-03-02 11:11:22.000000000 +0100 @@ -0,0 +1,47 @@ +/* + * 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. + */ +package org.apache.maven.shared.filtering; + +/** + * Change detection strategies: to decide whether an <strong>existing target file</strong> needs to be overwritten or not. + * + * @since 3.5.0 + */ +public enum ChangeDetection { + /** + * Only consider the file timestamp to determine is overwrite of existing file needed. This was default before 3.4.0. + */ + TIMESTAMP, + /** + * Only consider the content of the file to determine is overwrite of existing file needed. This is the default since 3.4.0. + */ + CONTENT, + /** + * Combine timestamp and content change detection for existing file. + */ + TIMESTAMP_AND_CONTENT, + /** + * Disable change detection; always overwrite existing file. + */ + ALWAYS, + /** + * Disable change detection; never overwrite existing file. + */ + NEVER; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java --- old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/DefaultMavenFileFilter.java 2026-03-02 11:11:22.000000000 +0100 @@ -45,6 +45,7 @@ this.buildContext = requireNonNull(buildContext); } + @Deprecated @Override public void copyFile( File from, @@ -56,15 +57,40 @@ String encoding, MavenSession mavenSession) throws MavenFilteringException { + copyFile( + from, + to, + filtering, + mavenProject, + filters, + escapedBackslashesInFilePath, + encoding, + mavenSession, + ChangeDetection.CONTENT); + } + + @Override + public void copyFile( + File from, + File to, + boolean filtering, + MavenProject mavenProject, + List<String> filters, + boolean escapedBackslashesInFilePath, + String encoding, + MavenSession mavenSession, + ChangeDetection changeDetection) + throws MavenFilteringException { MavenResourcesExecution mre = new MavenResourcesExecution(); mre.setMavenProject(mavenProject); mre.setFileFilters(filters); mre.setEscapeWindowsPaths(escapedBackslashesInFilePath); mre.setMavenSession(mavenSession); mre.setInjectProjectBuildFilters(true); + mre.setChangeDetection(changeDetection); List<FilterWrapper> filterWrappers = getDefaultFilterWrappers(mre); - copyFile(from, to, filtering, filterWrappers, encoding); + copyFile(from, to, filtering, filterWrappers, encoding, changeDetection); } @Override @@ -76,24 +102,57 @@ mavenFileFilterRequest.getTo(), mavenFileFilterRequest.isFiltering(), filterWrappers, - mavenFileFilterRequest.getEncoding()); + mavenFileFilterRequest.getEncoding(), + mavenFileFilterRequest.getChangeDetection()); } + @Deprecated @Override public void copyFile(File from, File to, boolean filtering, List<FilterWrapper> filterWrappers, String encoding) throws MavenFilteringException { + copyFile(from, to, filtering, filterWrappers, encoding, ChangeDetection.CONTENT); + } + + @Override + @Deprecated + public void copyFile( + File from, + File to, + boolean filtering, + List<FilterWrapper> filterWrappers, + String encoding, + boolean overwrite) + throws MavenFilteringException { + copyFile( + from, + to, + filtering, + filterWrappers, + encoding, + overwrite ? ChangeDetection.ALWAYS : ChangeDetection.CONTENT); + } + + @Override + public void copyFile( + File from, + File to, + boolean filtering, + List<FilterWrapper> filterWrappers, + String encoding, + ChangeDetection changeDetection) + throws MavenFilteringException { try { if (filtering) { if (getLogger().isDebugEnabled()) { getLogger().debug("filtering " + from.getPath() + " to " + to.getPath()); } FilterWrapper[] array = filterWrappers.toArray(new FilterWrapper[0]); - FilteringUtils.copyFile(from, to, encoding, array, false); + FilteringUtils.copyFile(from, to, encoding, array, changeDetection); } else { if (getLogger().isDebugEnabled()) { getLogger().debug("copy " + from.getPath() + " to " + to.getPath()); } - FilteringUtils.copyFile(from, to, encoding, new FilterWrapper[0], false); + FilteringUtils.copyFile(from, to, encoding, new FilterWrapper[0], changeDetection); } buildContext.refresh(to); @@ -104,18 +163,4 @@ e); } } - - @Override - @Deprecated - public void copyFile( - File from, - File to, - boolean filtering, - List<FilterWrapper> filterWrappers, - String encoding, - boolean overwrite) - throws MavenFilteringException { - // overwrite forced to false to preserve backward comp - copyFile(from, to, filtering, filterWrappers, encoding); - } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java --- old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java 2026-03-02 11:11:22.000000000 +0100 @@ -27,19 +27,21 @@ import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; +import java.nio.file.FileSystems; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; +import java.util.Iterator; import java.util.List; import java.util.Locale; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.maven.model.Resource; import org.codehaus.plexus.util.DirectoryScanner; +import org.codehaus.plexus.util.FileUtils; +import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.Scanner; +import org.codehaus.plexus.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonatype.plexus.build.incremental.BuildContext; @@ -93,7 +95,7 @@ } private static String getExtension(String fileName) { - String rawExt = FilenameUtils.getExtension(fileName); + String rawExt = FileUtils.getExtension(fileName); return rawExt == null ? null : rawExt.toLowerCase(Locale.ROOT); } @@ -280,7 +282,7 @@ File destinationFile = getDestinationFile(outputDirectory, targetPath, name, mavenResourcesExecution); if (mavenResourcesExecution.isFlatten() && destinationFile.exists()) { - if (mavenResourcesExecution.isOverwrite()) { + if (mavenResourcesExecution.getChangeDetection() == ChangeDetection.ALWAYS) { LOGGER.warn("existing file " + destinationFile.getName() + " will be overwritten by " + name); } else { throw new MavenFilteringException("existing file " + destinationFile.getName() @@ -303,7 +305,7 @@ resource.isFiltering() && filteredExt, mavenResourcesExecution.getFilterWrappers(), encoding, - mavenResourcesExecution.isOverwrite()); + mavenResourcesExecution.getChangeDetection()); } // deal with deleted source files @@ -501,21 +503,33 @@ */ private String filterFileName(String name, List<FilterWrapper> wrappers) throws MavenFilteringException { - Reader reader = new StringReader(name); - for (FilterWrapper wrapper : wrappers) { - reader = wrapper.getReader(reader); - } - - try (StringWriter writer = new StringWriter()) { - IOUtils.copy(reader, writer); - String filteredFilename = writer.toString(); + StringBuilder sb = new StringBuilder(); + Path path = Paths.get(name); + Iterator<Path> iterator = path.iterator(); + while (iterator.hasNext()) { + String component = iterator.next().toString(); + Reader reader = new StringReader(component); + for (FilterWrapper wrapper : wrappers) { + reader = wrapper.getReader(reader); + } + + try (StringWriter writer = new StringWriter()) { + IOUtil.copy(reader, writer); + String filteredComponent = writer.toString(); + sb.append(filteredComponent); + if (iterator.hasNext()) { + sb.append(FileSystems.getDefault().getSeparator()); + } - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("renaming filename " + name + " to " + filteredFilename); + } catch (IOException e) { + throw new MavenFilteringException("Failed filtering filename" + name, e); } - return filteredFilename; - } catch (IOException e) { - throw new MavenFilteringException("Failed filtering filename" + name, e); } + String filteredFilename = sb.toString(); + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("renaming filename " + name + " to " + filteredFilename); + } + return filteredFilename; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java --- old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/FilteringUtils.java 2026-03-02 11:11:22.000000000 +0100 @@ -24,6 +24,7 @@ import java.io.Reader; import java.io.Writer; import java.nio.charset.Charset; +import java.nio.file.FileSystemException; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.attribute.PosixFilePermission; @@ -31,7 +32,6 @@ import java.util.StringTokenizer; import java.util.regex.Pattern; -import org.apache.commons.lang3.SystemUtils; import org.codehaus.plexus.util.io.CachingOutputStream; import org.codehaus.plexus.util.io.CachingWriter; @@ -41,6 +41,12 @@ */ public final class FilteringUtils { /** + * Logic borrowed from Commons-Lang3: we really need only this, to decide is it Windows. + * It is nonsense to import whole commons-lang3 just for this test. + */ + private static final boolean IS_WINDOWS = + System.getProperty("os.name", "unknown").startsWith("Windows"); + /** * The number of bytes in a kilobyte. */ private static final int ONE_KB = 1024; @@ -114,7 +120,7 @@ } // deal with absolute files - if (filenm.startsWith(File.separator) || (SystemUtils.IS_OS_WINDOWS && filenm.indexOf(":") > 0)) { + if (filenm.startsWith(File.separator) || (IS_WINDOWS && filenm.indexOf(":") > 0)) { File file = new File(filenm); try { @@ -305,12 +311,67 @@ * @param encoding the file output encoding (only if wrappers is not empty) * @param wrappers array of {@link FilterWrapper} * @throws IOException if an IO error occurs during copying or filtering + * @deprecated Use {@link #copyFile(File, File, String, FilterWrapper[], ChangeDetection)} instead. */ + @Deprecated public static void copyFile(File from, File to, String encoding, FilterWrapper[] wrappers) throws IOException { - setReadWritePermissions(to); + copyFile(from, to, encoding, wrappers, ChangeDetection.CONTENT); + } + + /** + * Copies a file from the source to the destination, applying the specified filters if provided. + * + * @param from the file to copy + * @param to the destination file + * @param encoding the file output encoding (only if wrappers is not empty) + * @param wrappers array of {@link FilterWrapper} + * @param changeDetection the strategy to apply if to is existing file + * @throws IOException if an IO error occurs during copying or filtering + * @return {@code true} if the file was copied. + */ + public static boolean copyFile( + File from, File to, String encoding, FilterWrapper[] wrappers, ChangeDetection changeDetection) + throws IOException { + boolean needsCopy = false; + boolean unconditionally = false; + switch (changeDetection) { + case NEVER: + needsCopy = !to.isFile(); + unconditionally = true; + break; + case ALWAYS: + needsCopy = true; + unconditionally = true; + break; + case TIMESTAMP: + needsCopy = to.lastModified() < from.lastModified(); + unconditionally = true; + break; + case CONTENT: + needsCopy = true; + break; + case TIMESTAMP_AND_CONTENT: + needsCopy = to.lastModified() < from.lastModified(); + break; + default: + throw new IllegalArgumentException("Unsupported change detection mode: " + changeDetection); + } + boolean copied = false; + if (needsCopy) { + if (unconditionally) { + copied = copyUnconditionally(from, to, encoding, wrappers); + } else { + copied = copyIfContentsChanged(from, to, encoding, wrappers); + } + } + return copied; + } + private static boolean copyUnconditionally(File from, File to, String encoding, FilterWrapper[] wrappers) + throws IOException { + setReadWritePermissions(to); if (wrappers == null || wrappers.length == 0) { - try (OutputStream os = new CachingOutputStream(to.toPath())) { + try (OutputStream os = Files.newOutputStream(to.toPath())) { Files.copy(from.toPath(), os); } } else { @@ -320,7 +381,7 @@ for (FilterWrapper wrapper : wrappers) { wrapped = wrapper.getReader(wrapped); } - try (Writer writer = new CachingWriter(to.toPath(), charset)) { + try (Writer writer = Files.newBufferedWriter(to.toPath(), charset)) { char[] buffer = new char[COPY_BUFFER_LENGTH]; int nRead; while ((nRead = wrapped.read(buffer, 0, COPY_BUFFER_LENGTH)) >= 0) { @@ -329,8 +390,38 @@ } } } + copyFilePermissions(from, to); + return true; + } + private static boolean copyIfContentsChanged(File from, File to, String encoding, FilterWrapper[] wrappers) + throws IOException { + setReadWritePermissions(to); + boolean copied = false; + if (wrappers == null || wrappers.length == 0) { + try (CachingOutputStream os = new CachingOutputStream(to.toPath())) { + Files.copy(from.toPath(), os); + copied = os.isModified(); + } + } else { + Charset charset = charset(encoding); + try (Reader fileReader = Files.newBufferedReader(from.toPath(), charset)) { + Reader wrapped = fileReader; + for (FilterWrapper wrapper : wrappers) { + wrapped = wrapper.getReader(wrapped); + } + try (CachingWriter writer = new CachingWriter(to.toPath(), charset)) { + char[] buffer = new char[COPY_BUFFER_LENGTH]; + int nRead; + while ((nRead = wrapped.read(buffer, 0, COPY_BUFFER_LENGTH)) >= 0) { + writer.write(buffer, 0, nRead); + } + copied = writer.isModified(); + } + } + } copyFilePermissions(from, to); + return copied; } /** @@ -343,12 +434,12 @@ * @param wrappers array of {@link FilterWrapper} * @param overwrite unused * @throws IOException if an IO error occurs during copying or filtering - * @deprecated use {@link #copyFile(File, File, String, FilterWrapper[])} instead + * @deprecated use {@link #copyFile(File, File, String, FilterWrapper[], ChangeDetection)} instead */ @Deprecated public static void copyFile(File from, File to, String encoding, FilterWrapper[] wrappers, boolean overwrite) throws IOException { - copyFile(from, to, encoding, wrappers); + copyFile(from, to, encoding, wrappers, overwrite ? ChangeDetection.ALWAYS : ChangeDetection.CONTENT); } /** @@ -367,7 +458,7 @@ Files.setPosixFilePermissions(destination.toPath(), Files.getPosixFilePermissions(source.toPath())); } catch (NoSuchFileException nsfe) { // ignore if destination file or symlink does not exist - } catch (UnsupportedOperationException e) { + } catch (UnsupportedOperationException | FileSystemException e) { // fallback to setting partial permissions destination.setExecutable(source.canExecute()); destination.setReadable(source.canRead()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java --- old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/MavenFileFilter.java 2026-03-02 11:11:22.000000000 +0100 @@ -42,6 +42,7 @@ * @param encoding The encoding which is used during the filtering process. * @throws MavenFilteringException in case of failure. * @see DefaultFilterInfo#getDefaultFilterWrappers(MavenProject, List, boolean,MavenSession, MavenResourcesExecution) + * @deprecated Use {@link #copyFile(File, File, boolean, MavenProject, List, boolean, String, MavenSession, ChangeDetection)} instead. */ void copyFile( File from, @@ -55,6 +56,33 @@ throws MavenFilteringException; /** + * Will copy a file with some filtering using defaultFilterWrappers. + * + * @param from file to copy/filter + * @param to destination file + * @param filtering enable or not filtering + * @param mavenProject {@link MavenProject} + * @param mavenSession {@link MavenSession} + * @param escapedBackslashesInFilePath escape backslashes in file path. + * @param filters {@link List} of String which are path to a Property file + * @param encoding The encoding which is used during the filtering process. + * @throws MavenFilteringException in case of failure. + * @see DefaultFilterInfo#getDefaultFilterWrappers(MavenProject, List, boolean,MavenSession, MavenResourcesExecution) + * @since 3.5.0 + */ + void copyFile( + File from, + File to, + boolean filtering, + MavenProject mavenProject, + List<String> filters, + boolean escapedBackslashesInFilePath, + String encoding, + MavenSession mavenSession, + ChangeDetection changeDetection) + throws MavenFilteringException; + + /** * @param mavenFileFilterRequest the request * @throws MavenFilteringException in case of failure. * @since 1.0-beta-3 @@ -68,7 +96,9 @@ * @param filterWrappers {@link List} of FileUtils.FilterWrapper * @param encoding The encoding used during the filtering. * @throws MavenFilteringException In case of an error. + * @deprecated use {@link #copyFile(File, File, boolean, List, String, ChangeDetection)} instead */ + @Deprecated void copyFile(File from, File to, boolean filtering, List<FilterWrapper> filterWrappers, String encoding) throws MavenFilteringException; @@ -81,7 +111,7 @@ * @param overwrite unused * @throws MavenFilteringException In case of an error. * @since 1.0-beta-2 - * @deprecated use {@link #copyFile(File, File, boolean, List, String)} instead + * @deprecated use {@link #copyFile(File, File, boolean, List, String, ChangeDetection)} instead */ @Deprecated void copyFile( @@ -92,4 +122,23 @@ String encoding, boolean overwrite) throws MavenFilteringException; + + /** + * @param from The source file + * @param to The destination file + * @param filtering true to apply filtering + * @param filterWrappers The filters to be applied. + * @param encoding The encoding to use + * @param changeDetection The change detection mode to use to determine if the file should be copied/filtered. + * @throws MavenFilteringException In case of an error. + * @since 3.5.0 + */ + void copyFile( + File from, + File to, + boolean filtering, + List<FilterWrapper> filterWrappers, + String encoding, + ChangeDetection changeDetection) + throws MavenFilteringException; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java --- old/maven-filtering-3.4.0/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/main/java/org/apache/maven/shared/filtering/MavenResourcesExecution.java 2026-03-02 11:11:22.000000000 +0100 @@ -87,13 +87,6 @@ private boolean addDefaultExcludes = true; /** - * Overwrite existing files even if the destination files are newer. <code>false</code> by default. - * - * @since 1.0-beta-2 - */ - private boolean overwrite = false; - - /** * Copy any empty directories included in the Resources. * * @since 1.0-beta-2 @@ -352,11 +345,13 @@ /** * Overwrite existing files even if the destination files are newer. * - * @return {@link #overwrite} + * @return {@code true} if operation always overwrites. * @since 1.0-beta-2 + * @deprecated Use #getChangeDetection() instead. */ + @Deprecated public boolean isOverwrite() { - return overwrite; + return getChangeDetection() == ChangeDetection.ALWAYS; } /** @@ -364,9 +359,11 @@ * * @param overwrite overwrite true or false. * @since 1.0-beta-2 + * @deprecated Use #setChangeDetection(ChangeDetection) instead. */ + @Deprecated public void setOverwrite(boolean overwrite) { - this.overwrite = overwrite; + setChangeDetection(overwrite ? ChangeDetection.ALWAYS : ChangeDetection.CONTENT); } /** @@ -440,7 +437,7 @@ mre.setMavenSession(this.getMavenSession()); mre.setNonFilteredFileExtensions(copyList(this.getNonFilteredFileExtensions())); mre.setOutputDirectory(this.getOutputDirectory()); - mre.setOverwrite(this.isOverwrite()); + mre.setChangeDetection(this.getChangeDetection()); mre.setProjectStartExpressions(copyList(this.getProjectStartExpressions())); mre.setResources(copyList(this.getResources())); mre.setResourcesBaseDirectory(this.getResourcesBaseDirectory()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/site/site.xml new/maven-filtering-3.5.0/src/site/site.xml --- old/maven-filtering-3.4.0/src/site/site.xml 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/site/site.xml 2026-03-02 11:11:22.000000000 +0100 @@ -19,7 +19,8 @@ under the License. --> -<project xmlns="http://maven.apache.org/DECORATION/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd"> +<site xmlns="http://maven.apache.org/SITE/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/SITE/2.0.0 https://maven.apache.org/xsd/site-2.0.0.xsd"> <body> <menu name="Overview"> <item name="Introduction" href="index.html"/> @@ -32,4 +33,4 @@ <item name="Download" href="download.html"/> </menu> </body> -</project> +</site> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/AbstractInterpolatorFilterReaderLineEndingTest.java new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/AbstractInterpolatorFilterReaderLineEndingTest.java --- old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/AbstractInterpolatorFilterReaderLineEndingTest.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/AbstractInterpolatorFilterReaderLineEndingTest.java 2026-03-02 11:11:22.000000000 +0100 @@ -18,7 +18,6 @@ */ package org.apache.maven.shared.filtering; -import java.io.IOException; import java.io.Reader; import java.io.StringReader; @@ -96,26 +95,26 @@ .thenReturn("DONE"); Reader in = new StringReader("aaaFILTER.a.MEaaa"); - Reader reader = getAaa_AaaReader(in, interpolator); + Reader reader = getAaaAaaReader(in, interpolator); assertEquals("DONE", IOUtils.toString(reader)); in = new StringReader("abcFILTER.a.MEabc"); - reader = getAbc_AbcReader(in, interpolator); + reader = getAbcAbcReader(in, interpolator); assertEquals("DONE", IOUtils.toString(reader)); } // MSHARED-235: reader exceeds readAheadLimit @Test - void markInvalid() throws IOException { + void markInvalid() throws Exception { try (Reader reader = getAtReader(new StringReader("@\").replace(p,\"]\").replace(q,\""), interpolator, "\\")) { assertEquals("@\").replace(p,\"]\").replace(q,\"", IOUtils.toString(reader)); } } - protected abstract Reader getAbc_AbcReader(Reader in, Interpolator interpolator); + protected abstract Reader getAbcAbcReader(Reader in, Interpolator interpolator); - protected abstract Reader getAaa_AaaReader(Reader in, Interpolator interpolator); + protected abstract Reader getAaaAaaReader(Reader in, Interpolator interpolator); protected abstract Reader getDollarBracesReader(Reader in, Interpolator interpolator, String escapeString); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/BoundedReaderTest.java new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/BoundedReaderTest.java --- old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/BoundedReaderTest.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/BoundedReaderTest.java 2026-03-02 11:11:22.000000000 +0100 @@ -19,7 +19,6 @@ package org.apache.maven.shared.filtering; import java.io.BufferedReader; -import java.io.IOException; import java.io.Reader; import java.io.StringReader; @@ -32,7 +31,7 @@ private final Reader sr = new BufferedReader(new StringReader("01234567890")); @Test - void readTillEnd() throws IOException { + void readTillEnd() throws Exception { try (BoundedReader mr = new BoundedReader(sr, 3)) { mr.mark(3); mr.read(); @@ -43,7 +42,7 @@ } @Test - void readMulti() throws IOException { + void readMulti() throws Exception { char[] cbuf = new char[4]; for (int i = 0; i < cbuf.length; i++) { cbuf[i] = 'X'; @@ -61,7 +60,7 @@ } @Test - void readMultiWithOffset() throws IOException { + void readMultiWithOffset() throws Exception { char[] cbuf = new char[4]; for (int i = 0; i < cbuf.length; i++) { @@ -80,7 +79,7 @@ } @Test - void resetWorks() throws IOException { + void resetWorks() throws Exception { try (BoundedReader mr = new BoundedReader(sr, 3)) { mr.read(); mr.read(); @@ -94,7 +93,7 @@ } @Test - void skipTest() throws IOException { + void skipTest() throws Exception { try (BoundedReader mr = new BoundedReader(sr, 3)) { mr.skip(2); mr.read(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java --- old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/DefaultMavenFileFilterTest.java 2026-03-02 11:11:22.000000000 +0100 @@ -21,7 +21,6 @@ import javax.inject.Inject; import java.io.File; -import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.nio.file.Files; @@ -158,7 +157,7 @@ } @Test - void testInterpolatorCustomizer() throws MavenFilteringException, IOException { + void interpolatorCustomizer() throws Exception { AbstractMavenFilteringRequest req = new AbstractMavenFilteringRequest(); req.setInterpolatorCustomizer(i -> { i.addValueSource(new AbstractValueSource(false) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java --- old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java 2026-03-02 11:11:22.000000000 +0100 @@ -23,6 +23,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; @@ -991,7 +992,7 @@ Resource resource = new Resource(); resource.setDirectory(unitFilesDir); resource.setFiltering(true); - resource.addInclude("${pom.version}*"); + resource.addInclude("**/${pom.version}*"); resource.setTargetPath("testTargetPath"); MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( @@ -1009,6 +1010,49 @@ File[] files = targetPathFile.listFiles(); assertEquals(1, files.length); + assertEquals("subfolder", files[0].getName()); + assertTrue(files[0].isDirectory()); + + files = files[0].listFiles(); + assertEquals(1, files.length); + assertEquals("1.0.txt", files[0].getName()); + } + + @Test + void filterFileNameWithFileSeparatorAsEscape() throws Exception { + + String unitFilesDir = getBasedir() + "/src/test/units-files/maven-filename-filtering"; + + Resource resource = new Resource(); + resource.setDirectory(unitFilesDir); + resource.setFiltering(true); + resource.addInclude("**/${pom.version}*"); + resource.setTargetPath("testTargetPath"); + + MavenResourcesExecution mavenResourcesExecution = new MavenResourcesExecution( + Collections.singletonList(resource), + outputDirectory, + mavenProject, + "UTF-8", + Collections.<String>emptyList(), + Collections.<String>emptyList(), + new StubMavenSession()); + mavenResourcesExecution.setFilterFilenames(true); + + // more likely to occur on windows, where the file + // separator is the same as the common escape string "\" + mavenResourcesExecution.setEscapeString(FileSystems.getDefault().getSeparator()); + mavenResourcesFiltering.filterResources(mavenResourcesExecution); + + File targetPathFile = new File(outputDirectory, "testTargetPath"); + + File[] files = targetPathFile.listFiles(); + assertEquals(1, files.length); + assertEquals("subfolder", files[0].getName()); + assertTrue(files[0].isDirectory()); + + files = files[0].listFiles(); + assertEquals(1, files.length); assertEquals("1.0.txt", files[0].getName()); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/InterpolatorFilterReaderLineEndingTest.java new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/InterpolatorFilterReaderLineEndingTest.java --- old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/InterpolatorFilterReaderLineEndingTest.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/InterpolatorFilterReaderLineEndingTest.java 2026-03-02 11:11:22.000000000 +0100 @@ -24,12 +24,12 @@ public class InterpolatorFilterReaderLineEndingTest extends AbstractInterpolatorFilterReaderLineEndingTest { @Override - protected Reader getAaa_AaaReader(Reader in, Interpolator interpolator) { + protected Reader getAaaAaaReader(Reader in, Interpolator interpolator) { return new InterpolatorFilterReaderLineEnding(in, interpolator, "aaa", "aaa", true); } @Override - protected Reader getAbc_AbcReader(Reader in, Interpolator interpolator) { + protected Reader getAbcAbcReader(Reader in, Interpolator interpolator) { return new InterpolatorFilterReaderLineEnding(in, interpolator, "abc", "abc", true); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java --- old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/MultiDelimiterInterpolatorFilterReaderLineEndingTest.java 2026-03-02 11:11:22.000000000 +0100 @@ -49,7 +49,7 @@ } @Override - protected Reader getAaa_AaaReader(Reader in, Interpolator interpolator) { + protected Reader getAaaAaaReader(Reader in, Interpolator interpolator) { MultiDelimiterInterpolatorFilterReaderLineEnding reader = new MultiDelimiterInterpolatorFilterReaderLineEnding(in, interpolator, true); reader.setDelimiterSpecs(Collections.singleton("aaa*aaa")); @@ -57,7 +57,7 @@ } @Override - protected Reader getAbc_AbcReader(Reader in, Interpolator interpolator) { + protected Reader getAbcAbcReader(Reader in, Interpolator interpolator) { MultiDelimiterInterpolatorFilterReaderLineEnding reader = new MultiDelimiterInterpolatorFilterReaderLineEnding(in, interpolator, true); reader.setDelimiterSpecs(Collections.singleton("abc*abc")); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java --- old/maven-filtering-3.4.0/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/test/java/org/apache/maven/shared/filtering/PropertyUtilsTest.java 2026-03-02 11:11:22.000000000 +0100 @@ -29,7 +29,9 @@ import org.junit.jupiter.api.Test; import static org.codehaus.plexus.testing.PlexusExtension.getBasedir; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.fail; /** * @author Olivier Lamy @@ -102,7 +104,7 @@ * @throws IOException if problem writing file */ @Test - void circularReferences() throws IOException { + void circularReferences() throws Exception { File circularProperties = File.createTempFile("circular", ".properties"); circularProperties.deleteOnExit(); @@ -123,7 +125,7 @@ * @throws IOException if problem writing file */ @Test - void circularReferences3Vars() throws IOException { + void circularReferences3Vars() throws Exception { File circularProperties = File.createTempFile("circular", ".properties"); circularProperties.deleteOnExit(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/units-files/includeEmptyDirs/empty-directory/.gitignore new/maven-filtering-3.5.0/src/test/units-files/includeEmptyDirs/empty-directory/.gitignore --- old/maven-filtering-3.4.0/src/test/units-files/includeEmptyDirs/empty-directory/.gitignore 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/test/units-files/includeEmptyDirs/empty-directory/.gitignore 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -# just here to make the directory non-empty diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/units-files/includeEmptyDirs/empty-directory-child/empty-child/.gitignore new/maven-filtering-3.5.0/src/test/units-files/includeEmptyDirs/empty-directory-child/empty-child/.gitignore --- old/maven-filtering-3.4.0/src/test/units-files/includeEmptyDirs/empty-directory-child/empty-child/.gitignore 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/test/units-files/includeEmptyDirs/empty-directory-child/empty-child/.gitignore 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -# just here to make the directory non-empty diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/units-files/maven-filename-filtering/${pom.version}.txt new/maven-filtering-3.5.0/src/test/units-files/maven-filename-filtering/${pom.version}.txt --- old/maven-filtering-3.4.0/src/test/units-files/maven-filename-filtering/${pom.version}.txt 2024-08-28 15:27:34.000000000 +0200 +++ new/maven-filtering-3.5.0/src/test/units-files/maven-filename-filtering/${pom.version}.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,16 +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. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-filtering-3.4.0/src/test/units-files/maven-filename-filtering/subfolder/${pom.version}.txt new/maven-filtering-3.5.0/src/test/units-files/maven-filename-filtering/subfolder/${pom.version}.txt --- old/maven-filtering-3.4.0/src/test/units-files/maven-filename-filtering/subfolder/${pom.version}.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/maven-filtering-3.5.0/src/test/units-files/maven-filename-filtering/subfolder/${pom.version}.txt 2026-03-02 11:11:22.000000000 +0100 @@ -0,0 +1,16 @@ +# 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. ++++++ maven-filtering-build.xml ++++++ --- /var/tmp/diff_new_pack.jhHLAB/_old 2026-03-05 17:33:40.088724362 +0100 +++ /var/tmp/diff_new_pack.jhHLAB/_new 2026-03-05 17:33:40.096724694 +0100 @@ -10,11 +10,11 @@ <property name="project.groupId" value="org.apache.maven.shared"/> <property name="project.artifactId" value="maven-filtering"/> - <property name="project.version" value="3.4.0"/> + <property name="project.version" value="3.5.0"/> <property name="project.name" value="Apache Maven Filtering"/> <property name="project.organization.name" value="The Apache Software Foundation"/> - <property name="spec.version" value="3.4"/> + <property name="spec.version" value="3.5"/> <property name="compiler.release" value="8"/> <property name="compiler.source" value="1.${compiler.release}"/>
