@Override
  public void execute(MavenProject project, MavenSession session, String goals)
      throws MavenExecutorException {
    ReleaseContext ctx = contextProvider.getContext();

    List<String> argList = new ArrayList<String>();

    if (ctx.isUseReleaseProfile()) {
      argList.add("-DperformRelease=true");
    }

    String args = ctx.getArgs();
    if (Strings.isNullOrEmpty(args)) {

      // use default user properties + default profiles

      Properties userProps = session.getUserProperties();

      for (String key : userProps.stringPropertyNames()) {
        argList.add("-D" + key + "=\"" + userProps.getProperty(key) + "\"");
      }

      for (String profileId : getActiveProfileIds(project, session)) {
        argList.add("-P" + profileId);
      }

    } else {

      // use user specific release arguments
      argList.add(args.trim());
    }

    String additionalArgs = Joiner.on(" ").join(argList);

    ReleaseResult result = new ReleaseResult();
    ReleaseEnvironment env = new DefaultReleaseEnvironment();
    env.setSettings(session.getSettings());
    MavenExecutor mavenExecutor = mavenExecutors.get(env.getMavenExecutorId());

    mavenExecutor.executeGoals(
        ctx.getBaseDir(), goals, env, ctx.isInteractive(), additionalArgs, 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;
  }