src/Pure/Thy/export.scala
changeset 68290 f1f5ccc85b25
parent 68289 c29fc61fb1b1
child 68291 1e1877cb9b3a
equal deleted inserted replaced
68289:c29fc61fb1b1 68290:f1f5ccc85b25
   191     store: Sessions.Store,
   191     store: Sessions.Store,
   192     session_name: String,
   192     session_name: String,
   193     export_dir: Path,
   193     export_dir: Path,
   194     progress: Progress = No_Progress,
   194     progress: Progress = No_Progress,
   195     export_list: Boolean = false,
   195     export_list: Boolean = false,
   196     export_pattern: String = "")
   196     export_patterns: List[String] = Nil)
   197   {
   197   {
   198     using(store.open_database(session_name))(db =>
   198     using(store.open_database(session_name))(db =>
   199     {
   199     {
   200       db.transaction {
   200       db.transaction {
   201         val export_names = read_theory_exports(db, session_name)
   201         val export_names = read_theory_exports(db, session_name)
   205           (for ((theory_name, name) <- export_names) yield compound_name(theory_name, name)).
   205           (for ((theory_name, name) <- export_names) yield compound_name(theory_name, name)).
   206             sorted.foreach(Output.writeln(_, stdout = true))
   206             sorted.foreach(Output.writeln(_, stdout = true))
   207         }
   207         }
   208 
   208 
   209         // export
   209         // export
   210         if (export_pattern != "") {
   210         if (export_patterns.nonEmpty) {
   211           val matcher = make_matcher(export_pattern)
   211           val exports =
       
   212             (for {
       
   213               export_pattern <- export_patterns.iterator
       
   214               matcher = make_matcher(export_pattern)
       
   215               (theory_name, name) <- export_names if matcher(theory_name, name)
       
   216             } yield (theory_name, name)).toSet
   212           for {
   217           for {
   213             (theory_name, name) <- export_names if matcher(theory_name, name)
   218             (theory_name, group) <- exports.toList.groupBy(_._1).toList.sortBy(_._1)
       
   219             name <- group.map(_._2).sorted
   214             entry <- read_entry(db, session_name, theory_name, name)
   220             entry <- read_entry(db, session_name, theory_name, name)
   215           } {
   221           } {
   216             val path = export_dir + Path.basic(theory_name) + Path.explode(name)
   222             val path = export_dir + Path.basic(theory_name) + Path.explode(name)
   217             progress.echo("exporting " + path)
   223             progress.echo("exporting " + path)
   218             Isabelle_System.mkdirs(path.dir)
   224             Isabelle_System.mkdirs(path.dir)
   236     var dirs: List[Path] = Nil
   242     var dirs: List[Path] = Nil
   237     var export_list = false
   243     var export_list = false
   238     var no_build = false
   244     var no_build = false
   239     var options = Options.init()
   245     var options = Options.init()
   240     var system_mode = false
   246     var system_mode = false
   241     var export_pattern = ""
   247     var export_patterns: List[String] = Nil
   242 
   248 
   243     val getopts = Getopts("""
   249     val getopts = Getopts("""
   244 Usage: isabelle export [OPTIONS] SESSION
   250 Usage: isabelle export [OPTIONS] SESSION
   245 
   251 
   246   Options are:
   252   Options are:
   251     -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
   257     -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
   252     -s           system build mode for session image
   258     -s           system build mode for session image
   253     -x PATTERN   extract files matching pattern (e.g. "*:**" for all)
   259     -x PATTERN   extract files matching pattern (e.g. "*:**" for all)
   254 
   260 
   255   List or export theory exports for SESSION: named blobs produced by
   261   List or export theory exports for SESSION: named blobs produced by
   256   isabelle build. Option -l or -x is required.
   262   isabelle build. Option -l or -x is required; option -x may be repeated.
   257 
   263 
   258   The PATTERN language resembles glob patterns in the shell, with ? and *
   264   The PATTERN language resembles glob patterns in the shell, with ? and *
   259   (both excluding ":" and "/"), ** (excluding ":"), and [abc] or [^abc],
   265   (both excluding ":" and "/"), ** (excluding ":"), and [abc] or [^abc],
   260   and variants {pattern1,pattern2,pattern3}.
   266   and variants {pattern1,pattern2,pattern3}.
   261 """,
   267 """,
   263       "d:" -> (arg => dirs = dirs ::: List(Path.explode(arg))),
   269       "d:" -> (arg => dirs = dirs ::: List(Path.explode(arg))),
   264       "l" -> (_ => export_list = true),
   270       "l" -> (_ => export_list = true),
   265       "n" -> (_ => no_build = true),
   271       "n" -> (_ => no_build = true),
   266       "o:" -> (arg => options = options + arg),
   272       "o:" -> (arg => options = options + arg),
   267       "s" -> (_ => system_mode = true),
   273       "s" -> (_ => system_mode = true),
   268       "x:" -> (arg => export_pattern = arg))
   274       "x:" -> (arg => export_patterns ::= arg))
   269 
   275 
   270     val more_args = getopts(args)
   276     val more_args = getopts(args)
   271     val session_name =
   277     val session_name =
   272       more_args match {
   278       more_args match {
   273         case List(session_name) if export_list || export_pattern != "" => session_name
   279         case List(session_name) if export_list || export_patterns.nonEmpty => session_name
   274         case _ => getopts.usage()
   280         case _ => getopts.usage()
   275       }
   281       }
   276 
   282 
   277 
   283 
   278     /* build */
   284     /* build */
   295 
   301 
   296     /* export files */
   302     /* export files */
   297 
   303 
   298     val store = Sessions.store(options, system_mode)
   304     val store = Sessions.store(options, system_mode)
   299     export_files(store, session_name, export_dir, progress = progress,
   305     export_files(store, session_name, export_dir, progress = progress,
   300       export_list = export_list, export_pattern = export_pattern)
   306       export_list = export_list, export_patterns = export_patterns)
   301   })
   307   })
   302 }
   308 }