PageRenderTime 51ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/opup/src/main/scala/CreateUpgradeBranches.scala

https://bitbucket.org/jwalton/opup
Scala | 207 lines | 143 code | 55 blank | 9 comment | 7 complexity | e5350a6e382c44a21074511a5ca6b0e1 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. import java.io.BufferedWriter;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.Writer;
  8. import java.util.ArrayList;
  9. import java.util.Collection;
  10. import java.util.Collections;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. import com.atlassian.labs.opup.HttpAuthentication
  15. import com.atlassian.labs.opup.ObsoleteAdvice;
  16. import com.atlassian.labs.opup.OpupProperties;
  17. import com.atlassian.labs.opup.PomScanner;
  18. import com.atlassian.labs.opup.Report;
  19. import com.atlassian.labs.opup.UpgradeBranchCreator
  20. import com.atlassian.labs.opup.UpgradeSchedule;
  21. import com.atlassian.labs.opup.UpgradeStrategy;
  22. import com.atlassian.labs.opup.VersionChanger;
  23. import com.atlassian.labs.opup.VersionClient;
  24. import com.atlassian.labs.opup.VersionOverrides;
  25. import com.atlassian.labs.opup.VerySimpleCache;
  26. import org.apache.maven.artifact.versioning.ArtifactVersion;
  27. import org.apache.maven.model.Model;
  28. import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
  29. import org.eclipse.jgit.api.Git;
  30. import org.eclipse.jgit.lib.RepositoryBuilder;
  31. import scala.collection.JavaConverters._
  32. /**
  33. * Main entry point, with hardcoded paths.
  34. */
  35. object CreateUpgradeBranches {
  36. def main(args : Array[String]) : Unit = {
  37. val props = OpupProperties.get();
  38. val ps = new PomScanner();
  39. val versionOverrides = new VersionOverrides();
  40. versionOverrides.load(props.getBadArtifactsFile());
  41. versionOverrides.requireFinal(props.getRequireFinal());
  42. val obsoleteAdvice = ObsoleteAdvice.load(props.getObsoleteArtifactsFile());
  43. val cache = new VerySimpleCache(props.getCacheDirectory(), HttpAuthentication.fromConsole);
  44. val vc = new VersionClient(cache, props.getNexusUrl(), versionOverrides);
  45. val mainPom = new MavenXpp3Reader().read(new FileInputStream(new File(props.getBaseDirectory(), "pom.xml")));
  46. val target = new File("target");
  47. if (!target.isDirectory())
  48. {
  49. target.mkdir();
  50. }
  51. val report = new Report(mainPom.getGroupId(), mainPom.getArtifactId(), mainPom.getVersion());
  52. report.copyStylesheet(target);
  53. val poms = PomScanner.pomFiles(props.getBaseDirectory()).asScala;
  54. ps.process(poms)
  55. ps.findCurrent(report);
  56. val currentVersions = ps.getCurrentVersions();
  57. val currentProperties = ps.getCurrentProperties();
  58. // var targetVersions: Map[String, ArtifactVersion] = _
  59. report.setUpgradeStrategy(props.getUpgradeStrategy());
  60. val targetVersions = new UpgradeStrategy(cache).getUpgradeTarget(props.getUpgradeStrategy(), ps.getCurrentVersions().asScala.toMap);
  61. // System.out.println("Target versions: " + targetVersions);
  62. var upgradeSchedule = UpgradeSchedule.from(currentVersions, ps, vc, obsoleteAdvice, report, targetVersions);
  63. // System.out.println("To change: " + upgradeSchedule.newVersions.size() + " + " + upgradeSchedule.newProperties.size());
  64. upgradeSchedule = upgradeSchedule.withUpgrades();
  65. report.schedule(currentVersions, ps.getCurrentProperties(), upgradeSchedule);
  66. val w = new FileWriter(new File(target, "report.html"));
  67. try
  68. {
  69. report.writeReport(w);
  70. }
  71. finally
  72. {
  73. w.close();
  74. }
  75. // System.exit(0);
  76. val changerForEverything = new VersionChanger();
  77. changerForEverything.setKey("all");
  78. val allChanges = new HashMap[String, List[VersionChanger]]();
  79. val changeKeys = new ArrayList[String]();
  80. for (e <- upgradeSchedule.getNewVersions().entrySet().asScala)
  81. {
  82. val sb = new StringBuilder(e.getKey());
  83. sb.append(',');
  84. sb.append(currentVersions.get(e.getKey()));
  85. val branchName = "artifact-" + (e.getKey().replaceAll("[^a-zA-Z0-9]", "_"));
  86. val cl = new ArrayList[VersionChanger]();
  87. for (v <- e.getValue.asScala)
  88. {
  89. val changer = new VersionChanger();
  90. changer.setNewVersion(e.getKey(), v);
  91. changer.setKey(e.getKey() + ":" + v);
  92. changerForEverything.setNewVersion(e.getKey(), v);
  93. cl.add(changer);
  94. sb.append(',');
  95. sb.append(v);
  96. }
  97. allChanges.put(branchName, cl);
  98. changeKeys.add(sb.toString());
  99. }
  100. for (e <- upgradeSchedule.getNewProperties().entrySet().asScala)
  101. {
  102. val sb = new StringBuilder(e.getKey());
  103. sb.append(',');
  104. sb.append(currentProperties.get(e.getKey()));
  105. val branchName = "property-" + e.getKey();
  106. val cl = new ArrayList[VersionChanger]();
  107. for (v <- e.getValue.asScala)
  108. {
  109. val changer = new VersionChanger();
  110. changer.setNewPropertyValue(e.getKey(), v);
  111. changer.setKey(e.getKey() + ":" + v);
  112. changerForEverything.setNewPropertyValue(e.getKey(), v);
  113. cl.add(changer);
  114. sb.append(',');
  115. sb.append(v);
  116. }
  117. allChanges.put(branchName, cl);
  118. changeKeys.add(sb.toString());
  119. }
  120. allChanges.put("all", Collections.singletonList(changerForEverything));
  121. /* Create the branches */
  122. val repo = new RepositoryBuilder().setWorkTree(props.getBaseDirectory()).build();
  123. val git = new Git(repo);
  124. val upgradeBranchCreator = new UpgradeBranchCreator(git)
  125. upgradeBranchCreator.checkout("master")
  126. val log = (s: String) => println(s)
  127. upgradeBranchCreator.deleteAllOpupBranches(log)
  128. val commits = upgradeBranchCreator.createBranches(
  129. allChanges.asScala.map(e => (e._1, e._2.asScala.toSeq)).toMap,
  130. poms,
  131. log)
  132. upgradeBranchCreator.checkout("master")
  133. val commitKeys = for ((cmtId, changer) <- commits) yield changer.getKey() + "," + cmtId.getName()
  134. /* Write out the state */
  135. writeLines("target/opup/change.keys", changeKeys.asScala);
  136. writeLines("target/opup/commit.keys", commitKeys);
  137. }
  138. def writeLines(filename: String, lines: Iterable[String]) = {
  139. val bw = new BufferedWriter(new FileWriter(filename));
  140. try
  141. {
  142. for (l <- lines) {
  143. bw.write(l)
  144. bw.newLine()
  145. }
  146. }
  147. finally
  148. {
  149. bw.close();
  150. }
  151. }
  152. }