equal
deleted
inserted
replaced
207 val full_sessions = |
207 val full_sessions = |
208 Sessions.load_structure(build_options, dirs = dirs, select_dirs = select_dirs, infos = infos, |
208 Sessions.load_structure(build_options, dirs = dirs, select_dirs = select_dirs, infos = infos, |
209 augment_options = augment_options) |
209 augment_options = augment_options) |
210 val full_sessions_selection = full_sessions.imports_selection(selection) |
210 val full_sessions_selection = full_sessions.imports_selection(selection) |
211 |
211 |
212 def sources_stamp(deps: Sessions.Deps, session_name: String): String = { |
|
213 val digests = |
|
214 full_sessions(session_name).meta_digest :: |
|
215 deps.session_sources(session_name) ::: |
|
216 deps.imported_sources(session_name) |
|
217 SHA1.digest_set(digests).toString |
|
218 } |
|
219 |
|
220 val build_deps = { |
212 val build_deps = { |
221 val deps0 = |
213 val deps0 = |
222 Sessions.deps(full_sessions.selection(selection), |
214 Sessions.deps(full_sessions.selection(selection), |
223 progress = progress, inlined_files = true, verbose = verbose, |
215 progress = progress, inlined_files = true, verbose = verbose, |
224 list_files = list_files, check_keywords = check_keywords).check_errors |
216 list_files = list_files, check_keywords = check_keywords).check_errors |
228 deps0.sessions_structure.build_topological_order.flatMap(name => |
220 deps0.sessions_structure.build_topological_order.flatMap(name => |
229 store.try_open_database(name) match { |
221 store.try_open_database(name) match { |
230 case Some(db) => |
222 case Some(db) => |
231 using(db)(store.read_build(_, name)) match { |
223 using(db)(store.read_build(_, name)) match { |
232 case Some(build) |
224 case Some(build) |
233 if build.ok && build.sources == sources_stamp(deps0, name) => None |
225 if build.ok && build.sources == deps0.sources_shasum(name) => None |
234 case _ => Some(name) |
226 case _ => Some(name) |
235 } |
227 } |
236 case None => Some(name) |
228 case None => Some(name) |
237 }) |
229 }) |
238 |
230 |
352 using(store.open_database(session_name, output = true))(db => |
344 using(store.open_database(session_name, output = true))(db => |
353 store.write_session_info(db, session_name, job.session_sources, |
345 store.write_session_info(db, session_name, job.session_sources, |
354 build_log = |
346 build_log = |
355 if (process_result.timeout) build_log.error("Timeout") else build_log, |
347 if (process_result.timeout) build_log.error("Timeout") else build_log, |
356 build = |
348 build = |
357 Session_Info(sources_stamp(build_deps, session_name), input_heaps, heap_digest, |
349 Session_Info(build_deps.sources_shasum(session_name), input_heaps, heap_digest, |
358 process_result.rc, UUID.random().toString))) |
350 process_result.rc, UUID.random().toString))) |
359 |
351 |
360 // messages |
352 // messages |
361 process_result.err_lines.foreach(progress.echo) |
353 process_result.err_lines.foreach(progress.echo) |
362 |
354 |
396 case Some(build) => |
388 case Some(build) => |
397 val heap_digest = store.find_heap_digest(session_name) |
389 val heap_digest = store.find_heap_digest(session_name) |
398 val current = |
390 val current = |
399 !fresh_build && |
391 !fresh_build && |
400 build.ok && |
392 build.ok && |
401 build.sources == sources_stamp(build_deps, session_name) && |
393 build.sources == build_deps.sources_shasum(session_name) && |
402 build.input_heaps == ancestor_heaps && |
394 build.input_heaps == ancestor_heaps && |
403 build.output_heap == heap_digest && |
395 build.output_heap == heap_digest && |
404 !(do_store && heap_digest.isEmpty) |
396 !(do_store && heap_digest.isEmpty) |
405 (current, heap_digest) |
397 (current, heap_digest) |
406 case None => (false, None) |
398 case None => (false, None) |