Skip to content

Commit 6d9e5e7

Browse files
authored
[MRELEASE-1054] Support for excluding submodules changes. (#196)
* [MRELEASE-1054] Support for excluding submodules changes. * [MRELEASE-1054] Add some unit test cases.
1 parent 5ed2bcc commit 6d9e5e7

File tree

12 files changed

+409
-23
lines changed

12 files changed

+409
-23
lines changed

maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractMapVersionsPhase.java

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,12 @@
1818
*/
1919
package org.apache.maven.shared.release.phase;
2020

21+
import java.nio.file.FileSystems;
22+
import java.nio.file.Paths;
23+
import java.util.HashSet;
2124
import java.util.List;
2225
import java.util.Map;
26+
import java.util.Set;
2327

2428
import org.apache.maven.artifact.ArtifactUtils;
2529
import org.apache.maven.project.MavenProject;
@@ -97,6 +101,8 @@ public abstract class AbstractMapVersionsPhase extends AbstractReleasePhase {
97101
*/
98102
private final boolean convertToBranch;
99103

104+
private final Set<String> exclusionPatterns = new HashSet<>();
105+
100106
public AbstractMapVersionsPhase(
101107
ScmRepositoryConfigurator scmRepositoryConfigurator,
102108
Prompter prompter,
@@ -118,6 +124,12 @@ public ReleaseResult execute(
118124
throws ReleaseExecutionException {
119125
ReleaseResult result = new ReleaseResult();
120126

127+
List<String> additionalExcludes = releaseDescriptor.getCheckModificationExcludes();
128+
129+
if (additionalExcludes != null) {
130+
exclusionPatterns.addAll(additionalExcludes);
131+
}
132+
121133
MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
122134

123135
if (releaseDescriptor.isAutoVersionSubmodules() && ArtifactUtils.isSnapshot(rootProject.getVersion())) {
@@ -165,17 +177,26 @@ public ReleaseResult execute(
165177
}
166178
}
167179
} else {
180+
168181
for (MavenProject project : reactorProjects) {
169182
String projectId = ArtifactUtils.versionlessKey(project.getGroupId(), project.getArtifactId());
170183

171-
String nextVersion = resolveNextVersion(project, projectId, releaseDescriptor, releaseEnvironment);
172-
173-
if (!convertToSnapshot) {
174-
releaseDescriptor.addReleaseVersion(projectId, nextVersion);
175-
} else if (releaseDescriptor.isBranchCreation() && convertToBranch) {
176-
releaseDescriptor.addReleaseVersion(projectId, nextVersion);
177-
} else {
178-
releaseDescriptor.addDevelopmentVersion(projectId, nextVersion);
184+
boolean isExcludedPathFound = false;
185+
if (project.getFile() != null) {
186+
isExcludedPathFound = exclusionPatterns.stream()
187+
.anyMatch(exclusionPattern -> FileSystems.getDefault()
188+
.getPathMatcher("glob:" + exclusionPattern)
189+
.matches(Paths.get(project.getFile().getPath())));
190+
}
191+
if (!isExcludedPathFound) {
192+
String nextVersion = resolveNextVersion(project, projectId, releaseDescriptor, releaseEnvironment);
193+
if (!convertToSnapshot) {
194+
releaseDescriptor.addReleaseVersion(projectId, nextVersion);
195+
} else if (releaseDescriptor.isBranchCreation() && convertToBranch) {
196+
releaseDescriptor.addReleaseVersion(projectId, nextVersion);
197+
} else {
198+
releaseDescriptor.addDevelopmentVersion(projectId, nextVersion);
199+
}
179200
}
180201
}
181202
}

maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractRewritePomsPhase.java

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,19 @@
1919
package org.apache.maven.shared.release.phase;
2020

2121
import java.io.File;
22-
import java.net.URI;
22+
import java.nio.file.FileSystems;
23+
import java.nio.file.Paths;
2324
import java.text.DateFormat;
2425
import java.text.SimpleDateFormat;
2526
import java.util.ArrayList;
2627
import java.util.Arrays;
2728
import java.util.Collection;
2829
import java.util.Date;
30+
import java.util.HashSet;
2931
import java.util.List;
3032
import java.util.Map;
3133
import java.util.Properties;
34+
import java.util.Set;
3235
import java.util.TimeZone;
3336
import java.util.regex.Matcher;
3437
import java.util.regex.Pattern;
@@ -106,6 +109,8 @@ public abstract class AbstractRewritePomsPhase extends AbstractReleasePhase impl
106109

107110
private long startTime = -1 * 1000;
108111

112+
private final Set<String> exclusionPatterns = new HashSet<>();
113+
109114
protected AbstractRewritePomsPhase(
110115
ScmRepositoryConfigurator scmRepositoryConfigurator,
111116
Map<String, ModelETLFactory> modelETLFactories,
@@ -157,6 +162,12 @@ public ReleaseResult execute(
157162
throws ReleaseExecutionException, ReleaseFailureException {
158163
ReleaseResult result = new ReleaseResult();
159164

165+
List<String> additionalExcludes = releaseDescriptor.getCheckModificationExcludes();
166+
167+
if (additionalExcludes != null) {
168+
exclusionPatterns.addAll(additionalExcludes);
169+
}
170+
160171
transform(releaseDescriptor, releaseEnvironment, reactorProjects, false, result);
161172

162173
result.setResultCode(ReleaseResult.SUCCESS);
@@ -210,17 +221,19 @@ private void transform(
210221
throws ReleaseExecutionException, ReleaseFailureException {
211222
result.setStartTime((startTime >= 0) ? startTime : System.currentTimeMillis());
212223

213-
URI root = ReleaseUtil.getRootProject(reactorProjects).getBasedir().toURI();
214-
215224
for (MavenProject project : reactorProjects) {
216-
URI pom = project.getFile().toURI();
217-
logInfo(
218-
result,
219-
"Transforming " + root.relativize(pom).getPath() + ' '
220-
+ buffer().project(project.getArtifactId()) + " '" + project.getName() + "'"
221-
+ (simulate ? " with ." + getPomSuffix() + " suffix" : "") + "...");
225+
final String path = project.getFile().getPath();
226+
if (exclusionPatterns.stream().noneMatch(exclusionPattern -> FileSystems.getDefault()
227+
.getPathMatcher("glob:" + exclusionPattern)
228+
.matches(Paths.get(path)))) {
229+
logDebug(
230+
result,
231+
"Transforming " + path + ' '
232+
+ buffer().project(project.getArtifactId()) + " '" + project.getName() + "'"
233+
+ (simulate ? " with ." + getPomSuffix() + " suffix" : "") + "...");
222234

223-
transformProject(project, releaseDescriptor, releaseEnvironment, simulate, result);
235+
transformProject(project, releaseDescriptor, releaseEnvironment, simulate, result);
236+
}
224237
}
225238
}
226239

maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/AbstractScmCommitPhase.java

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@
1919
package org.apache.maven.shared.release.phase;
2020

2121
import java.io.File;
22+
import java.nio.file.FileSystems;
23+
import java.nio.file.Paths;
2224
import java.util.ArrayList;
2325
import java.util.Collection;
26+
import java.util.HashSet;
2427
import java.util.List;
28+
import java.util.Set;
2529

2630
import org.apache.maven.project.MavenProject;
2731
import org.apache.maven.scm.ScmException;
@@ -61,6 +65,8 @@ public abstract class AbstractScmCommitPhase extends AbstractReleasePhase {
6165
*/
6266
protected final String descriptorCommentGetter;
6367

68+
private final Set<String> exclusionPatterns = new HashSet<>();
69+
6470
protected AbstractScmCommitPhase(
6571
ScmRepositoryConfigurator scmRepositoryConfigurator, String descriptorCommentGetter) {
6672
this.scmRepositoryConfigurator = requireNonNull(scmRepositoryConfigurator);
@@ -77,6 +83,12 @@ public ReleaseResult execute(
7783

7884
validateConfiguration(releaseDescriptor);
7985

86+
List<String> additionalExcludes = releaseDescriptor.getCheckModificationExcludes();
87+
88+
if (additionalExcludes != null) {
89+
exclusionPatterns.addAll(additionalExcludes);
90+
}
91+
8092
runLogic(releaseDescriptor, releaseEnvironment, reactorProjects, relResult, false);
8193

8294
relResult.setResultCode(ReleaseResult.SUCCESS);
@@ -166,9 +178,12 @@ protected void performCheckins(
166178
}
167179
} else {
168180
List<File> pomFiles = createPomFiles(releaseDescriptor, reactorProjects);
169-
ScmFileSet fileSet = new ScmFileSet(new File(releaseDescriptor.getWorkingDirectory()), pomFiles);
170181

171-
checkin(provider, repository, fileSet, releaseDescriptor, message);
182+
if (!pomFiles.isEmpty()) {
183+
ScmFileSet fileSet = new ScmFileSet(new File(releaseDescriptor.getWorkingDirectory()), pomFiles);
184+
185+
checkin(provider, repository, fileSet, releaseDescriptor, message);
186+
}
172187
}
173188
}
174189

@@ -288,11 +303,20 @@ protected static List<File> createPomFiles(ReleaseDescriptor releaseDescriptor,
288303
* @param reactorProjects a {@link java.util.List} object
289304
* @return a {@link java.util.List} object
290305
*/
291-
protected static List<File> createPomFiles(
292-
ReleaseDescriptor releaseDescriptor, List<MavenProject> reactorProjects) {
306+
protected List<File> createPomFiles(ReleaseDescriptor releaseDescriptor, List<MavenProject> reactorProjects) {
307+
293308
List<File> pomFiles = new ArrayList<>();
294309
for (MavenProject project : reactorProjects) {
295-
pomFiles.addAll(createPomFiles(releaseDescriptor, project));
310+
311+
final String path = project.getFile().getPath();
312+
313+
boolean isExcludedPathFound = exclusionPatterns.stream()
314+
.anyMatch(exclusionPattern -> FileSystems.getDefault()
315+
.getPathMatcher("glob:" + exclusionPattern)
316+
.matches(Paths.get(path)));
317+
if (!isExcludedPathFound) {
318+
pomFiles.addAll(createPomFiles(releaseDescriptor, project));
319+
}
296320
}
297321
return pomFiles;
298322
}

maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/MapVersionsPhaseTest.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.maven.shared.release.phase;
2020

21+
import java.io.File;
2122
import java.util.ArrayList;
2223
import java.util.Arrays;
2324
import java.util.Collections;
@@ -2447,11 +2448,70 @@ public void testUpdateDevelopmentInvalidDefaultDevelopmentVersion_NonInteractive
24472448
}
24482449
}
24492450

2451+
@Test
2452+
public void testSimulateRelease_CheckModificationExcludes() throws Exception {
2453+
// verify
2454+
MapReleaseVersionsPhase phase =
2455+
new MapReleaseVersionsPhase(scmRepositoryConfigurator, mockPrompter, versionPolicies);
2456+
2457+
List<MavenProject> reactorProjects = new ArrayList<>();
2458+
Collections.addAll(
2459+
reactorProjects,
2460+
createProject("bar", "1.11-SNAPSHOT"),
2461+
createProjectWithPomFile(
2462+
"artifactId", "1.2-SNAPSHOT", "src/test/resources/projects/scm-commit/multiple-poms/pom.xml"),
2463+
createProjectWithPomFile(
2464+
"subproject1",
2465+
"2.0",
2466+
"src/test/resources/projects/scm-commit/multiple-poms/subproject1/pom.xml"));
2467+
2468+
ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
2469+
builder.setCheckModificationExcludes(Collections.singletonList("**/subproject1/pom.xml"));
2470+
builder.setInteractive(false);
2471+
2472+
// test
2473+
phase.simulate(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
2474+
2475+
// verify
2476+
assertEquals(
2477+
"Check release versions",
2478+
"1.2",
2479+
ReleaseUtils.buildReleaseDescriptor(builder).getProjectReleaseVersion("groupId:artifactId"));
2480+
assertNull(
2481+
"Check development versions",
2482+
ReleaseUtils.buildReleaseDescriptor(builder).getProjectDevelopmentVersion("groupId:artifactId"));
2483+
2484+
assertEquals(
2485+
"Check release versions",
2486+
"1.11",
2487+
ReleaseUtils.buildReleaseDescriptor(builder).getProjectReleaseVersion("groupId:bar"));
2488+
assertNull(
2489+
"Check development versions",
2490+
ReleaseUtils.buildReleaseDescriptor(builder).getProjectDevelopmentVersion("groupId:bar"));
2491+
2492+
assertNull(
2493+
"Check release versions",
2494+
ReleaseUtils.buildReleaseDescriptor(builder).getProjectReleaseVersion("groupId:subproject1"));
2495+
assertNull(
2496+
"Check development versions",
2497+
ReleaseUtils.buildReleaseDescriptor(builder).getProjectDevelopmentVersion("groupId:subproject1"));
2498+
}
2499+
24502500
private static MavenProject createProject(String artifactId, String version) {
24512501
Model model = new Model();
24522502
model.setGroupId("groupId");
24532503
model.setArtifactId(artifactId);
24542504
model.setVersion(version);
24552505
return new MavenProject(model);
24562506
}
2507+
2508+
private static MavenProject createProjectWithPomFile(String artifactId, String version, String pathName) {
2509+
Model model = new Model();
2510+
model.setGroupId("groupId");
2511+
model.setArtifactId(artifactId);
2512+
model.setVersion(version);
2513+
MavenProject mavenProject = new MavenProject(model);
2514+
mavenProject.setFile(new File(pathName));
2515+
return mavenProject;
2516+
}
24572517
}

maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/RewritePomsForReleasePhaseTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.io.File;
2222
import java.io.IOException;
2323
import java.nio.file.Path;
24+
import java.util.Collections;
2425
import java.util.Iterator;
2526
import java.util.List;
2627
import java.util.Objects;
@@ -454,4 +455,19 @@ public void testRewritePomWithDifferentVersionsAcrossModules() throws Exception
454455

455456
assertTrue(comparePomFiles(reactorProjects));
456457
}
458+
459+
@Test
460+
public void testRewritePomWithCheckModificationExcludes() throws Exception {
461+
List<MavenProject> reactorProjects = createReactorProjects("multimodule-with-check-modification-excludes");
462+
463+
ReleaseDescriptorBuilder builder =
464+
createDescriptorFromProjects(reactorProjects, "multimodule-with-check-modification-excludes");
465+
builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
466+
builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
467+
builder.setCheckModificationExcludes(Collections.singletonList("**/subproject2/*"));
468+
469+
phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
470+
471+
assertTrue(comparePomFiles(reactorProjects));
472+
}
457473
}

maven-release-manager/src/test/java/org/apache/maven/shared/release/phase/ScmCommitPreparationPhaseTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,52 @@ public void testSuppressCommitAfterBranch() throws Exception {
521521
verifyNoMoreInteractions(scmProviderMock);
522522
}
523523

524+
@Test
525+
public void testCommitMultiModuleWithCheckModificationExcludes() throws Exception {
526+
// prepare
527+
ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
528+
String dir = "scm-commit/multiple-poms";
529+
List<MavenProject> reactorProjects = createReactorProjects(dir, dir, null);
530+
builder.setScmSourceUrl("scm-url");
531+
MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
532+
builder.setWorkingDirectory(rootProject.getFile().getParentFile().getAbsolutePath());
533+
builder.setScmReleaseLabel("release-label");
534+
builder.setCheckModificationExcludes(Collections.singletonList("**/subproject2/*"));
535+
536+
List<File> poms = new ArrayList<>();
537+
for (Iterator<MavenProject> i = reactorProjects.iterator(); i.hasNext(); ) {
538+
MavenProject project = i.next();
539+
// This is a mock match that verifies that the project has not been submitted
540+
if (!"subproject2".equals(project.getName())) {
541+
poms.add(project.getFile());
542+
}
543+
}
544+
ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile(), poms);
545+
546+
ScmProvider scmProviderMock = mock(ScmProvider.class);
547+
when(scmProviderMock.checkIn(
548+
isA(ScmRepository.class),
549+
argThat(new IsScmFileSetEquals(fileSet)),
550+
isNull(ScmVersion.class),
551+
eq(PREFIX + "release-label")))
552+
.thenReturn(new CheckInScmResult(
553+
"...",
554+
Collections.singletonList(
555+
new ScmFile(rootProject.getFile().getPath(), ScmFileStatus.CHECKED_IN))));
556+
ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
557+
stub.setScmProvider(scmProviderMock);
558+
559+
// execute
560+
phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
561+
562+
// verify
563+
verify(scmProviderMock)
564+
.checkIn(
565+
isA(ScmRepository.class), argThat(new IsScmFileSetEquals(fileSet)),
566+
isNull(ScmVersion.class), eq(PREFIX + "release-label"));
567+
verifyNoMoreInteractions(scmProviderMock);
568+
}
569+
524570
private List<MavenProject> createReactorProjects() throws Exception {
525571
String dir = "scm-commit/single-pom";
526572
return createReactorProjects(dir, dir, null);

0 commit comments

Comments
 (0)