src/Pure/Admin/afp.scala
changeset 69974 916726680a66
parent 69973 a3e3be17dca5
child 69975 35cc58a54ffc
equal deleted inserted replaced
69973:a3e3be17dca5 69974:916726680a66
     3 
     3 
     4 Administrative support for the Archive of Formal Proofs.
     4 Administrative support for the Archive of Formal Proofs.
     5 */
     5 */
     6 
     6 
     7 package isabelle
     7 package isabelle
       
     8 
       
     9 
       
    10 import scala.collection.immutable.SortedMap
     8 
    11 
     9 
    12 
    10 object AFP
    13 object AFP
    11 {
    14 {
    12   val repos_source = "https://isabelle.sketis.net/repos/afp-devel"
    15   val repos_source = "https://isabelle.sketis.net/repos/afp-devel"
    88   override def toString: String = base_dir.expand.toString
    91   override def toString: String = base_dir.expand.toString
    89 
    92 
    90   val main_dir: Path = base_dir + Path.explode("thys")
    93   val main_dir: Path = base_dir + Path.explode("thys")
    91 
    94 
    92 
    95 
    93   /* entries with metadata and sessions */
    96   /* entries and sessions */
    94 
    97 
    95   val entries: List[AFP.Entry] =
    98   val entries_map: SortedMap[String, AFP.Entry] =
    96   {
    99   {
    97     val entry_metadata = AFP.Metadata.read(base_dir + Path.explode("metadata/metadata"))
   100     val entry_metadata = AFP.Metadata.read(base_dir + Path.explode("metadata/metadata"))
    98 
   101 
    99     val entries =
   102     val entries =
   100       (for (name <- Sessions.parse_roots(main_dir + Sessions.ROOTS)) yield {
   103       for (name <- Sessions.parse_roots(main_dir + Sessions.ROOTS)) yield {
   101         val metadata =
   104         val metadata =
   102           entry_metadata.getOrElse(name, error("Entry without metadata: " + quote(name)))
   105           entry_metadata.getOrElse(name, error("Entry without metadata: " + quote(name)))
   103         val sessions =
   106         val sessions =
   104           Sessions.parse_root_entries(main_dir + Path.explode(name) + Sessions.ROOT).map(_.name)
   107           Sessions.parse_root_entries(main_dir + Path.explode(name) + Sessions.ROOT).map(_.name)
   105         AFP.Entry(name, metadata, sessions)
   108         AFP.Entry(name, metadata, sessions)
   106       }).sortBy(_.name)
   109       }
   107 
   110 
   108     val entry_set = entries.iterator.map(_.name).toSet
   111     val entries_map =
       
   112       (SortedMap.empty[String, AFP.Entry] /: entries)({ case (m, e) => m + (e.name -> e) })
       
   113 
   109     val extra_metadata =
   114     val extra_metadata =
   110       (for ((name, _) <- entry_metadata.iterator if !entry_set(name)) yield name).toList.sorted
   115       (for ((name, _) <- entry_metadata.iterator if !entries_map.isDefinedAt(name)) yield name).
   111     if (extra_metadata.nonEmpty) error("Meta data without entry: " + commas_quote(extra_metadata))
   116         toList.sorted
       
   117     if (extra_metadata.nonEmpty)
       
   118       error("Meta data without entry: " + commas_quote(extra_metadata))
   112 
   119 
   113     entries
   120     entries_map
   114   }
   121   }
   115 
   122 
       
   123   val entries: List[AFP.Entry] = entries_map.toList.map(_._2)
   116   val sessions: List[String] = entries.flatMap(_.sessions)
   124   val sessions: List[String] = entries.flatMap(_.sessions)
   117 
   125 
   118   val sessions_structure: Sessions.Structure =
   126   val sessions_structure: Sessions.Structure =
   119     Sessions.load_structure(options, dirs = List(main_dir)).
   127     Sessions.load_structure(options, dirs = List(main_dir)).
   120       selection(Sessions.Selection(sessions = sessions.toList))
   128       selection(Sessions.Selection(sessions = sessions.toList))