src/Pure/Thy/export.scala
changeset 69671 2486792eaf61
parent 69635 95dc926fa39c
child 69756 1907222d974e
equal deleted inserted replaced
69670:114ae60c4be7 69671:2486792eaf61
   257   def export_files(
   257   def export_files(
   258     store: Sessions.Store,
   258     store: Sessions.Store,
   259     session_name: String,
   259     session_name: String,
   260     export_dir: Path,
   260     export_dir: Path,
   261     progress: Progress = No_Progress,
   261     progress: Progress = No_Progress,
       
   262     export_prune: Int = 0,
   262     export_list: Boolean = false,
   263     export_list: Boolean = false,
   263     export_patterns: List[String] = Nil,
   264     export_patterns: List[String] = Nil,
   264     export_prefix: String = "")
   265     export_prefix: String = "")
   265   {
   266   {
   266     using(store.open_database(session_name))(db =>
   267     using(store.open_database(session_name))(db =>
   285           for {
   286           for {
   286             (theory_name, group) <- exports.toList.groupBy(_._1).toList.sortBy(_._1)
   287             (theory_name, group) <- exports.toList.groupBy(_._1).toList.sortBy(_._1)
   287             name <- group.map(_._2).sorted
   288             name <- group.map(_._2).sorted
   288             entry <- read_entry(db, session_name, theory_name, name)
   289             entry <- read_entry(db, session_name, theory_name, name)
   289           } {
   290           } {
   290             val path = export_dir + Path.basic(theory_name) + Path.explode(name)
   291             val elems = theory_name :: space_explode('/', name)
       
   292             val path =
       
   293               if (elems.length < export_prune + 1) {
       
   294                 error("Cannot prune path by " + export_prune + " element(s): " + Path.make(elems))
       
   295               }
       
   296               else export_dir + Path.make(elems.drop(export_prune))
       
   297 
   291             progress.echo(export_prefix + "export " + path)
   298             progress.echo(export_prefix + "export " + path)
   292             Isabelle_System.mkdirs(path.dir)
   299             Isabelle_System.mkdirs(path.dir)
   293             Bytes.write(path, entry.uncompressed(cache = store.xz_cache))
   300             Bytes.write(path, entry.uncompressed(cache = store.xz_cache))
   294           }
   301           }
   295         }
   302         }
   309     var export_dir = default_export_dir
   316     var export_dir = default_export_dir
   310     var dirs: List[Path] = Nil
   317     var dirs: List[Path] = Nil
   311     var export_list = false
   318     var export_list = false
   312     var no_build = false
   319     var no_build = false
   313     var options = Options.init()
   320     var options = Options.init()
       
   321     var export_prune = 0
   314     var system_mode = false
   322     var system_mode = false
   315     var export_patterns: List[String] = Nil
   323     var export_patterns: List[String] = Nil
   316 
   324 
   317     val getopts = Getopts("""
   325     val getopts = Getopts("""
   318 Usage: isabelle export [OPTIONS] SESSION
   326 Usage: isabelle export [OPTIONS] SESSION
   321     -O DIR       output directory for exported files (default: """ + default_export_dir + """)
   329     -O DIR       output directory for exported files (default: """ + default_export_dir + """)
   322     -d DIR       include session directory
   330     -d DIR       include session directory
   323     -l           list exports
   331     -l           list exports
   324     -n           no build of session
   332     -n           no build of session
   325     -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
   333     -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
       
   334     -p NUM       prune path of exported files by NUM elements
   326     -s           system build mode for session image
   335     -s           system build mode for session image
   327     -x PATTERN   extract files matching pattern (e.g. "*:**" for all)
   336     -x PATTERN   extract files matching pattern (e.g. "*:**" for all)
   328 
   337 
   329   List or export theory exports for SESSION: named blobs produced by
   338   List or export theory exports for SESSION: named blobs produced by
   330   isabelle build. Option -l or -x is required; option -x may be repeated.
   339   isabelle build. Option -l or -x is required; option -x may be repeated.
   336       "O:" -> (arg => export_dir = Path.explode(arg)),
   345       "O:" -> (arg => export_dir = Path.explode(arg)),
   337       "d:" -> (arg => dirs = dirs ::: List(Path.explode(arg))),
   346       "d:" -> (arg => dirs = dirs ::: List(Path.explode(arg))),
   338       "l" -> (_ => export_list = true),
   347       "l" -> (_ => export_list = true),
   339       "n" -> (_ => no_build = true),
   348       "n" -> (_ => no_build = true),
   340       "o:" -> (arg => options = options + arg),
   349       "o:" -> (arg => options = options + arg),
       
   350       "p:" -> (arg => export_prune = Value.Int.parse(arg)),
   341       "s" -> (_ => system_mode = true),
   351       "s" -> (_ => system_mode = true),
   342       "x:" -> (arg => export_patterns ::= arg))
   352       "x:" -> (arg => export_patterns ::= arg))
   343 
   353 
   344     val more_args = getopts(args)
   354     val more_args = getopts(args)
   345     val session_name =
   355     val session_name =
   364 
   374 
   365 
   375 
   366     /* export files */
   376     /* export files */
   367 
   377 
   368     val store = Sessions.store(options, system_mode)
   378     val store = Sessions.store(options, system_mode)
   369     export_files(store, session_name, export_dir, progress = progress,
   379     export_files(store, session_name, export_dir, progress = progress, export_prune = export_prune,
   370       export_list = export_list, export_patterns = export_patterns)
   380       export_list = export_list, export_patterns = export_patterns)
   371   })
   381   })
   372 }
   382 }