Index: src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java =================================================================== --- src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java (revision 1067414) +++ src/main/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhase.java (working copy) @@ -19,6 +19,13 @@ * under the License. */ +import java.io.File; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + import org.apache.commons.lang.StringUtils; import org.apache.maven.project.MavenProject; import org.apache.maven.scm.ScmException; @@ -37,13 +44,7 @@ import org.apache.maven.shared.release.scm.ReleaseScmCommandException; import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException; import org.apache.maven.shared.release.scm.ScmRepositoryConfigurator; - -import java.io.File; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; +import org.codehaus.plexus.util.DirectoryScanner; /** * See if there are any local modifications to the files before proceeding with SCM operations and the release. @@ -66,8 +67,13 @@ * * @todo proper construction of filenames, especially release properties */ - private Set excludedFiles = new HashSet( Arrays.asList( new String[] { "pom.xml.backup", "pom.xml.tag", - "pom.xml.next", "pom.xml.branch", "release.properties", "pom.xml.releaseBackup" } ) ); + private Set exclusionPatterns = new HashSet(Arrays.asList(new String[] { + "**/pom.xml.backup", + "**/pom.xml.tag", + "**/pom.xml.next", + "**/pom.xml.branch", + "**/release.properties", + "**/pom.xml.releaseBackup"})); public ReleaseResult execute( ReleaseDescriptor releaseDescriptor, ReleaseEnvironment releaseEnvironment, List reactorProjects ) throws ReleaseExecutionException, ReleaseFailureException @@ -78,14 +84,13 @@ if ( additionalExcludes != null ) { - for ( int i1 = 0, additionalExcludesSize = additionalExcludes.size(); i1 < additionalExcludesSize; i1++ ) - { - // fail fast if it is not a string - String exclude = (String) additionalExcludes.get( i1 ); - excludedFiles.add( exclude ); + for (String additionalExclude : additionalExcludes) { + exclusionPatterns.add(additionalExclude); } } - + + Set excludedFiles = getExcludedFiles(releaseDescriptor, exclusionPatterns); + logInfo( relResult, "Verifying that there are no local modifications..." ); logInfo( relResult, " ignoring changes on: " + StringUtils.join(excludedFiles, ", ")); @@ -131,10 +136,9 @@ { ScmFile f = i.next(); - String fileName = f.getPath().replace( '\\', '/' ); - fileName = fileName.substring( fileName.lastIndexOf( '/' ) + 1, fileName.length() ); + String path = f.getPath(); - if ( excludedFiles.contains( fileName ) ) + if ( excludedFiles.contains( path ) ) { i.remove(); } @@ -168,4 +172,12 @@ // It makes no modifications, so simulate is the same as execute return execute( releaseDescriptor, releaseEnvironment, reactorProjects ); } + + protected Set getExcludedFiles(ReleaseDescriptor releaseDescriptor, Set exclusionPatterns) { + DirectoryScanner dirScanner = new DirectoryScanner(); + dirScanner.setBasedir(releaseDescriptor.getWorkingDirectory()); + dirScanner.setExcludes(exclusionPatterns.toArray(new String[exclusionPatterns.size()])); + dirScanner.scan(); + return new HashSet(Arrays.asList(dirScanner.getExcludedFiles())); + } } Index: src/test/java/org/apache/maven/shared/release/phase/MockScmCheckModificationsPhase.java =================================================================== --- src/test/java/org/apache/maven/shared/release/phase/MockScmCheckModificationsPhase.java (revision 0) +++ src/test/java/org/apache/maven/shared/release/phase/MockScmCheckModificationsPhase.java (revision 0) @@ -0,0 +1,48 @@ +/* + * Copyright 2010 Stefan Ferstl + * + * Licensed 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.release.phase; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.apache.maven.shared.release.config.ReleaseDescriptor; + +/** + * See if there are any local modifications to the files before proceeding with SCM operations and the release. + * + * @plexus.component role="org.apache.maven.shared.release.phase.ReleasePhase" role-hint="scm-check-modifications" + */ +public class MockScmCheckModificationsPhase extends ScmCheckModificationsPhase { + + private Set excludedFiles; + + public MockScmCheckModificationsPhase() { + excludedFiles = new HashSet(); + } + + public void setExcludedFiles(String... files) { + excludedFiles.clear(); + excludedFiles.addAll(Arrays.asList(files)); + } + + /** {@inheritDoc} */ + @Override + protected Set getExcludedFiles(ReleaseDescriptor releaseDescriptor, Set exclusionPatterns) { + return Collections.unmodifiableSet(excludedFiles); + } +} Index: src/test/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhaseTest.java =================================================================== --- src/test/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhaseTest.java (revision 1067414) +++ src/test/java/org/apache/maven/shared/release/phase/ScmCheckModificationsPhaseTest.java (working copy) @@ -236,9 +236,12 @@ { ReleaseDescriptor releaseDescriptor = createReleaseDescriptor(); - setChangedFiles( releaseDescriptor, Arrays.asList( new String[] { "release.properties", "pom.xml.backup", - "pom.xml.tag", "pom.xml.next" } ) ); + String[] files = new String[] { "release.properties", "pom.xml.backup", + "pom.xml.tag", "pom.xml.next" }; + setChangedFiles( releaseDescriptor, Arrays.asList( files ) ); + setExcludedFiles( files ); + phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), null ); phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), null ); @@ -347,6 +350,12 @@ providerStub.setStatusScmResult( new StatusScmResult( "", createScmFiles( changedFiles ) ) ); } + + private void setExcludedFiles(String... files) throws Exception { + MockScmCheckModificationsPhase scmCheckModificationsPhase = + (MockScmCheckModificationsPhase) lookup(ReleasePhase.ROLE, "scm-check-modifications"); + scmCheckModificationsPhase.setExcludedFiles(files); + } private static List createScmFiles( List changedFiles ) { Index: src/test/resources/org/apache/maven/shared/release/phase/ScmCheckModificationsPhaseTest.xml =================================================================== --- src/test/resources/org/apache/maven/shared/release/phase/ScmCheckModificationsPhaseTest.xml (revision 1067414) +++ src/test/resources/org/apache/maven/shared/release/phase/ScmCheckModificationsPhaseTest.xml (working copy) @@ -23,6 +23,16 @@ org.apache.maven.scm.manager.ScmManager org.apache.maven.scm.manager.ScmManagerStub + + org.apache.maven.shared.release.phase.ReleasePhase + scm-check-modifications + org.apache.maven.shared.release.phase.MockScmCheckModificationsPhase + + + org.apache.maven.shared.release.scm.ScmRepositoryConfigurator + + + org.codehaus.plexus.logging.LoggerManager