in maven-release-manager/src/main/java/org/apache/maven/shared/release/DefaultReleaseManager.java [113:214]
private void prepare(ReleasePrepareRequest prepareRequest, ReleaseResult result)
throws ReleaseExecutionException, ReleaseFailureException {
final ReleaseDescriptorBuilder builder = prepareRequest.getReleaseDescriptorBuilder();
// Create a config containing values from the session properties (ie command line properties with cli).
ReleaseUtils.copyPropertiesToReleaseDescriptor(
prepareRequest.getUserProperties(), new ReleaseDescriptorBuilder() {
public ReleaseDescriptorBuilder addDevelopmentVersion(String key, String value) {
builder.addDevelopmentVersion(key, value);
return this;
}
public ReleaseDescriptorBuilder addReleaseVersion(String key, String value) {
builder.addReleaseVersion(key, value);
return this;
}
public ReleaseDescriptorBuilder addDependencyReleaseVersion(String dependencyKey, String version) {
builder.addDependencyReleaseVersion(dependencyKey, version);
return this;
}
public ReleaseDescriptorBuilder addDependencyDevelopmentVersion(
String dependencyKey, String version) {
builder.addDependencyDevelopmentVersion(dependencyKey, version);
return this;
}
});
BuilderReleaseDescriptor config;
if (BooleanUtils.isNotFalse(prepareRequest.getResume())) {
config = loadReleaseDescriptor(builder, prepareRequest.getReleaseManagerListener());
} else {
config = ReleaseUtils.buildReleaseDescriptor(builder);
}
Strategy releaseStrategy = getStrategy(config.getReleaseStrategyId());
List<String> preparePhases = getGoalPhases(releaseStrategy, "prepare");
goalStart(prepareRequest.getReleaseManagerListener(), "prepare", preparePhases);
// Later, it would be a good idea to introduce a proper workflow tool so that the release can be made up of a
// more flexible set of steps.
String completedPhase = config.getCompletedPhase();
int index = preparePhases.indexOf(completedPhase);
for (int idx = 0; idx <= index; idx++) {
phaseSkip(prepareRequest.getReleaseManagerListener(), preparePhases.get(idx));
}
if (index == preparePhases.size() - 1) {
logInfo(
result,
"Release preparation already completed. You can now continue with release:perform, "
+ "or start again using the -Dresume=false flag");
} else if (index >= 0) {
logInfo(result, "Resuming release from phase '" + preparePhases.get(index + 1) + "'");
}
// start from next phase
for (int i = index + 1; i < preparePhases.size(); i++) {
String name = preparePhases.get(i);
ReleasePhase phase = releasePhases.get(name);
if (phase == null) {
throw new ReleaseExecutionException("Unable to find phase '" + name + "' to execute");
}
phaseStart(prepareRequest.getReleaseManagerListener(), name);
ReleaseResult phaseResult = null;
try {
if (BooleanUtils.isTrue(prepareRequest.getDryRun())) {
phaseResult = phase.simulate(
config, prepareRequest.getReleaseEnvironment(), prepareRequest.getReactorProjects());
} else {
phaseResult = phase.execute(
config, prepareRequest.getReleaseEnvironment(), prepareRequest.getReactorProjects());
}
} finally {
if (result != null && phaseResult != null) {
result.appendOutput(phaseResult.getOutput());
}
}
config.setCompletedPhase(name);
try {
configStore.get().write(config);
} catch (ReleaseDescriptorStoreException e) {
// TODO: rollback?
throw new ReleaseExecutionException("Error writing release properties after completing phase", e);
}
phaseEnd(prepareRequest.getReleaseManagerListener());
}
goalEnd(prepareRequest.getReleaseManagerListener());
}