in maven-release-manager/src/main/java/org/apache/maven/shared/release/phase/CheckoutProjectFromScm.java [144:235]
private ReleaseResult performCheckout(
ReleaseDescriptor releaseDescriptor,
ReleaseEnvironment releaseEnvironment,
List<MavenProject> reactorProjects)
throws ReleaseExecutionException, ReleaseFailureException, ScmException {
ReleaseResult result = new ReleaseResult();
logInfo(result, "Checking out the project to perform the release ...");
ScmRepository repository;
ScmProvider provider;
try {
repository = scmRepositoryConfigurator.getConfiguredRepository(
releaseDescriptor, releaseEnvironment.getSettings());
provider = scmRepositoryConfigurator.getRepositoryProvider(repository);
} catch (ScmRepositoryException e) {
result.setResultCode(ReleaseResult.ERROR);
logError(result, e.getMessage());
throw new ReleaseScmRepositoryException(e.getMessage(), e.getValidationMessages());
} catch (NoSuchScmProviderException e) {
result.setResultCode(ReleaseResult.ERROR);
logError(result, e.getMessage());
throw new ReleaseExecutionException("Unable to configure SCM repository: " + e.getMessage(), e);
}
MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
// TODO: sanity check that it is not . or .. or lower
File checkoutDirectory =
FileUtils.resolveFile(rootProject.getBasedir(), releaseDescriptor.getCheckoutDirectory());
if (checkoutDirectory.exists()) {
try {
FileUtils.deleteDirectory(checkoutDirectory);
} catch (IOException e) {
result.setResultCode(ReleaseResult.ERROR);
logError(result, e.getMessage());
throw new ReleaseExecutionException("Unable to remove old checkout directory: " + e.getMessage(), e);
}
}
checkoutDirectory.mkdirs();
CommandParameters commandParameters = new CommandParameters();
commandParameters.setString(
CommandParameter.SHALLOW,
Boolean.valueOf(releaseDescriptor.isScmShallowClone()).toString());
CheckOutScmResult scmResult = provider.checkOut(
repository,
new ScmFileSet(checkoutDirectory),
new ScmTag(releaseDescriptor.getScmReleaseLabel()),
commandParameters);
if (releaseDescriptor.isLocalCheckout() && !scmResult.isSuccess()) {
// this is not beautiful but needed to indicate that the execute() method
// should continue in the parent directory
return null;
}
String scmRelativePathProjectDirectory = scmResult.getRelativePathProjectDirectory();
if (scmRelativePathProjectDirectory == null || scmRelativePathProjectDirectory.isEmpty()) {
Path workingDirectory = Paths.get(releaseDescriptor.getWorkingDirectory());
Path rootProjectBasedir;
try {
rootProjectBasedir = rootProject.getBasedir().toPath().toRealPath(LinkOption.NOFOLLOW_LINKS);
} catch (IOException e) {
throw new ReleaseExecutionException(e.getMessage(), e);
}
scmRelativePathProjectDirectory =
workingDirectory.relativize(rootProjectBasedir).toString();
}
releaseDescriptor.setScmRelativePathProjectDirectory(scmRelativePathProjectDirectory);
if (!scmResult.isSuccess()) {
result.setResultCode(ReleaseResult.ERROR);
logError(result, scmResult.getProviderMessage());
throw new ReleaseScmCommandException("Unable to checkout from SCM", scmResult);
}
result.setResultCode(ReleaseResult.SUCCESS);
return result;
}