PageRenderTime 27ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/atlassian/maven/plugins/jgitflow/manager/DefaultFlowReleaseManager.java

https://bitbucket.org/ronsmits/maven-jgitflow-plugin
Java | 328 lines | 268 code | 45 blank | 15 comment | 14 complexity | eb45f9f63f01998b92c81ccc1e44a397 MD5 | raw file
  1. package com.atlassian.maven.plugins.jgitflow.manager;
  2. import java.io.IOException;
  3. import java.util.List;
  4. import java.util.Map;
  5. import com.atlassian.jgitflow.core.JGitFlow;
  6. import com.atlassian.jgitflow.core.exception.*;
  7. import com.atlassian.jgitflow.core.util.GitHelper;
  8. import com.atlassian.maven.plugins.jgitflow.MavenJGitFlowConfiguration;
  9. import com.atlassian.maven.plugins.jgitflow.ReleaseContext;
  10. import com.atlassian.maven.plugins.jgitflow.exception.JGitFlowReleaseException;
  11. import com.atlassian.maven.plugins.jgitflow.exception.ReactorReloadException;
  12. import com.atlassian.maven.plugins.jgitflow.exception.UnresolvedSnapshotsException;
  13. import com.google.common.base.Joiner;
  14. import org.apache.maven.execution.MavenSession;
  15. import org.apache.maven.project.MavenProject;
  16. import org.apache.maven.shared.release.ReleaseExecutionException;
  17. import org.apache.maven.shared.release.exec.MavenExecutorException;
  18. import org.apache.maven.shared.release.util.ReleaseUtil;
  19. import org.eclipse.jgit.api.errors.*;
  20. import org.eclipse.jgit.lib.Constants;
  21. import org.eclipse.jgit.lib.Ref;
  22. import org.eclipse.jgit.transport.RefSpec;
  23. /**
  24. * @since version
  25. */
  26. public class DefaultFlowReleaseManager extends AbstractFlowReleaseManager
  27. {
  28. @Override
  29. public void start(ReleaseContext ctx, List<MavenProject> reactorProjects, MavenSession session) throws JGitFlowReleaseException
  30. {
  31. try
  32. {
  33. JGitFlow flow = JGitFlow.getOrInit(ctx.getBaseDir(), ctx.getFlowInitContext());
  34. String releaseLabel = startRelease(flow, ctx, reactorProjects, session);
  35. updateReleasePomsWithSnapshot(releaseLabel, flow, ctx, reactorProjects, session);
  36. }
  37. catch (JGitFlowException e)
  38. {
  39. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  40. }
  41. }
  42. @Override
  43. public void finish(ReleaseContext ctx, List<MavenProject> originalProjects, MavenSession session) throws JGitFlowReleaseException
  44. {
  45. JGitFlow flow = null;
  46. MavenJGitFlowConfiguration config = null;
  47. try
  48. {
  49. flow = JGitFlow.getOrInit(ctx.getBaseDir(), ctx.getFlowInitContext());
  50. config = configManager.getConfiguration(flow.git());
  51. finishRelease(flow, config, ctx, originalProjects, session);
  52. }
  53. catch (JGitFlowException e)
  54. {
  55. throw new JGitFlowReleaseException("Error finishing release: " + e.getMessage(), e);
  56. }
  57. catch (IOException e)
  58. {
  59. throw new JGitFlowReleaseException("Error finishing release: " + e.getMessage(), e);
  60. }
  61. }
  62. private String startRelease(JGitFlow flow, ReleaseContext ctx, List<MavenProject> originalProjects, MavenSession session) throws JGitFlowReleaseException
  63. {
  64. String releaseLabel = "";
  65. try
  66. {
  67. //make sure we're on develop
  68. flow.git().checkout().setName(flow.getDevelopBranchName()).call();
  69. //reload the reactor projects for develop
  70. MavenSession developSession = getSessionForBranch(flow, flow.getDevelopBranchName(), originalProjects, session);
  71. List<MavenProject> developProjects = developSession.getSortedProjects();
  72. checkPomForSnapshot(developProjects);
  73. if(!ctx.isAllowSnapshots())
  74. {
  75. List<String> snapshots = projectHelper.checkForNonReactorSnapshots("develop", developProjects);
  76. if(!snapshots.isEmpty())
  77. {
  78. String details = Joiner.on(ls).join(snapshots);
  79. throw new UnresolvedSnapshotsException("Cannot start a release due to snapshot dependencies:" + ls + details);
  80. }
  81. }
  82. if(ctx.isPush() || !ctx.isNoTag())
  83. {
  84. projectHelper.ensureOrigin(developProjects, flow);
  85. }
  86. releaseLabel = getReleaseLabel("releaseStartLabel", ctx, developProjects);
  87. flow.releaseStart(releaseLabel).call();
  88. }
  89. catch (GitAPIException e)
  90. {
  91. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  92. }
  93. catch (ReleaseBranchExistsException e)
  94. {
  95. try
  96. {
  97. List<Ref> refs = GitHelper.listBranchesWithPrefix(flow.git(), flow.getReleaseBranchPrefix());
  98. boolean foundOurRelease = false;
  99. for(Ref ref : refs)
  100. {
  101. if(ref.getName().equals(Constants.R_HEADS + flow.getReleaseBranchPrefix() + releaseLabel))
  102. {
  103. foundOurRelease = true;
  104. break;
  105. }
  106. }
  107. if(foundOurRelease)
  108. {
  109. //since the release branch already exists, just check it out
  110. flow.git().checkout().setName(flow.getReleaseBranchPrefix() + releaseLabel).call();
  111. }
  112. else
  113. {
  114. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  115. }
  116. }
  117. catch (GitAPIException e1)
  118. {
  119. throw new JGitFlowReleaseException("Error checking out existing release branch: " + e1.getMessage(), e1);
  120. }
  121. catch (JGitFlowGitAPIException e1)
  122. {
  123. throw new JGitFlowReleaseException("Error checking out existing release branch: " + e1.getMessage(), e1);
  124. }
  125. }
  126. catch (JGitFlowException e)
  127. {
  128. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  129. }
  130. catch (ReactorReloadException e)
  131. {
  132. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  133. }
  134. catch (IOException e)
  135. {
  136. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  137. }
  138. return releaseLabel;
  139. }
  140. private void finishRelease(JGitFlow flow, MavenJGitFlowConfiguration config, ReleaseContext ctx, List<MavenProject> originalProjects, MavenSession session) throws JGitFlowReleaseException
  141. {
  142. String releaseLabel = "";
  143. try
  144. {
  145. //get the release branch
  146. List<Ref> releaseBranches = GitHelper.listBranchesWithPrefix(flow.git(), flow.getReleaseBranchPrefix());
  147. if (releaseBranches.isEmpty())
  148. {
  149. throw new JGitFlowReleaseException("Could not find release branch!");
  150. }
  151. //there can be only one
  152. String rheadPrefix = Constants.R_HEADS + flow.getReleaseBranchPrefix();
  153. Ref releaseBranch = releaseBranches.get(0);
  154. releaseLabel = releaseBranch.getName().substring(releaseBranch.getName().indexOf(rheadPrefix) + rheadPrefix.length());
  155. //make sure we're on the release branch
  156. flow.git().checkout().setName(flow.getReleaseBranchPrefix() + releaseLabel).call();
  157. //get the reactor projects for release
  158. MavenSession releaseSession = getSessionForBranch(flow, flow.getReleaseBranchPrefix() + releaseLabel, originalProjects, session);
  159. List<MavenProject> releaseProjects = releaseSession.getSortedProjects();
  160. updateReleasePomsWithRelease(releaseLabel,flow,ctx,originalProjects,session);
  161. projectHelper.commitAllChanges(flow.git(), "updating poms for " + releaseLabel + " release");
  162. //reload the reactor projects for release
  163. releaseSession = getSessionForBranch(flow, flow.getReleaseBranchPrefix() + releaseLabel, originalProjects, session);
  164. releaseProjects = releaseSession.getSortedProjects();
  165. checkPomForRelease(releaseProjects);
  166. if(!ctx.isAllowSnapshots())
  167. {
  168. List<String> snapshots = projectHelper.checkForNonReactorSnapshots("release", releaseProjects);
  169. if(!snapshots.isEmpty())
  170. {
  171. String details = Joiner.on(ls).join(snapshots);
  172. throw new UnresolvedSnapshotsException("Cannot finish a release due to snapshot dependencies:" + ls + details);
  173. }
  174. }
  175. MavenProject rootProject = ReleaseUtil.getRootProject(releaseProjects);
  176. if(!ctx.isNoBuild())
  177. {
  178. try
  179. {
  180. mavenExecutionHelper.execute(rootProject, ctx, releaseSession);
  181. }
  182. catch (MavenExecutorException e)
  183. {
  184. throw new JGitFlowReleaseException("Error building: " + e.getMessage(), e);
  185. }
  186. }
  187. Map<String, String> originalVersions = projectHelper.getOriginalVersions("release", releaseProjects);
  188. if(ctx.isPush() || !ctx.isNoTag())
  189. {
  190. projectHelper.ensureOrigin(releaseProjects, flow);
  191. }
  192. getLogger().info("running jgitflow release finish...");
  193. flow.releaseFinish(releaseLabel)
  194. .setPush(ctx.isPush())
  195. .setKeepBranch(ctx.isKeepBranch())
  196. .setNoTag(ctx.isNoTag())
  197. .setSquash(ctx.isSquash())
  198. .setMessage(ReleaseUtil.interpolate(ctx.getTagMessage(), rootProject.getModel()))
  199. .call();
  200. //make sure we're on develop
  201. flow.git().checkout().setName(flow.getDevelopBranchName()).call();
  202. //reload the reactor projects for develop
  203. MavenSession developSession = getSessionForBranch(flow, flow.getDevelopBranchName(), originalProjects, session);
  204. List<MavenProject> developProjects = developSession.getSortedProjects();
  205. String developLabel = getDevelopmentLabel("develop", ctx, developProjects);
  206. updatePomsWithDevelopmentVersion("develop", ctx, developProjects);
  207. projectHelper.commitAllChanges(flow.git(), "updating poms for " + developLabel + " development");
  208. if(ctx.isPush())
  209. {
  210. RefSpec developSpec = new RefSpec(ctx.getFlowInitContext().getDevelop());
  211. flow.git().push().setRemote(Constants.DEFAULT_REMOTE_NAME).setRefSpecs(developSpec).call();
  212. }
  213. config.setLastReleaseVersions(originalVersions);
  214. configManager.saveConfiguration(config, flow.git());
  215. }
  216. catch (JGitFlowException e)
  217. {
  218. throw new JGitFlowReleaseException("Error releasing: " + e.getMessage(), e);
  219. }
  220. catch (GitAPIException e)
  221. {
  222. throw new JGitFlowReleaseException("Error releasing: " + e.getMessage(), e);
  223. }
  224. catch (ReleaseExecutionException e)
  225. {
  226. throw new JGitFlowReleaseException("Error releasing: " + e.getMessage(), e);
  227. }
  228. catch (ReactorReloadException e)
  229. {
  230. throw new JGitFlowReleaseException("Error releasing: " + e.getMessage(), e);
  231. }
  232. catch (IOException e)
  233. {
  234. throw new JGitFlowReleaseException("Error releasing: " + e.getMessage(), e);
  235. }
  236. }
  237. private void updateReleasePomsWithSnapshot(String releaseLabel, JGitFlow flow, ReleaseContext ctx, List<MavenProject> originalProjects, MavenSession session) throws JGitFlowReleaseException
  238. {
  239. try
  240. {
  241. //reload the reactor projects for release
  242. MavenSession releaseSession = getSessionForBranch(flow, flow.getReleaseBranchPrefix() + releaseLabel, originalProjects, session);
  243. List<MavenProject> releaseProjects = releaseSession.getSortedProjects();
  244. updatePomsWithReleaseSnapshotVersion("releaseStartLabel", releaseLabel, ctx, releaseProjects);
  245. projectHelper.commitAllChanges(flow.git(), "updating poms for " + releaseLabel + " release");
  246. }
  247. catch (GitAPIException e)
  248. {
  249. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  250. }
  251. catch (ReactorReloadException e)
  252. {
  253. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  254. }
  255. catch (IOException e)
  256. {
  257. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  258. }
  259. }
  260. private void updateReleasePomsWithRelease(String releaseLabel, JGitFlow flow, ReleaseContext ctx, List<MavenProject> originalProjects, MavenSession session) throws JGitFlowReleaseException
  261. {
  262. try
  263. {
  264. //reload the reactor projects for release
  265. MavenSession releaseSession = getSessionForBranch(flow, flow.getReleaseBranchPrefix() + releaseLabel, originalProjects, session);
  266. List<MavenProject> releaseProjects = releaseSession.getSortedProjects();
  267. updatePomsWithReleaseVersion("releaseFinishLabel", releaseLabel, ctx, releaseProjects);
  268. projectHelper.commitAllChanges(flow.git(), "updating poms for " + releaseLabel + " release");
  269. }
  270. catch (GitAPIException e)
  271. {
  272. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  273. }
  274. catch (ReactorReloadException e)
  275. {
  276. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  277. }
  278. catch (IOException e)
  279. {
  280. throw new JGitFlowReleaseException("Error starting release: " + e.getMessage(), e);
  281. }
  282. }
  283. }