private boolean ensureNoLocalModifications()
      throws ComponentLookupException, ScmException, MojoExecutionException {

    if (!Boolean.getBoolean("sesat.mojo.localModifications.ignore")) {

      final ScmManager scmManager = (ScmManager) container.lookup(ScmManager.ROLE);

      loadPomProject();

      final StatusScmResult result =
          scmManager.status(
              scmManager.makeScmRepository(project.getScm().getDeveloperConnection()),
              new ScmFileSet(pomProject.getBasedir()));

      if (!result.isSuccess()) {

        getLog().error(result.getCommandOutput());
        throw new MojoExecutionException("Failed to ensure checkout has no modifications");
      }

      if (0 < result.getChangedFiles().size()) {

        throw new MojoExecutionException(
            "Your checkout has local modifications. "
                + "Server deploy can *only* be done with a clean workbench.");
      }

      return result.isSuccess() && 0 == result.getChangedFiles().size();
    }
    return true; // sesat.mojo.localModifications.ignore
  }
  public ReleaseResult execute(
      ReleaseDescriptor releaseDescriptor,
      ReleaseEnvironment releaseEnvironment,
      List reactorProjects)
      throws ReleaseExecutionException, ReleaseFailureException {
    ReleaseResult relResult = new ReleaseResult();

    List additionalExcludes = releaseDescriptor.getCheckModificationExcludes();

    if (additionalExcludes != null) {
      for (int i1 = 0, additionalExcludesSize = additionalExcludes.size();
          i1 < additionalExcludesSize;
          i1++) {
        // fail fast if it is not a string
        String exclude = (String) additionalExcludes.get(i1);
        excludedFiles.add(exclude);
      }
    }

    logInfo(relResult, "Verifying that there are no local modifications...");
    logInfo(relResult, "  ignoring changes on: " + StringUtils.join(excludedFiles, ", "));

    ScmRepository repository;
    ScmProvider provider;
    try {
      repository =
          scmRepositoryConfigurator.getConfiguredRepository(
              releaseDescriptor, releaseEnvironment.getSettings());

      provider = scmRepositoryConfigurator.getRepositoryProvider(repository);
    } catch (ScmRepositoryException e) {
      throw new ReleaseScmRepositoryException(
          e.getMessage() + " for URL: " + releaseDescriptor.getScmSourceUrl(),
          e.getValidationMessages());
    } catch (NoSuchScmProviderException e) {
      throw new ReleaseExecutionException(
          "Unable to configure SCM repository: " + e.getMessage(), e);
    }

    StatusScmResult result;
    try {
      result =
          provider.status(
              repository, new ScmFileSet(new File(releaseDescriptor.getWorkingDirectory())));
    } catch (ScmException e) {
      throw new ReleaseExecutionException(
          "An error occurred during the status check process: " + e.getMessage(), e);
    }

    if (!result.isSuccess()) {
      throw new ReleaseScmCommandException("Unable to check for local modifications", result);
    }

    List changedFiles = result.getChangedFiles();

    // TODO: would be nice for SCM status command to do this for me.
    for (Iterator i = changedFiles.iterator(); i.hasNext(); ) {
      ScmFile f = (ScmFile) i.next();

      String fileName = f.getPath().replace('\\', '/');
      fileName = fileName.substring(fileName.lastIndexOf('/') + 1, fileName.length());

      if (excludedFiles.contains(fileName)) {
        i.remove();
      }
    }

    if (!changedFiles.isEmpty()) {
      StringBuffer message = new StringBuffer();

      for (Iterator i = changedFiles.iterator(); i.hasNext(); ) {
        ScmFile file = (ScmFile) i.next();

        message.append(file.toString());

        message.append("\n");
      }

      throw new ReleaseFailureException(
          "Cannot prepare the release because you have local modifications : \n" + message);
    }

    relResult.setResultCode(ReleaseResult.SUCCESS);

    return relResult;
  }