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 **/ |