@Override
  public void afterSuccessfulReleaseVersionBuild() throws IOException, InterruptedException {
    AbstractBuildContext context = AbstractBuildContext.createContextFromMap(configuration);
    AbstractBuildContext.ReleaseManagementContext releaseManagementContext =
        context.releaseManagementContext;
    String labelChangeListId = configuration.get("repository.revision.number");
    if (modifiedFilesForReleaseVersion) {
      log("Submitting release version changes");
      labelChangeListId = currentChangeListId + "";
      perforce.commitWorkingCopy(currentChangeListId, releaseManagementContext.getTagComment());
    } else {
      safeRevertWorkingCopy();
      currentChangeListId = perforce.getDefaultChangeListId();
    }

    if (releaseManagementContext.isCreateVcsTag()) {
      log(
          "Creating label: '"
              + releaseManagementContext.getTagUrl()
              + "' with change list id: "
              + labelChangeListId);
      perforce.createTag(
          releaseManagementContext.getTagUrl(),
          releaseManagementContext.getTagComment(),
          labelChangeListId);
      tagCreated = true;
    }
  }
 @Override
 public void afterDevelopmentVersionChange(boolean modified)
     throws IOException, InterruptedException {
   super.afterDevelopmentVersionChange(modified);
   AbstractBuildContext context = AbstractBuildContext.createContextFromMap(configuration);
   AbstractBuildContext.ReleaseManagementContext releaseManagementContext =
       context.releaseManagementContext;
   if (modified) {
     log("Submitting next development version changes");
     perforce.commitWorkingCopy(
         currentChangeListId, releaseManagementContext.getNextDevelopmentComment());
   } else {
     safeRevertWorkingCopy();
     currentChangeListId = perforce.getDefaultChangeListId();
   }
 }
 private void safeDeleteLabel(String label) throws IOException {
   log("Deleting label '" + label + "'");
   try {
     perforce.deleteLabel(label);
   } catch (Exception e) {
     log("Failed to delete label: " + e.getLocalizedMessage());
   }
 }
 private void safeRevertWorkingCopy() {
   log("Reverting local changes");
   try {
     perforce.revertWorkingCopy(currentChangeListId);
   } catch (Exception e) {
     log("Failed to revert: " + e.getLocalizedMessage());
   }
 }
 @Override
 public void buildCompleted(BuildContext buildContext) throws IOException, InterruptedException {
   AbstractBuildContext context = AbstractBuildContext.createContextFromMap(configuration);
   CurrentBuildResult result = buildContext.getBuildResult();
   if (!BuildState.SUCCESS.equals(result.getBuildState())) {
     safeRevertWorkingCopy();
     if (tagCreated) {
       safeDeleteLabel(context.releaseManagementContext.getTagUrl());
     }
   } else {
     log("Closing connection to perforce server");
     perforce.closeConnection();
   }
 }
 @Override
 public void beforeDevelopmentVersionChange() throws IOException {
   currentChangeListId = perforce.getDefaultChangeListId();
 }
 @Override
 public void beforeReleaseVersionChange() throws IOException {
   currentChangeListId = perforce.createNewChangeList();
 }
 @Override
 public void prepare() throws IOException {
   perforce = new PerforceManager(context, repository, buildLogger);
   perforce.prepare();
 }
 @Override
 public void edit(File file) throws IOException, InterruptedException {
   log("Opening file: '" + file.getAbsolutePath() + "' for editing");
   perforce.edit(currentChangeListId, file);
 }