88 || !graph.defined(name) // FIXME scala-2.10.0 TreeSet problem!? |
88 || !graph.defined(name) // FIXME scala-2.10.0 TreeSet problem!? |
89 || !graph.is_minimal(name)) |
89 || !graph.is_minimal(name)) |
90 if (it.hasNext) { val name = it.next; Some((name, graph.get_node(name))) } |
90 if (it.hasNext) { val name = it.next; Some((name, graph.get_node(name))) } |
91 else None |
91 else None |
92 } |
92 } |
93 } |
|
94 |
|
95 |
|
96 /* source dependencies and static content */ |
|
97 |
|
98 sealed case class Deps(deps: Map[String, Sessions.Base]) |
|
99 { |
|
100 def is_empty: Boolean = deps.isEmpty |
|
101 def apply(name: String): Sessions.Base = deps(name) |
|
102 def sources(name: String): List[SHA1.Digest] = deps(name).sources.map(_._2) |
|
103 } |
|
104 |
|
105 def dependencies( |
|
106 progress: Progress = No_Progress, |
|
107 inlined_files: Boolean = false, |
|
108 verbose: Boolean = false, |
|
109 list_files: Boolean = false, |
|
110 check_keywords: Set[String] = Set.empty, |
|
111 tree: Sessions.Tree): Deps = |
|
112 Deps((Map.empty[String, Sessions.Base] /: tree.topological_order)( |
|
113 { case (deps, (name, info)) => |
|
114 if (progress.stopped) throw Exn.Interrupt() |
|
115 |
|
116 try { |
|
117 val resources = |
|
118 new Resources( |
|
119 info.parent match { |
|
120 case None => Sessions.Base.bootstrap |
|
121 case Some(parent) => deps(parent) |
|
122 }) |
|
123 |
|
124 if (verbose || list_files) { |
|
125 val groups = |
|
126 if (info.groups.isEmpty) "" |
|
127 else info.groups.mkString(" (", " ", ")") |
|
128 progress.echo("Session " + info.chapter + "/" + name + groups) |
|
129 } |
|
130 |
|
131 val thy_deps = |
|
132 { |
|
133 val root_theories = |
|
134 info.theories.flatMap({ |
|
135 case (global, _, thys) => |
|
136 thys.map(thy => |
|
137 (resources.node_name( |
|
138 if (global) "" else name, info.dir + resources.thy_path(thy)), info.pos)) |
|
139 }) |
|
140 val thy_deps = resources.thy_info.dependencies(name, root_theories) |
|
141 |
|
142 thy_deps.errors match { |
|
143 case Nil => thy_deps |
|
144 case errs => error(cat_lines(errs)) |
|
145 } |
|
146 } |
|
147 |
|
148 val known_theories = |
|
149 (resources.base.known_theories /: thy_deps.deps)({ case (known, dep) => |
|
150 val name = dep.name |
|
151 known.get(name.theory) match { |
|
152 case Some(name1) if name != name1 => |
|
153 error("Duplicate theory " + quote(name.node) + " vs. " + quote(name1.node)) |
|
154 case _ => |
|
155 known + (name.theory -> name) + (Long_Name.base_name(name.theory) -> name) |
|
156 } |
|
157 }) |
|
158 |
|
159 val loaded_theories = thy_deps.loaded_theories |
|
160 val keywords = thy_deps.keywords |
|
161 val syntax = thy_deps.syntax |
|
162 |
|
163 val theory_files = thy_deps.deps.map(dep => Path.explode(dep.name.node)) |
|
164 val loaded_files = |
|
165 if (inlined_files) { |
|
166 val pure_files = |
|
167 if (Sessions.pure_name(name)) Sessions.pure_files(resources, syntax, info.dir) |
|
168 else Nil |
|
169 pure_files ::: thy_deps.loaded_files |
|
170 } |
|
171 else Nil |
|
172 |
|
173 val all_files = |
|
174 (theory_files ::: loaded_files ::: |
|
175 info.files.map(file => info.dir + file) ::: |
|
176 info.document_files.map(file => info.dir + file._1 + file._2)).map(_.expand) |
|
177 |
|
178 if (list_files) |
|
179 progress.echo(cat_lines(all_files.map(_.implode).sorted.map(" " + _))) |
|
180 |
|
181 if (check_keywords.nonEmpty) |
|
182 Check_Keywords.check_keywords(progress, syntax.keywords, check_keywords, theory_files) |
|
183 |
|
184 val sources = all_files.map(p => (p, SHA1.digest(p.file))) |
|
185 |
|
186 val session_graph = |
|
187 Present.session_graph(info.parent getOrElse "", |
|
188 resources.base.loaded_theories, thy_deps.deps) |
|
189 |
|
190 val base = |
|
191 Sessions.Base( |
|
192 loaded_theories, known_theories, keywords, syntax, sources, session_graph) |
|
193 deps + (name -> base) |
|
194 } |
|
195 catch { |
|
196 case ERROR(msg) => |
|
197 cat_error(msg, "The error(s) above occurred in session " + |
|
198 quote(name) + Position.here(info.pos)) |
|
199 } |
|
200 })) |
|
201 |
|
202 def session_base(options: Options, session: String, dirs: List[Path] = Nil): Sessions.Base = |
|
203 { |
|
204 val (_, tree) = Sessions.load(options, dirs = dirs).selection(sessions = List(session)) |
|
205 dependencies(tree = tree)(session) |
|
206 } |
93 } |
207 |
94 |
208 |
95 |
209 /* jobs */ |
96 /* jobs */ |
210 |
97 |
429 /* session selection and dependencies */ |
316 /* session selection and dependencies */ |
430 |
317 |
431 val build_options = options.int.update("completion_limit", 0).bool.update("ML_statistics", true) |
318 val build_options = options.int.update("completion_limit", 0).bool.update("ML_statistics", true) |
432 val full_tree = Sessions.load(build_options, dirs, select_dirs) |
319 val full_tree = Sessions.load(build_options, dirs, select_dirs) |
433 val (selected, selected_tree) = selection(full_tree) |
320 val (selected, selected_tree) = selection(full_tree) |
434 val deps = dependencies(progress, true, verbose, list_files, check_keywords, selected_tree) |
321 val deps = |
|
322 Sessions.dependencies(progress, true, verbose, list_files, check_keywords, selected_tree) |
435 |
323 |
436 def session_sources_stamp(name: String): String = |
324 def session_sources_stamp(name: String): String = |
437 sources_stamp(selected_tree(name).meta_digest :: deps.sources(name)) |
325 sources_stamp(selected_tree(name).meta_digest :: deps.sources(name)) |
438 |
326 |
439 val store = Sessions.store(system_mode) |
327 val store = Sessions.store(system_mode) |