Skip to content

Commit d198f8b

Browse files
authored
Merge pull request #63 from egineering-llc/release/1.7.0
Release/1.7.0
2 parents 0a54987 + 20e355e commit d198f8b

13 files changed

+252
-105
lines changed

README.md

Lines changed: 54 additions & 32 deletions
Large diffs are not rendered by default.

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<groupId>com.e-gineering</groupId>
1010
<artifactId>gitflow-helper-maven-plugin</artifactId>
1111

12-
<version>1.6.0</version>
12+
<version>1.7.0</version>
1313
<packaging>maven-plugin</packaging>
1414

1515
<name>gitflow-helper-maven-plugin</name>

src/main/java/com/e_gineering/maven/gitflowhelper/AbstractGitflowBasedRepositoryMojo.java

Lines changed: 57 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99
import org.apache.maven.plugins.annotations.Parameter;
1010
import org.apache.maven.project.MavenProjectHelper;
1111
import org.codehaus.plexus.util.FileUtils;
12+
import org.eclipse.aether.DefaultRepositorySystemSession;
1213
import org.eclipse.aether.RepositorySystemSession;
1314
import org.eclipse.aether.artifact.DefaultArtifact;
1415
import org.eclipse.aether.impl.ArtifactResolver;
16+
import org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManagerFactory;
1517
import org.eclipse.aether.repository.LocalRepository;
1618
import org.eclipse.aether.repository.RemoteRepository;
19+
import org.eclipse.aether.repository.RepositoryPolicy;
1720
import org.eclipse.aether.resolution.ArtifactRequest;
1821
import org.eclipse.aether.resolution.ArtifactResolutionException;
1922
import org.eclipse.aether.resolution.ArtifactResult;
@@ -27,7 +30,6 @@
2730
import java.io.InputStreamReader;
2831
import java.io.OutputStreamWriter;
2932
import java.io.PrintWriter;
30-
import java.lang.reflect.Field;
3133
import java.nio.charset.Charset;
3234
import java.nio.file.Files;
3335
import java.util.ArrayList;
@@ -54,7 +56,10 @@ public abstract class AbstractGitflowBasedRepositoryMojo extends AbstractGitflow
5456
protected String snapshotDeploymentRepository;
5557

5658
@Parameter(defaultValue = "${repositorySystemSession}", required = true)
57-
private RepositorySystemSession session;
59+
protected RepositorySystemSession session;
60+
61+
@Component
62+
protected EnhancedLocalRepositoryManagerFactory localRepositoryManagerFactory;
5863

5964
@Parameter(defaultValue = "${project.build.directory}", required = true)
6065
protected File buildDirectory;
@@ -109,7 +114,7 @@ protected ArtifactRepository getDeploymentRepository(final String altRepository)
109114
* @throws MojoExecutionException
110115
* @throws MojoFailureException
111116
*/
112-
private RemoteRepository getRepository(final String altRepository) throws MojoExecutionException, MojoFailureException {
117+
protected RemoteRepository getRepository(final String altRepository) throws MojoExecutionException, MojoFailureException {
113118
if (getLog().isDebugEnabled()) {
114119
getLog().debug("Creating remote Aether repository (to resolve remote artifacts) for: " + altRepository);
115120
}
@@ -137,15 +142,14 @@ private RemoteRepository getRepository(final String altRepository) throws MojoEx
137142
}
138143

139144
private String getCoordinates(ArtifactResult result) {
140-
StringBuilder buffer = new StringBuilder( 128 );
141-
buffer.append( result.getArtifact().getGroupId() );
142-
buffer.append( ':' ).append( result.getArtifact().getArtifactId() );
143-
buffer.append( ':' ).append( result.getArtifact().getExtension() );
144-
if ( result.getArtifact().getClassifier().length() > 0 )
145-
{
146-
buffer.append( ':' ).append( result.getArtifact().getClassifier() );
145+
StringBuilder buffer = new StringBuilder(128);
146+
buffer.append(result.getArtifact().getGroupId());
147+
buffer.append(':').append(result.getArtifact().getArtifactId());
148+
buffer.append(':').append(result.getArtifact().getExtension());
149+
if (result.getArtifact().getClassifier().length() > 0) {
150+
buffer.append(':').append(result.getArtifact().getClassifier());
147151
}
148-
buffer.append( ':' ).append( result.getArtifact().getBaseVersion() );
152+
buffer.append(':').append(result.getArtifact().getBaseVersion());
149153
return buffer.toString();
150154
}
151155

@@ -183,47 +187,46 @@ private String getCoordinates(org.apache.maven.artifact.Artifact artifact) {
183187
* group:artifact:type:classifier:version
184188
*/
185189
protected void attachArtifactCatalog() throws MojoExecutionException {
186-
getLog().info("Cataloging Artifacts for promotion & reattachment: " + project.getBuild().getDirectory());
190+
getLog().info("Cataloging Artifacts for promotion & reattachment: " + project.getBuild().getDirectory());
187191

188-
File catalog = new File(buildDirectory, project.getArtifact().getArtifactId() + ".txt");
192+
File catalog = new File(buildDirectory, project.getArtifact().getArtifactId() + ".txt");
189193

190-
PrintWriter writer = null;
194+
PrintWriter writer = null;
191195

192-
try {
193-
catalog.delete();
194-
buildDirectory.mkdirs();
195-
writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(catalog), Charset.forName("UTF-8")));
196-
197-
if (project.getArtifact() != null && project.getArtifact().getFile() != null &&
198-
project.getArtifact().getFile().exists() && !project.getArtifact().getFile().isDirectory())
199-
{
200-
String coords = getCoordinates(project.getArtifact());
201-
if (!coords.isEmpty()){
202-
getLog().info("Cataloging: " + coords);
203-
writer.println(coords);
204-
}
205-
} else {
206-
getLog().info("No primary artifact to catalog, cataloging attached artifacts instead.");
196+
try {
197+
catalog.delete();
198+
buildDirectory.mkdirs();
199+
writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(catalog), Charset.forName("UTF-8")));
200+
201+
if (project.getArtifact() != null && project.getArtifact().getFile() != null &&
202+
project.getArtifact().getFile().exists() && !project.getArtifact().getFile().isDirectory()) {
203+
String coords = getCoordinates(project.getArtifact());
204+
if (!coords.isEmpty()) {
205+
getLog().info("Cataloging: " + coords);
206+
writer.println(coords);
207207
}
208+
} else {
209+
getLog().info("No primary artifact to catalog, cataloging attached artifacts instead.");
210+
}
208211

209-
// Iterate the attached artifacts.
210-
for (org.apache.maven.artifact.Artifact artifact : project.getAttachedArtifacts()) {
211-
String coords = getCoordinates(artifact);
212-
if (!coords.isEmpty()) {
213-
getLog().info("Cataloging: " + coords);
214-
writer.println(coords);
215-
}
212+
// Iterate the attached artifacts.
213+
for (org.apache.maven.artifact.Artifact artifact : project.getAttachedArtifacts()) {
214+
String coords = getCoordinates(artifact);
215+
if (!coords.isEmpty()) {
216+
getLog().info("Cataloging: " + coords);
217+
writer.println(coords);
216218
}
219+
}
217220

218-
getLog().info("Attaching catalog artifact: " + catalog);
219-
projectHelper.attachArtifact(project, "txt", "catalog", catalog);
220-
} catch (IOException ioe) {
221-
throw new MojoExecutionException("Failed to create catalog of artifacts", ioe);
222-
} finally {
223-
if (writer != null) {
224-
writer.close();
225-
}
221+
getLog().info("Attaching catalog artifact: " + catalog);
222+
projectHelper.attachArtifact(project, "txt", "catalog", catalog);
223+
} catch (IOException ioe) {
224+
throw new MojoExecutionException("Failed to create catalog of artifacts", ioe);
225+
} finally {
226+
if (writer != null) {
227+
writer.close();
226228
}
229+
}
227230
}
228231

229232
/**
@@ -250,35 +253,30 @@ protected void attachExistingArtifacts(final String sourceRepository, final bool
250253
// A place to store our resolved files...
251254
List<ArtifactResult> resolvedArtifacts = new ArrayList<ArtifactResult>();
252255

253-
// Keep track of the original base directory.
254-
Field localBaseDir = null;
255-
File originalBaseDir = session.getLocalRepositoryManager().getRepository().getBasedir();
256256

257-
// Disable the local repository - using a bit of reflection that I wish we didn't need to use.
257+
// Use a custom repository session, setup to force a few behaviors we like.
258+
DefaultRepositorySystemSession tempSession = new DefaultRepositorySystemSession(session);
259+
tempSession.setUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_ALWAYS);
260+
258261
File tempRepo = null;
259262
if (disableLocal) {
260-
getLog().info("Disabling local repository @ " + session.getLocalRepository().getBasedir());
263+
getLog().info("Disabling local repository @ " + tempSession.getLocalRepository().getBasedir());
261264
try {
262-
localBaseDir = LocalRepository.class.getDeclaredField("basedir");
263-
localBaseDir.setAccessible(true);
264-
265-
// Generate a new temp directory.
266265
tempRepo = Files.createTempDirectory("gitflow-helper-maven-plugin-repo").toFile();
267266

268267
getLog().info("Using temporary local repository @ " + tempRepo.getAbsolutePath());
269-
localBaseDir.set(session.getLocalRepositoryManager().getRepository(), tempRepo);
268+
tempSession.setLocalRepositoryManager(localRepositoryManagerFactory.newInstance(tempSession, new LocalRepository(tempRepo)));
270269
} catch (Exception ex) {
271270
getLog().warn("Failed to disable local repository path.", ex);
272271
}
273272
}
274273

275-
276274
List<ArtifactRequest> requiredArtifacts = new ArrayList<ArtifactRequest>();
277275

278276
// Locate our text catalog classifier file. :-)
279277
BufferedReader reader = null;
280278
try {
281-
ArtifactResult catalogResult = artifactResolver.resolveArtifact(session, new ArtifactRequest(new DefaultArtifact(project.getGroupId(), project.getArtifactId(), "catalog", "txt", project.getVersion()), remoteRepositories, null));
279+
ArtifactResult catalogResult = artifactResolver.resolveArtifact(tempSession, new ArtifactRequest(new DefaultArtifact(project.getGroupId(), project.getArtifactId(), "catalog", "txt", project.getVersion()), remoteRepositories, null));
282280
resolvedArtifacts.add(catalogResult);
283281

284282
if (catalogResult.isResolved()) {
@@ -301,14 +299,15 @@ protected void attachExistingArtifacts(final String sourceRepository, final bool
301299
if (reader != null) {
302300
try {
303301
reader.close();
304-
} catch (IOException ioe) {}
302+
} catch (IOException ioe) {
303+
}
305304
}
306305
}
307306

308307

309308
// Resolve the artifacts from the catalog (if there are any)
310309
try {
311-
resolvedArtifacts.addAll(artifactResolver.resolveArtifacts(session, requiredArtifacts));
310+
resolvedArtifacts.addAll(artifactResolver.resolveArtifacts(tempSession, requiredArtifacts));
312311
} catch (ArtifactResolutionException are) {
313312
throw new MojoExecutionException("Failed to resolve the required project files from: " + sourceRepository, are);
314313
}
@@ -339,12 +338,6 @@ protected void attachExistingArtifacts(final String sourceRepository, final bool
339338

340339
// Restore the local repository, again using reflection.
341340
if (disableLocal) {
342-
try {
343-
localBaseDir.set(session.getLocalRepositoryManager().getRepository(), originalBaseDir);
344-
localBaseDir.setAccessible(false);
345-
} catch (Exception ex) {
346-
getLog().warn("Failed to restore original local repository path.", ex);
347-
}
348341
if (tempRepo != null) {
349342
try {
350343
FileUtils.deleteDirectory(tempRepo);

src/main/java/com/e_gineering/maven/gitflowhelper/AbstractGitflowBranchMojo.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public abstract class AbstractGitflowBranchMojo extends AbstractMojo {
3333
@Parameter(defaultValue = "(origin/)?master", property = "masterBranchPattern", required = true)
3434
private String masterBranchPattern;
3535

36+
@Parameter(defaultValue = "(origin/)?support/(.*)", property = "supportBranchPattern", required = true)
37+
private String supportBranchPattern;
38+
3639
@Parameter(defaultValue = "(origin/)?release/(.*)", property = "releaseBranchPattern", required = true)
3740
private String releaseBranchPattern;
3841

@@ -91,6 +94,8 @@ public void execute() throws MojoExecutionException, MojoFailureException {
9194
*/
9295
if (gitBranch.matches(masterBranchPattern)) {
9396
logExecute(GitBranchType.MASTER, gitBranch, masterBranchPattern);
97+
} else if (gitBranch.matches(supportBranchPattern)) {
98+
logExecute(GitBranchType.SUPPORT, gitBranch, supportBranchPattern);
9499
} else if (gitBranch.matches(releaseBranchPattern)) {
95100
logExecute(GitBranchType.RELEASE, gitBranch, releaseBranchPattern);
96101
} else if (gitBranch.matches(hotfixBranchPattern)) {

src/main/java/com/e_gineering/maven/gitflowhelper/AttachDeployedArtifactsMojo.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ public class AttachDeployedArtifactsMojo extends AbstractGitflowBasedRepositoryM
1616
@Override
1717
protected void execute(GitBranchType type, String gitBranch, String branchPattern) throws MojoExecutionException, MojoFailureException {
1818
switch (type) {
19-
case MASTER: {
19+
case MASTER:
20+
case SUPPORT:
21+
{
2022
getLog().info("Attaching artifacts from release repository...");
2123
attachExistingArtifacts(releaseDeploymentRepository, true);
2224
break;

src/main/java/com/e_gineering/maven/gitflowhelper/EnforceVersionsMojo.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,18 @@ protected void execute(final GitBranchType type, final String gitBranch, final S
2828
throw new MojoFailureException("The current git branch: [" + gitBranch + "] is defined as a release branch. The maven project version: [" + project.getVersion() + "] is currently a snapshot version.");
2929
}
3030

31-
// Expect the last group on non-master branches to match (exactly) the current projectVersion. (only release / hotfix branches)
32-
if (gitMatcher.groupCount() > 0 && !GitBranchType.MASTER.equals(type)) {
33-
if (!gitMatcher.group(gitMatcher.groupCount()).trim().equals(project.getVersion().trim())) {
31+
// Non-master version branches require a pom version match of some kind to the branch subgroups.
32+
if (gitMatcher.groupCount() > 0) {
33+
// HOTFIX and RELEASE branches require an exact match to the last subgroup.
34+
if ((GitBranchType.RELEASE.equals(type) || GitBranchType.HOTFIX.equals(type)) && !gitMatcher.group(gitMatcher.groupCount()).trim().equals(project.getVersion().trim())) {
3435
throw new MojoFailureException("The current git branch: [" + gitBranch + "] expected the maven project version to be: [" + gitMatcher.group(gitMatcher.groupCount()).trim() + "], but the maven project version is: [" + project.getVersion() + "]");
3536
}
37+
38+
// SUPPORT branches require a 'starts with' match of the maven project version to the subgroup.
39+
// ex: /origin/support/3.1 must have a maven version that starts with "3.1", ala: "3.1.2"
40+
if (GitBranchType.SUPPORT.equals(type) && !project.getVersion().startsWith(gitMatcher.group(gitMatcher.groupCount()).trim())) {
41+
throw new MojoFailureException("The current git branch: [" + gitBranch + "] expected the maven project version to start with: [" + gitMatcher.group(gitMatcher.groupCount()).trim() + "], but the maven project version is: [" + project.getVersion() + "]");
42+
}
3643
}
3744
}
3845
} else if (GitBranchType.DEVELOPMENT.equals(type) && !ArtifactUtils.isSnapshot(project.getVersion())) {

src/main/java/com/e_gineering/maven/gitflowhelper/GitBranchType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77
*/
88
public enum GitBranchType {
99
MASTER,
10+
SUPPORT,
1011
RELEASE,
1112
HOTFIX,
1213
DEVELOPMENT,
1314
OTHER,
1415
UNDEFINED;
1516

16-
static final EnumSet<GitBranchType> VERSIONED_TYPES = EnumSet.of(GitBranchType.MASTER, GitBranchType.RELEASE, GitBranchType.HOTFIX);
17+
static final EnumSet<GitBranchType> VERSIONED_TYPES = EnumSet.of(GitBranchType.MASTER, GitBranchType.SUPPORT, GitBranchType.RELEASE, GitBranchType.HOTFIX);
1718
}

src/main/java/com/e_gineering/maven/gitflowhelper/MasterPromoteExtension.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ public void afterProjectsRead(MavenSession session) throws MavenExecutionExcepti
6565
try {
6666
pluginsToRetain.add(descriptorCreator.findPluginForPrefix(prefix, session));
6767
} catch (NoPluginFoundForPrefixException ex) {
68-
throw new MavenExecutionException("Unable to resolve plugin for prefix: " + prefix, ex);
68+
logger.warn("gitflow-helper-maven-plugin: Unable to resolve project plugin for prefix: " + prefix + " for goal: " + goal);
69+
// throw new MavenExecutionException("Unable to resolve plugin for prefix: " + prefix, ex);
6970
}
7071
}
7172
}
@@ -128,7 +129,10 @@ public void afterProjectsRead(MavenSession session) throws MavenExecutionExcepti
128129
logger.info("gitflow-helper-maven-plugin: Enabling MasterPromoteExtension. GIT_BRANCH: [" + gitBranch + "] matches masterBranchPattern: [" + masterBranchPattern + "]");
129130

130131
for (MavenProject project : session.getProjects()) {
131-
// Drop all the plugins from the build except for the gitflow-helper-maven-plugin.
132+
// Drop all the plugins from the build except for the gitflow-helper-maven-plugin, or plugins we
133+
// invoked goals for which could be mapped back to plugins in our project build.
134+
// Goals invoked from the commandline which cannot be mapped back to our project, will get warnings, but should still execute.
135+
// If someone is on 'master' and starts executing goals, we need to allow them to do that.
132136
project.getBuildPlugins().removeAll(pluginsToDrop.get(project));
133137
}
134138
}

src/main/java/com/e_gineering/maven/gitflowhelper/PromoteMasterMojo.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ protected void execute(final GitBranchType type, final String gitBranch, final S
2828
break;
2929
}
3030

31+
case SUPPORT:
3132
case MASTER: {
3233
getLog().info("Resolving & Reattaching existing artifacts from stageDeploymentRepository [" + stageDeploymentRepository + "]");
3334

src/main/java/com/e_gineering/maven/gitflowhelper/RetargetDeployMojo.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ protected void execute(final GitBranchType type, final String gitBranch, final S
1818
}
1919

2020
switch (type) {
21+
case SUPPORT:
2122
case MASTER: {
2223
getLog().info("Setting release artifact repository to: [" + releaseDeploymentRepository + "]");
2324
project.setSnapshotArtifactRepository(null);

0 commit comments

Comments
 (0)