@Override
  public void execute(GitFlowConfiguration configuration, Git git, JGitFlowCommand gitFlowCommand)
      throws JGitFlowExtensionException {
    try {
      BranchType branchType = branchHelper.getCurrentBranchType();
      ProjectCacheKey cacheKey = null;

      switch (branchType) {
        case RELEASE:
          cacheKey = ProjectCacheKey.RELEASE_BRANCH;
          break;

        case HOTFIX:
          cacheKey = ProjectCacheKey.HOTFIX_BRANCH;
          break;

        case DEVELOP:
          cacheKey = ProjectCacheKey.DEVELOP_BRANCH;
          break;

        case MASTER:
          cacheKey = ProjectCacheKey.MASTER_BRANCH;
          break;

        case FEATURE:
          cacheKey = ProjectCacheKey.FEATURE_BRANCH;
          break;

        default:
          throw new JGitFlowExtensionException(
              "Unsupported branch type '"
                  + branchType.name()
                  + "' while running "
                  + this.getClass().getSimpleName()
                  + " command");
      }

      ReleaseContext ctx = contextProvider.getContext();
      List<MavenProject> branchProjects = branchHelper.getProjectsForCurrentBranch();

      projectHelper.checkPomForVersionState(VersionState.RELEASE, branchProjects);

      if (!ctx.isAllowSnapshots()) {
        List<String> snapshots =
            projectHelper.checkForNonReactorSnapshots(cacheKey, branchProjects);
        if (!snapshots.isEmpty()) {
          String details = Joiner.on(ls).join(snapshots);
          throw new UnresolvedSnapshotsException(
              "Cannot finish a "
                  + branchType.name().toLowerCase()
                  + " due to snapshot dependencies:"
                  + ls
                  + details);
        }
      }
    } catch (Exception e) {
      throw new JGitFlowExtensionException(
          "Error verifying version state in poms: " + e.getMessage(), e);
    }
  }
  @Override
  public void execute(MavenProject project, MavenSession session) throws MavenExecutorException {
    ReleaseContext ctx = contextProvider.getContext();

    String goal = ctx.getGoals();

    if (ctx.isNoDeploy()) {
      goal = "clean install";
    }

    execute(project, session, goal);
  }
  @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);
  }
  @Override
  public void execute(GitFlowConfiguration configuration, Git git, JGitFlowCommand gitFlowCommand)
      throws JGitFlowExtensionException {
    try {
      JGitFlow flow = jGitFlowProvider.gitFlow();
      ReleaseContext ctx = contextProvider.getContext();

      String originalBranchName = branchHelper.getCurrentBranchName();

      // check out develop and reload the reactor
      SessionAndProjects sessionAndProjects =
          checkoutAndGetProjects.run(flow.getDevelopBranchName());
      List<MavenProject> developProjects = sessionAndProjects.getProjects();

      String developLabel =
          labelProvider.getNextVersionLabel(
              VersionType.DEVELOPMENT, ProjectCacheKey.DEVELOP_BRANCH, developProjects);

      pomUpdater.updatePomsWithNextDevelopmentVersion(
          ProjectCacheKey.DEVELOP_BRANCH, developProjects);

      projectHelper.commitAllPoms(
          flow.git(),
          developProjects,
          ctx.getScmCommentPrefix()
              + "updating poms for "
              + developLabel
              + " development"
              + ctx.getScmCommentSuffix());

      flow.git().checkout().setName(originalBranchName).call();

    } catch (Exception e) {
      throw new JGitFlowExtensionException(
          "Error updating develop poms to next development version", e);
    }
  }