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
  }
  private void tagDeploy() throws ComponentLookupException, ScmException {

    final ScmManager scmManager = (ScmManager) container.lookup(ScmManager.ROLE);
    final String date = new SimpleDateFormat("yyyyMMddHHmm").format(now);

    loadPomProject();

    final TagScmResult result =
        scmManager.tag(
            scmManager.makeScmRepository(project.getScm().getDeveloperConnection()),
            new ScmFileSet(pomProject.getBasedir()), // TODO server-side copy
            profile + "-deployments/" + date + "-" + project.getArtifactId(),
            "sesat " + profile + " deployment");

    if (!result.isSuccess()) {
      throw new ScmException(result.getCommandOutput());
    }
  }