author | wenzelm |
Thu, 05 Jan 2023 20:25:41 +0100 | |
changeset 76918 | 19be7d89bf03 |
parent 75394 | 42267c650205 |
child 76920 | de2e9a64d59b |
permissions | -rw-r--r-- |
69557 | 1 |
/* Title: Pure/Tools/update.scala |
2 |
Author: Makarius |
|
3 |
||
4 |
Update theory sources based on PIDE markup. |
|
5 |
*/ |
|
6 |
||
7 |
package isabelle |
|
8 |
||
9 |
||
75393 | 10 |
object Update { |
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
11 |
def update(options: Options, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
12 |
base_logics: List[String] = Nil, |
71726
a5fda30edae2
clarified signature: more uniform treatment of stopped/interrupted state;
wenzelm
parents:
71573
diff
changeset
|
13 |
progress: Progress = new Progress, |
69557 | 14 |
dirs: List[Path] = Nil, |
15 |
select_dirs: List[Path] = Nil, |
|
75393 | 16 |
selection: Sessions.Selection = Sessions.Selection.empty |
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
17 |
): Build.Results = { |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
18 |
/* excluded sessions */ |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
19 |
|
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
20 |
val exclude: Set[String] = |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
21 |
if (base_logics.isEmpty) Set.empty |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
22 |
else { |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
23 |
val sessions = |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
24 |
Sessions.load_structure(options, dirs = dirs, select_dirs = select_dirs) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
25 |
.selection(selection) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
26 |
|
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
27 |
for (name <- base_logics if !sessions.defined(name)) { |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
28 |
error("Base logic " + quote(name) + " outside of session selection") |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
29 |
} |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
30 |
|
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
31 |
sessions.build_requirements(base_logics).toSet |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
32 |
} |
69557 | 33 |
|
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
34 |
|
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
35 |
/* build */ |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
36 |
|
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
37 |
val build_results = |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
38 |
Build.build(options, progress = progress, dirs = dirs, select_dirs = select_dirs, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
39 |
selection = selection) |
70864 | 40 |
|
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
41 |
if (!build_results.ok) error("Build failed") |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
42 |
|
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
43 |
val store = build_results.store |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
44 |
val sessions_structure = build_results.deps.sessions_structure |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
45 |
|
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
46 |
|
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
47 |
/* update */ |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
48 |
|
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
49 |
val path_cartouches = options.bool("update_path_cartouches") |
69603 | 50 |
|
69557 | 51 |
def update_xml(xml: XML.Body): XML.Body = |
52 |
xml flatMap { |
|
53 |
case XML.Wrapped_Elem(markup, body1, body2) => |
|
54 |
if (markup.name == Markup.UPDATE) update_xml(body1) else update_xml(body2) |
|
72842
6aae62f55c2b
clarified markup: support more completion, e.g. within ROOTS;
wenzelm
parents:
72823
diff
changeset
|
55 |
case XML.Elem(Markup.Language.Path(_), body) |
69603 | 56 |
if path_cartouches => |
57 |
Token.read_embedded(Keyword.Keywords.empty, XML.content(body)) match { |
|
58 |
case Some(tok) => List(XML.Text(Symbol.cartouche(tok.content))) |
|
59 |
case None => update_xml(body) |
|
60 |
} |
|
69557 | 61 |
case XML.Elem(_, body) => update_xml(body) |
62 |
case t => List(t) |
|
63 |
} |
|
64 |
||
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
65 |
var seen_theory = Set.empty[String] |
69571 | 66 |
|
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
67 |
using(Export.open_database_context(store)) { database_context => |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
68 |
for (session <- sessions_structure.build_topological_order if !exclude(session)) { |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
69 |
using(database_context.open_session0(session)) { session_context => |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
70 |
for { |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
71 |
db <- session_context.session_db() |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
72 |
theory <- store.read_theories(db, session) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
73 |
if !seen_theory(theory) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
74 |
} { |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
75 |
seen_theory += theory |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
76 |
val theory_context = session_context.theory(theory) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
77 |
for { |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
78 |
theory_snapshot <- Build_Job.read_theory(theory_context) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
79 |
node_name <- theory_snapshot.node_files |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
80 |
snapshot = theory_snapshot.switch(node_name) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
81 |
if snapshot.node.is_wellformed_text |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
82 |
} { |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
83 |
progress.expose_interrupt() |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
84 |
val source1 = |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
85 |
XML.content(update_xml( |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
86 |
snapshot.xml_markup(elements = Markup.Elements(Markup.UPDATE, Markup.LANGUAGE)))) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
87 |
if (source1 != snapshot.node.source) { |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
88 |
val path = Path.explode(node_name.node) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
89 |
progress.echo("Updating " + quote(File.standard_path(path))) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
90 |
File.write(path, source1) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
91 |
} |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
92 |
} |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
93 |
} |
70640
5f4b8a505090
more explicit type Dump.Session, with context information;
wenzelm
parents:
69896
diff
changeset
|
94 |
} |
75393 | 95 |
} |
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
96 |
} |
70876 | 97 |
|
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
98 |
build_results |
69557 | 99 |
} |
100 |
||
101 |
||
102 |
/* Isabelle tool wrapper */ |
|
103 |
||
104 |
val isabelle_tool = |
|
72763 | 105 |
Isabelle_Tool("update", "update theory sources based on PIDE markup", Scala_Project.here, |
75394 | 106 |
{ args => |
107 |
var base_sessions: List[String] = Nil |
|
108 |
var select_dirs: List[Path] = Nil |
|
109 |
var requirements = false |
|
110 |
var exclude_session_groups: List[String] = Nil |
|
111 |
var all_sessions = false |
|
112 |
var dirs: List[Path] = Nil |
|
113 |
var session_groups: List[String] = Nil |
|
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
114 |
var base_logics: List[String] = Nil |
75394 | 115 |
var options = Options.init() |
116 |
var verbose = false |
|
117 |
var exclude_sessions: List[String] = Nil |
|
69557 | 118 |
|
75394 | 119 |
val getopts = Getopts(""" |
69557 | 120 |
Usage: isabelle update [OPTIONS] [SESSIONS ...] |
121 |
||
122 |
Options are: |
|
123 |
-B NAME include session NAME and all descendants |
|
124 |
-D DIR include session directory and select its sessions |
|
71807 | 125 |
-R refer to requirements of selected sessions |
69557 | 126 |
-X NAME exclude sessions from group NAME and all descendants |
127 |
-a select all sessions |
|
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
128 |
-b NAME additional base logic |
69557 | 129 |
-d DIR include session directory |
130 |
-g NAME select session group NAME |
|
131 |
-o OPTION override Isabelle system OPTION (via NAME=VAL or NAME) |
|
75161 | 132 |
-u OPT override "update" option: shortcut for "-o update_OPT" |
69557 | 133 |
-v verbose |
134 |
-x NAME exclude session NAME and all descendants |
|
135 |
||
136 |
Update theory sources based on PIDE markup. |
|
137 |
""", |
|
75394 | 138 |
"B:" -> (arg => base_sessions = base_sessions ::: List(arg)), |
139 |
"D:" -> (arg => select_dirs = select_dirs ::: List(Path.explode(arg))), |
|
140 |
"R" -> (_ => requirements = true), |
|
141 |
"X:" -> (arg => exclude_session_groups = exclude_session_groups ::: List(arg)), |
|
142 |
"a" -> (_ => all_sessions = true), |
|
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
143 |
"b:" -> (arg => base_logics ::= arg), |
75394 | 144 |
"d:" -> (arg => dirs = dirs ::: List(Path.explode(arg))), |
145 |
"g:" -> (arg => session_groups = session_groups ::: List(arg)), |
|
146 |
"o:" -> (arg => options = options + arg), |
|
147 |
"u:" -> (arg => options = options + ("update_" + arg)), |
|
148 |
"v" -> (_ => verbose = true), |
|
149 |
"x:" -> (arg => exclude_sessions = exclude_sessions ::: List(arg))) |
|
69557 | 150 |
|
75394 | 151 |
val sessions = getopts(args) |
69557 | 152 |
|
75394 | 153 |
val progress = new Console_Progress(verbose = verbose) |
69557 | 154 |
|
76918
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
155 |
val results = |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
156 |
progress.interrupt_handler { |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
157 |
update(options, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
158 |
base_logics = base_logics, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
159 |
progress = progress, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
160 |
dirs = dirs, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
161 |
select_dirs = select_dirs, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
162 |
selection = Sessions.Selection( |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
163 |
requirements = requirements, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
164 |
all_sessions = all_sessions, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
165 |
base_sessions = base_sessions, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
166 |
exclude_session_groups = exclude_session_groups, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
167 |
exclude_sessions = exclude_sessions, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
168 |
session_groups = session_groups, |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
169 |
sessions = sessions)) |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
170 |
} |
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
171 |
|
19be7d89bf03
isabelle update no longer uses PIDE dump, but regular session build database: more scalable;
wenzelm
parents:
75394
diff
changeset
|
172 |
sys.exit(results.rc) |
75394 | 173 |
}) |
69557 | 174 |
} |