389 val digests = |
389 val digests = |
390 full_sessions(name).meta_digest :: deps.sources(name) ::: deps.imported_sources(name) |
390 full_sessions(name).meta_digest :: deps.sources(name) ::: deps.imported_sources(name) |
391 SHA1.digest(cat_lines(digests.map(_.toString).sorted)).toString |
391 SHA1.digest(cat_lines(digests.map(_.toString).sorted)).toString |
392 } |
392 } |
393 |
393 |
394 val (selected, selected_sessions, deps) = |
394 val (selected_sessions, deps) = |
395 { |
395 { |
396 val (selected0, selected_sessions0) = |
396 val selected_sessions0 = |
397 full_sessions.selection( |
397 full_sessions.selection( |
398 Sessions.Selection(requirements, all_sessions, base_sessions, exclude_session_groups, |
398 Sessions.Selection(requirements, all_sessions, base_sessions, exclude_session_groups, |
399 exclude_sessions, session_groups, sessions) ++ selection) |
399 exclude_sessions, session_groups, sessions) ++ selection) |
400 |
400 |
401 val deps0 = |
401 val deps0 = |
403 progress = progress, inlined_files = true, verbose = verbose, |
403 progress = progress, inlined_files = true, verbose = verbose, |
404 list_files = list_files, check_keywords = check_keywords).check_errors |
404 list_files = list_files, check_keywords = check_keywords).check_errors |
405 |
405 |
406 if (soft_build && !fresh_build) { |
406 if (soft_build && !fresh_build) { |
407 val outdated = |
407 val outdated = |
408 selected0.flatMap(name => |
408 selected_sessions0.build_topological_order.flatMap(name => |
409 store.find_database(name) match { |
409 store.find_database(name) match { |
410 case Some(database) => |
410 case Some(database) => |
411 using(SQLite.open_database(database))(store.read_build(_, name)) match { |
411 using(SQLite.open_database(database))(store.read_build(_, name)) match { |
412 case Some(build) |
412 case Some(build) |
413 if build.ok && build.sources == sources_stamp(deps0, name) => None |
413 if build.ok && build.sources == sources_stamp(deps0, name) => None |
414 case _ => Some(name) |
414 case _ => Some(name) |
415 } |
415 } |
416 case None => Some(name) |
416 case None => Some(name) |
417 }) |
417 }) |
418 val (selected, selected_sessions) = |
418 val selected_sessions = |
419 full_sessions.selection(Sessions.Selection(sessions = outdated)) |
419 full_sessions.selection(Sessions.Selection(sessions = outdated)) |
420 val deps = |
420 val deps = |
421 Sessions.deps(selected_sessions, full_sessions.global_theories, inlined_files = true) |
421 Sessions.deps(selected_sessions, full_sessions.global_theories, inlined_files = true) |
422 .check_errors |
422 .check_errors |
423 (selected, selected_sessions, deps) |
423 (selected_sessions, deps) |
424 } |
424 } |
425 else (selected0, selected_sessions0, deps0) |
425 else (selected_sessions0, deps0) |
426 } |
426 } |
427 |
427 |
428 |
428 |
429 /* check unknown files */ |
429 /* check unknown files */ |
430 |
430 |
448 |
448 |
449 store.prepare_output() |
449 store.prepare_output() |
450 |
450 |
451 // optional cleanup |
451 // optional cleanup |
452 if (clean_build) { |
452 if (clean_build) { |
453 for (name <- full_sessions.build_descendants(selected)) { |
453 for (name <- full_sessions.build_descendants(selected_sessions.build_topological_order)) { |
454 val files = |
454 val files = |
455 List(Path.basic(name), store.database(name), store.log(name), store.log_gz(name)). |
455 List(Path.basic(name), store.database(name), store.log(name), store.log_gz(name)). |
456 map(store.output_dir + _).filter(_.is_file) |
456 map(store.output_dir + _).filter(_.is_file) |
457 if (files.nonEmpty) progress.echo("Cleaning " + name + " ...") |
457 if (files.nonEmpty) progress.echo("Cleaning " + name + " ...") |
458 if (!files.forall(p => p.file.delete)) progress.echo(name + " FAILED to delete") |
458 if (!files.forall(p => p.file.delete)) progress.echo(name + " FAILED to delete") |