253 |
253 |
254 result.join |
254 result.join |
255 } |
255 } |
256 |
256 |
257 def purge_theories( |
257 def purge_theories( |
258 theories: List[String], |
258 theories: List[String], |
259 qualifier: String = Sessions.DRAFT, |
259 qualifier: String = Sessions.DRAFT, |
260 master_dir: String = "", |
260 master_dir: String = "", |
261 all: Boolean = false): (List[Document.Node.Name], List[Document.Node.Name]) = |
261 all: Boolean = false): (List[Document.Node.Name], List[Document.Node.Name]) = |
262 resources.purge_theories(session, theories = theories, qualifier = qualifier, |
262 { |
263 master_dir = proper_string(master_dir) getOrElse tmp_dir_name, all = all) |
263 val master = proper_string(master_dir) getOrElse tmp_dir_name |
|
264 val nodes = if (all) None else Some(theories.map(resources.import_name(qualifier, master, _))) |
|
265 resources.purge_theories(session, nodes) |
|
266 } |
264 } |
267 } |
265 |
268 |
266 |
269 |
267 /* internal state */ |
270 /* internal state */ |
268 |
271 |
397 session.update(Document.Blobs.empty, theory_edits.flatMap(_._1)) |
400 session.update(Document.Blobs.empty, theory_edits.flatMap(_._1)) |
398 st1.update_theories(theory_edits.map(_._2)) |
401 st1.update_theories(theory_edits.map(_._2)) |
399 }) |
402 }) |
400 } |
403 } |
401 |
404 |
402 def purge_theories(session: Session, |
405 def purge_theories(session: Session, nodes: Option[List[Document.Node.Name]]) |
403 theories: List[String], |
406 : (List[Document.Node.Name], List[Document.Node.Name]) = |
404 qualifier: String, |
407 { |
405 master_dir: String, |
|
406 all: Boolean): (List[Document.Node.Name], List[Document.Node.Name]) = |
|
407 { |
|
408 val nodes = theories.map(import_name(qualifier, master_dir, _)) |
|
409 |
|
410 state.change_result(st => |
408 state.change_result(st => |
411 { |
409 { |
412 val graph = st.theories_graph |
410 val graph = st.theories_graph |
413 val all_nodes = graph.topological_order |
411 val all_nodes = graph.topological_order |
414 |
412 |
415 val purge = |
413 val purge = |
416 (if (all) all_nodes else nodes.filter(graph.defined(_))). |
414 (if (nodes.isEmpty) all_nodes else nodes.get.filter(graph.defined(_))). |
417 filterNot(st.is_required(_)).toSet |
415 filterNot(st.is_required(_)).toSet |
418 |
416 |
419 val retain = graph.all_preds(all_nodes.filterNot(purge)).toSet |
417 val retain = graph.all_preds(all_nodes.filterNot(purge)).toSet |
420 val (retained, purged) = all_nodes.partition(retain) |
418 val (retained, purged) = all_nodes.partition(retain) |
421 |
419 |