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 } |