src/Pure/System/build.scala
changeset 48421 c4d337782de4
parent 48419 6d7b6e47f3ef
child 48422 9613780a805b
--- a/src/Pure/System/build.scala	Sat Jul 21 21:16:08 2012 +0200
+++ b/src/Pure/System/build.scala	Sat Jul 21 22:13:50 2012 +0200
@@ -17,10 +17,10 @@
 {
   /** session information **/
 
-  type Options = List[(String, Option[String])]
-
   object Session
   {
+    /* Key */
+
     object Key
     {
       object Ordering extends scala.math.Ordering[Key]
@@ -38,13 +38,24 @@
       override def toString: String = name
     }
 
+
+    /* Info */
+
+    sealed abstract class Status
+    case object Pending extends Status
+    case object Running extends Status
+
     sealed case class Info(
       dir: Path,
       parent: Option[String],
       description: String,
       options: Options,
-      theories: List[(Options, List[String])],
-      files: List[String])
+      theories: List[(Options, List[Path])],
+      files: List[Path],
+      status: Status = Pending)
+
+
+    /* Queue */
 
     object Queue
     {
@@ -101,8 +112,8 @@
     path: Option[String],
     parent: Option[String],
     description: String,
-    options: Options,
-    theories: List[(Options, List[String])],
+    options: List[Options.Spec],
+    theories: List[(List[Options.Spec], List[String])],
     files: List[String])
 
   private object Parser extends Parse.Parser
@@ -161,7 +172,8 @@
 
   private def is_pure(name: String): Boolean = name == "RAW" || name == "Pure"
 
-  private def sessions_root(dir: Path, root: JFile, queue: Session.Queue): Session.Queue =
+  private def sessions_root(options: Options, dir: Path, root: JFile, queue: Session.Queue)
+    : Session.Queue =
   {
     (queue /: Parser.parse_entries(root))((queue1, entry) =>
       try {
@@ -187,9 +199,13 @@
           }
 
         val key = Session.Key(full_name, entry.order)
+
+        val theories =
+          entry.theories.map({ case (opts, thys) => (options ++ opts, thys.map(Path.explode(_))) })
+        val files = entry.files.map(Path.explode(_))
         val info =
           Session.Info(dir + path, entry.parent,
-            entry.description, entry.options, entry.theories, entry.files)
+            entry.description, options ++ entry.options, theories, files)
 
         queue1 + (key, info)
       }
@@ -200,22 +216,24 @@
       })
   }
 
-  private def sessions_dir(strict: Boolean, dir: Path, queue: Session.Queue): Session.Queue =
+  private def sessions_dir(options: Options, strict: Boolean, dir: Path, queue: Session.Queue)
+    : Session.Queue =
   {
     val root = (dir + ROOT).file
-    if (root.isFile) sessions_root(dir, root, queue)
+    if (root.isFile) sessions_root(options, dir, root, queue)
     else if (strict) error("Bad session root file: " + quote(root.toString))
     else queue
   }
 
-  private def sessions_catalog(dir: Path, catalog: JFile, queue: Session.Queue): Session.Queue =
+  private def sessions_catalog(options: Options, dir: Path, catalog: JFile, queue: Session.Queue)
+    : Session.Queue =
   {
     val dirs =
       split_lines(File.read(catalog)).filterNot(line => line == "" || line.startsWith("#"))
     (queue /: dirs)((queue1, dir1) =>
       try {
         val dir2 = dir + Path.explode(dir1)
-        if (dir2.file.isDirectory) sessions_dir(true, dir2, queue1)
+        if (dir2.file.isDirectory) sessions_dir(options, true, dir2, queue1)
         else error("Bad session directory: " + dir2.toString)
       }
       catch {
@@ -224,20 +242,20 @@
       })
   }
 
-  def find_sessions(all_sessions: Boolean, sessions: List[String],
+  def find_sessions(options: Options, all_sessions: Boolean, sessions: List[String],
     more_dirs: List[Path]): Session.Queue =
   {
     var queue = Session.Queue.empty
 
     for (dir <- Isabelle_System.components()) {
-      queue = sessions_dir(false, dir, queue)
+      queue = sessions_dir(options, false, dir, queue)
 
       val catalog = (dir + SESSIONS).file
       if (catalog.isFile)
-        queue = sessions_catalog(dir, catalog, queue)
+        queue = sessions_catalog(options, dir, catalog, queue)
     }
 
-    for (dir <- more_dirs) queue = sessions_dir(true, dir, queue)
+    for (dir <- more_dirs) queue = sessions_dir(options, true, dir, queue)
 
     sessions.filter(name => !queue.defined(name)) match {
       case Nil =>
@@ -300,9 +318,8 @@
     val args_xml =
     {
       import XML.Encode._
-      def symbol_string: T[String] = (s => string(Symbol.encode(s)))
-      pair(bool, pair(symbol_string, pair(symbol_string, list(symbol_string))))(
-        save, (parent, (name, info.theories.map(_._2).flatten)))
+      pair(bool, pair(string, pair(string, list(string))))(
+        save, (parent, (name, info.theories.map(_._2).flatten.map(_.implode))))
     }
     new Build_Job(cwd, env, script, YXML.string_of_body(args_xml))
   }
@@ -311,7 +328,7 @@
     more_dirs: List[Path], more_options: List[String], sessions: List[String]): Int =
   {
     val options = (Options.init() /: more_options)(_.define_simple(_))
-    val queue = find_sessions(all_sessions, sessions, more_dirs)
+    val queue = find_sessions(options, all_sessions, sessions, more_dirs)
 
 
     // prepare browser info dir