private ScmResultWrapper execute(
     final ScmFileSet fileSet, final ScmRepository repository, final ScmProvider provider)
     throws org.apache.maven.scm.ScmException {
   final ScmVersion remoteVersion = scmConnectionInfo.getRemoteVersion();
   final ScmResultWrapper result;
   if (remoteVersion != null) {
     final ScmVersion localVersion = null;
     result =
         createScmDiffResultWrapper(
             provider.diff(repository, fileSet, remoteVersion, localVersion));
   } else {
     result = createScmStatusResultWrapper(provider.status(repository, fileSet));
   }
   return result;
 }
  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;
  }