private ReleaseResult performCheckout()

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;
    }