/src/main/java/org/jfrog/bamboo/release/vcs/perforce/PerforceCoordinator.java

https://github.com/JFrogDev/bamboo-artifactory-plugin · Java · 145 lines · 120 code · 20 blank · 5 comment · 8 complexity · 50e0c1bf646566a2810260e6c0221fa5 MD5 · raw file

  1. package org.jfrog.bamboo.release.vcs.perforce;
  2. import com.atlassian.bamboo.build.logger.BuildLogger;
  3. import com.atlassian.bamboo.builder.BuildState;
  4. import com.atlassian.bamboo.credentials.CredentialsAccessor;
  5. import com.atlassian.bamboo.v2.build.BuildContext;
  6. import com.atlassian.bamboo.v2.build.CurrentBuildResult;
  7. import com.atlassian.bamboo.variable.CustomVariableContext;
  8. import org.jfrog.bamboo.context.PackageManagersContext;
  9. import org.jfrog.bamboo.release.vcs.AbstractVcsCoordinator;
  10. import java.io.File;
  11. import java.io.IOException;
  12. import java.util.Map;
  13. /**
  14. * Perforce coordinator that will perform SCM operations that are specific to the Perforce SCM.
  15. *
  16. * @author Shay Yaakov
  17. */
  18. public class PerforceCoordinator extends AbstractVcsCoordinator {
  19. private PerforceManager perforce;
  20. private final Map<String, String> configuration;
  21. private boolean tagCreated;
  22. private int currentChangeListId;
  23. public PerforceCoordinator(BuildContext context, Map<String, String> configuration, BuildLogger buildLogger,
  24. CustomVariableContext customVariableContext, CredentialsAccessor credentialsAccessor) {
  25. super(context, buildLogger, customVariableContext, credentialsAccessor);
  26. this.configuration = configuration;
  27. }
  28. @Override
  29. public void prepare() throws IOException {
  30. perforce = new PerforceManager(context, buildLogger);
  31. perforce.prepare();
  32. }
  33. @Override
  34. public void beforeReleaseVersionChange() throws IOException {
  35. currentChangeListId = perforce.createNewChangeList();
  36. }
  37. @Override
  38. public void afterSuccessfulReleaseVersionBuild() throws IOException, InterruptedException {
  39. PackageManagersContext context = PackageManagersContext.createContextFromMap(configuration);
  40. PackageManagersContext.ReleaseManagementContext releaseManagementContext = context.releaseManagementContext;
  41. String labelChangeListId = configuration.get("repository.revision.number");
  42. if (modifiedFilesForReleaseVersion) {
  43. log("Submitting release version changes");
  44. labelChangeListId = currentChangeListId + "";
  45. perforce.commitWorkingCopy(currentChangeListId, releaseManagementContext.getTagComment());
  46. } else {
  47. safeRevertWorkingCopy();
  48. currentChangeListId = perforce.getDefaultChangeListId();
  49. }
  50. if (releaseManagementContext.isCreateVcsTag()) {
  51. log("Creating label: '" + releaseManagementContext.getTagUrl() + "' with change list id: " + labelChangeListId);
  52. perforce.createTag(releaseManagementContext.getTagUrl(), releaseManagementContext.getTagComment(),
  53. labelChangeListId);
  54. tagCreated = true;
  55. }
  56. }
  57. @Override
  58. public void beforeDevelopmentVersionChange() throws IOException {
  59. currentChangeListId = perforce.getDefaultChangeListId();
  60. }
  61. @Override
  62. public void afterDevelopmentVersionChange(boolean modified) throws IOException, InterruptedException {
  63. super.afterDevelopmentVersionChange(modified);
  64. PackageManagersContext context = PackageManagersContext.createContextFromMap(configuration);
  65. PackageManagersContext.ReleaseManagementContext releaseManagementContext = context.releaseManagementContext;
  66. if (modified) {
  67. log("Submitting next development version changes");
  68. perforce.commitWorkingCopy(currentChangeListId, releaseManagementContext.getNextDevelopmentComment());
  69. } else {
  70. safeRevertWorkingCopy();
  71. currentChangeListId = perforce.getDefaultChangeListId();
  72. }
  73. }
  74. @Override
  75. public void edit(File file) throws IOException, InterruptedException {
  76. log("Opening file: '" + file.getAbsolutePath() + "' for editing");
  77. perforce.edit(currentChangeListId, file);
  78. }
  79. @Override
  80. public void buildCompleted(BuildContext buildContext) throws IOException, InterruptedException {
  81. PackageManagersContext context = PackageManagersContext.createContextFromMap(configuration);
  82. CurrentBuildResult result = buildContext.getBuildResult();
  83. if (!BuildState.SUCCESS.equals(result.getBuildState())) {
  84. safeRevertWorkingCopy();
  85. if (tagCreated) {
  86. safeDeleteLabel(context.releaseManagementContext.getTagUrl());
  87. }
  88. } else {
  89. log("Closing connection to perforce server");
  90. perforce.closeConnection();
  91. }
  92. }
  93. private void safeRevertWorkingCopy() {
  94. log("Reverting local changes");
  95. try {
  96. perforce.revertWorkingCopy(currentChangeListId);
  97. } catch (Exception e) {
  98. log("Failed to revert: " + e.getLocalizedMessage());
  99. }
  100. }
  101. private void safeDeleteLabel(String label) throws IOException {
  102. log("Deleting label '" + label + "'");
  103. try {
  104. perforce.deleteLabel(label);
  105. } catch (Exception e) {
  106. log("Failed to delete label: " + e.getLocalizedMessage());
  107. }
  108. }
  109. @Override
  110. public String getRemoteUrlForPom() {
  111. return null;
  112. }
  113. @Override
  114. public boolean isSubversion() {
  115. return false;
  116. }
  117. @Override
  118. public int getCurrentChangeListId() {
  119. return currentChangeListId;
  120. }
  121. @Override
  122. public void setCurrentChangeListId(int currentChangeListId) {
  123. this.currentChangeListId = currentChangeListId;
  124. }
  125. }