185 private val ROOT = Path.explode("ROOT") |
185 private val ROOT = Path.explode("ROOT") |
186 private val SESSIONS = Path.explode("etc/sessions") |
186 private val SESSIONS = Path.explode("etc/sessions") |
187 |
187 |
188 private def is_pure(name: String): Boolean = name == "RAW" || name == "Pure" |
188 private def is_pure(name: String): Boolean = name == "RAW" || name == "Pure" |
189 |
189 |
190 private def sessions_root(options: Options, dir: Path, root: Path, queue: Session.Queue) |
190 private def sessions_root(options: Options, dir: Path, queue: Session.Queue, root: Path) |
191 : Session.Queue = |
191 : Session.Queue = |
192 { |
192 { |
193 (queue /: Parser.parse_entries(root))((queue1, entry) => |
193 (queue /: Parser.parse_entries(root))((queue1, entry) => |
194 try { |
194 try { |
195 if (entry.base_name == "") error("Bad session name") |
195 if (entry.base_name == "") error("Bad session name") |
233 error(msg + "\nThe error(s) above occurred in session entry " + |
233 error(msg + "\nThe error(s) above occurred in session entry " + |
234 quote(entry.base_name) + Position.str_of(root.position)) |
234 quote(entry.base_name) + Position.str_of(root.position)) |
235 }) |
235 }) |
236 } |
236 } |
237 |
237 |
238 private def sessions_dir(options: Options, strict: Boolean, dir: Path, queue: Session.Queue) |
238 private def sessions_dir(options: Options, strict: Boolean, queue: Session.Queue, dir: Path) |
239 : Session.Queue = |
239 : Session.Queue = |
240 { |
240 { |
241 val root = dir + ROOT |
241 val root = dir + ROOT |
242 if (root.is_file) sessions_root(options, dir, root, queue) |
242 if (root.is_file) sessions_root(options, dir, queue, root) |
243 else if (strict) error("Bad session root file: " + root.toString) |
243 else if (strict) error("Bad session root file: " + root.toString) |
244 else queue |
244 else queue |
245 } |
245 } |
246 |
246 |
247 private def sessions_catalog(options: Options, dir: Path, catalog: Path, queue: Session.Queue) |
|
248 : Session.Queue = |
|
249 { |
|
250 val dirs = |
|
251 split_lines(File.read(catalog)).filterNot(line => line == "" || line.startsWith("#")) |
|
252 (queue /: dirs)((queue1, dir1) => |
|
253 try { |
|
254 val dir2 = dir + Path.explode(dir1) |
|
255 if (dir2.is_dir) sessions_dir(options, true, dir2, queue1) |
|
256 else error("Bad session directory: " + dir2.toString) |
|
257 } |
|
258 catch { |
|
259 case ERROR(msg) => |
|
260 error(msg + "\nThe error(s) above occurred in session catalog " + catalog.toString) |
|
261 }) |
|
262 } |
|
263 |
|
264 def find_sessions(options: Options, more_dirs: List[Path]): Session.Queue = |
247 def find_sessions(options: Options, more_dirs: List[Path]): Session.Queue = |
265 { |
248 { |
266 var queue = Session.Queue.empty |
249 val queue1 = |
267 |
250 (Session.Queue.empty /: Isabelle_System.components())(sessions_dir(options, false, _, _)) |
268 for (dir <- Isabelle_System.components()) { |
251 val queue2 = (queue1 /: more_dirs)(sessions_dir(options, true, _, _)) |
269 queue = sessions_dir(options, false, dir, queue) |
252 queue2 |
270 |
|
271 val catalog = dir + SESSIONS |
|
272 if (catalog.is_file) queue = sessions_catalog(options, dir, catalog, queue) |
|
273 } |
|
274 |
|
275 for (dir <- more_dirs) queue = sessions_dir(options, true, dir, queue) |
|
276 |
|
277 queue |
|
278 } |
253 } |
279 |
254 |
280 |
255 |
281 |
256 |
282 /** build **/ |
257 /** build **/ |