src/Pure/Admin/build_release.scala
changeset 64203 2f9a1c76f731
parent 64202 967515846691
child 64204 db9ac35cae0d
--- a/src/Pure/Admin/build_release.scala	Thu Oct 13 23:44:40 2016 +0200
+++ b/src/Pure/Admin/build_release.scala	Fri Oct 14 16:53:26 2016 +0200
@@ -9,6 +9,9 @@
 
 object Build_Release
 {
+  sealed case class Release_Info(
+    date: Date, name: String, dist_dir: Path, dist_archive: Path, dist_library_archive: Path)
+
   def build_release(base_dir: Path,
     progress: Progress = Ignore_Progress,
     rev: String = "",
@@ -16,58 +19,82 @@
     release_name: String = "",
     build_library: Boolean = false,
     parallel_jobs: Int = 1,
-    remote_mac: String = "")
+    remote_mac: String = ""): Release_Info =
   {
     /* release info */
 
-    val release_date = Date.now()
-
-    val distribution_name =
-      if (release_name != "") release_name
-      else "Isabelle_" + Date.Format.date(release_date)
-
-    val distribution_dir = base_dir + Path.explode("dist-" + distribution_name)
+    val release_info =
+    {
+      val date = Date.now()
+      val name = if (release_name != "") release_name else "Isabelle_" + Date.Format.date(date)
+      val dist_dir = base_dir + Path.explode("dist-" + name)
+      val dist_archive = dist_dir + Path.explode(name + ".tar.gz")
+      val dist_library_archive = dist_dir + Path.explode(name + "_library.tar.gz")
+      Release_Info(date, name, dist_dir, dist_archive, dist_library_archive)
+    }
 
 
     /* make distribution */
 
-    progress.bash(
-      "isabelle makedist -d " + File.bash_path(base_dir) + " -j" + parallel_jobs.toString +
-        (if (official_release) " -O" else "") +
-        (if (release_name != "") " -r " + File.bash_string(release_name) else "") +
-        (if (rev != "") " " + File.bash_string(rev) else ""),
-      echo = true).check
+    val jobs_option = " -j" + parallel_jobs.toString
+
+    if (release_info.dist_archive.is_file)
+      progress.echo("Release archive " + release_info.dist_archive + " already exists")
+    else {
+      progress.echo("Producing release archive " + release_info.dist_archive + " ...")
+      progress.bash(
+        "isabelle makedist -d " + File.bash_path(base_dir) + jobs_option +
+          (if (official_release) " -O" else "") +
+          (if (release_name != "") " -r " + File.bash_string(release_name) else "") +
+          (if (rev != "") " " + File.bash_string(rev) else ""),
+        echo = true).check
+    }
 
 
     /* make application bundles */
 
-    for (platform_family <- List("linux", "windows", "windows64", "macos")) {
-      progress.echo("\n*** " + platform_family + " ***")
-      progress.bash(
-        "isabelle makedist_bundle " +
-          File.bash_path(distribution_dir + Path.explode(distribution_name + ".tar.gz")) +
-          " " + File.bash_string(platform_family) +
-          (if (remote_mac == "") "" else " " + File.bash_string(remote_mac)),
-        echo = true).check
+    val platform_bundles =
+      List("linux" -> (release_info.name + "_app.tar.gz"),
+        "windows" -> (release_info.name + "-win32.exe"),
+        "windows64" -> (release_info.name + "-win64.exe"),
+        "macos" -> (release_info.name + ".dmg"))
+
+    for ((platform_family, bundle) <- platform_bundles) {
+      val bundle_archive =
+        release_info.dist_dir +
+          Path.explode(
+            if (platform_family == "macos" && remote_mac.isEmpty)
+              release_info.name + "_dmg.tar.gz"
+            else bundle)
+      if (bundle_archive.is_file)
+        progress.echo("Application bundle " + bundle_archive + " already exists")
+      else {
+        progress.echo("\n*** " + platform_family + ": " + bundle_archive + " ***")
+        progress.bash(
+          "isabelle makedist_bundle " + File.bash_path(release_info.dist_archive) +
+            " " + File.bash_string(platform_family) +
+            (if (remote_mac == "") "" else " " + File.bash_string(remote_mac)),
+          echo = true).check
+      }
     }
 
 
     /* minimal website */
 
-    File.write(distribution_dir + Path.explode("index.html"),
+    File.write(release_info.dist_dir + Path.explode("index.html"),
 """<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
 <html>
 <head>
-<title>""" + HTML.output(distribution_name) + """</title>
+<title>""" + HTML.output(release_info.name) + """</title>
 </head>
 
 <body>
-<h1>""" + HTML.output(distribution_name) + """</h1>
+<h1>""" + HTML.output(release_info.name) + """</h1>
 <ul>
-<li><a href=""" + "\"" + HTML.output(distribution_name) + """_app.tar.gz">Linux</a></li>
-<li><a href=""" + "\"" + HTML.output(distribution_name) + """-win32.exe">Windows</a></li>
-<li><a href=""" + "\"" + HTML.output(distribution_name) + """-win64.exe">Windows (64bit)</a></li>
-<li><a href=""" + "\"" + HTML.output(distribution_name) + """.dmg">Mac OS X</a></li>
+""" +
+  cat_lines(platform_bundles.map({ case (a, b) =>
+    "<li><a href=" + quote(HTML.output(a)) + ">" + HTML.output(b) + "</a></li>" })) +
+"""
 </ul>
 </body>
 
@@ -77,11 +104,19 @@
 
     /* HTML library */
 
-    if (build_library)
-      progress.bash("\"$ISABELLE_HOME/Admin/Release/build_library\" -j" + parallel_jobs.toString +
-        File.bash_path(distribution_dir +
-          Path.explode(distribution_name + "_" +
-            Isabelle_System.getenv_strict("ISABELLE_PLATFORM_FAMILY") + ".tar.gz"))).check
+    if (build_library) {
+      if (release_info.dist_library_archive.is_file)
+        progress.echo("Library archive " + release_info.dist_library_archive + " already exists")
+      else {
+        progress.bash("\"$ISABELLE_HOME/Admin/Release/build_library\"" + jobs_option + " " +
+          File.bash_path(release_info.dist_dir +
+            Path.explode(release_info.name + "_" +
+              Isabelle_System.getenv_strict("ISABELLE_PLATFORM_FAMILY") + ".tar.gz"))).check
+      }
+    }
+
+
+    release_info
   }