src/Pure/System/build.scala
changeset 48361 63bdba7c1366
parent 48354 aa1e730c3fdd
child 48363 cf081b7042d2
equal deleted inserted replaced
48360:631d286e97b0 48361:63bdba7c1366
   143   }
   143   }
   144 
   144 
   145 
   145 
   146   /* find sessions */
   146   /* find sessions */
   147 
   147 
   148   private def sessions_root(dir: Path, root: File, sessions: Session.Queue): Session.Queue =
   148   private val ROOT = Path.explode("ROOT")
   149   {
   149   private val SESSIONS = Path.explode("etc/sessions")
   150     (sessions /: Parser.parse_entries(root))((sessions1, entry) =>
   150 
       
   151   private def sessions_root(dir: Path, root: File, queue: Session.Queue): Session.Queue =
       
   152   {
       
   153     (queue /: Parser.parse_entries(root))((queue1, entry) =>
   151       try {
   154       try {
   152         if (entry.name == "") error("Bad session name")
   155         if (entry.name == "") error("Bad session name")
   153 
   156 
   154         val full_name =
   157         val full_name =
   155           if (entry.name == "RAW" || entry.name == "Pure") {
   158           if (entry.name == "RAW" || entry.name == "Pure") {
   156             if (entry.parent.isDefined) error("Illegal parent session")
   159             if (entry.parent.isDefined) error("Illegal parent session")
   157             else entry.name
   160             else entry.name
   158           }
   161           }
   159           else
   162           else
   160             entry.parent match {
   163             entry.parent match {
   161               case Some(parent_name) if sessions1.defined(parent_name) =>
   164               case Some(parent_name) if queue1.defined(parent_name) =>
   162                 if (entry.reset) entry.name
   165                 if (entry.reset) entry.name
   163                 else parent_name + "-" + entry.name
   166                 else parent_name + "-" + entry.name
   164               case _ => error("Bad parent session")
   167               case _ => error("Bad parent session")
   165             }
   168             }
   166 
   169 
   172 
   175 
   173         val key = Session.Key(full_name, entry.order)
   176         val key = Session.Key(full_name, entry.order)
   174         val info = Session.Info(dir + path, entry.description, entry.options,
   177         val info = Session.Info(dir + path, entry.description, entry.options,
   175           entry.theories.map({ case (x, ys) => ys.map(y => (x, y)) }).flatten, entry.files)
   178           entry.theories.map({ case (x, ys) => ys.map(y => (x, y)) }).flatten, entry.files)
   176 
   179 
   177         sessions1 + (key, info, entry.parent)
   180         queue1 + (key, info, entry.parent)
   178       }
   181       }
   179       catch {
   182       catch {
   180         case ERROR(msg) =>
   183         case ERROR(msg) =>
   181           error(msg + "\nThe error(s) above occurred in session entry " +
   184           error(msg + "\nThe error(s) above occurred in session entry " +
   182             quote(entry.name) + " (file " + quote(root.toString) + ")")
   185             quote(entry.name) + " (file " + quote(root.toString) + ")")
   183       })
   186       })
   184   }
   187   }
   185 
   188 
   186   private def sessions_dir(strict: Boolean, dir: Path, sessions: Session.Queue): Session.Queue =
   189   private def sessions_dir(strict: Boolean, dir: Path, queue: Session.Queue): Session.Queue =
   187   {
   190   {
   188     val root = Isabelle_System.platform_file(dir + Path.basic("ROOT"))
   191     val root = Isabelle_System.platform_file(dir + ROOT)
   189     if (root.isFile) sessions_root(dir, root, sessions)
   192     if (root.isFile) sessions_root(dir, root, queue)
   190     else if (strict) error("Bad session root file: " + quote(root.toString))
   193     else if (strict) error("Bad session root file: " + quote(root.toString))
   191     else sessions
   194     else queue
   192   }
   195   }
   193 
   196 
   194   private def sessions_catalog(dir: Path, catalog: File, sessions: Session.Queue): Session.Queue =
   197   private def sessions_catalog(dir: Path, catalog: File, queue: Session.Queue): Session.Queue =
   195   {
   198   {
   196     val dirs =
   199     val dirs =
   197       split_lines(Standard_System.read_file(catalog)).
   200       split_lines(Standard_System.read_file(catalog)).
   198         filterNot(line => line == "" || line.startsWith("#"))
   201         filterNot(line => line == "" || line.startsWith("#"))
   199     (sessions /: dirs)((sessions1, dir1) =>
   202     (queue /: dirs)((queue1, dir1) =>
   200       try {
   203       try {
   201         val dir2 = dir + Path.explode(dir1)
   204         val dir2 = dir + Path.explode(dir1)
   202         if (Isabelle_System.platform_file(dir2).isDirectory) sessions_dir(true, dir2, sessions1)
   205         if (Isabelle_System.platform_file(dir2).isDirectory) sessions_dir(true, dir2, queue1)
   203         else error("Bad session directory: " + dir2.toString)
   206         else error("Bad session directory: " + dir2.toString)
   204       }
   207       }
   205       catch {
   208       catch {
   206         case ERROR(msg) =>
   209         case ERROR(msg) =>
   207           error(msg + "\nThe error(s) above occurred in session catalog " + quote(catalog.toString))
   210           error(msg + "\nThe error(s) above occurred in session catalog " + quote(catalog.toString))
   208       })
   211       })
   209   }
   212   }
   210 
   213 
   211   def find_sessions(more_dirs: List[Path]): Session.Queue =
   214   def find_sessions(more_dirs: List[Path]): Session.Queue =
   212   {
   215   {
   213     var sessions = Session.Queue.empty
   216     var queue = Session.Queue.empty
   214 
   217 
   215     for (dir <- Isabelle_System.components()) {
   218     for (dir <- Isabelle_System.components()) {
   216       sessions = sessions_dir(false, dir, sessions)
   219       queue = sessions_dir(false, dir, queue)
   217 
   220 
   218       val catalog = Isabelle_System.platform_file(dir + Path.explode("etc/sessions"))
   221       val catalog = Isabelle_System.platform_file(dir + SESSIONS)
   219       if (catalog.isFile)
   222       if (catalog.isFile)
   220         sessions = sessions_catalog(dir, catalog, sessions)
   223         queue = sessions_catalog(dir, catalog, queue)
   221     }
   224     }
   222 
   225 
   223     for (dir <- more_dirs) sessions = sessions_dir(true, dir, sessions)
   226     for (dir <- more_dirs) queue = sessions_dir(true, dir, queue)
   224 
   227 
   225     sessions
   228     queue
   226   }
   229   }
   227 
   230 
   228 
   231 
   229 
   232 
   230   /** build **/
   233   /** build **/