578 progress.echo(name + " FAILED") |
578 progress.echo(name + " FAILED") |
579 if (!process_result.interrupted) progress.echo(process_result_tail.out) |
579 if (!process_result.interrupted) progress.echo(process_result_tail.out) |
580 } |
580 } |
581 |
581 |
582 loop(pending - name, running - name, |
582 loop(pending - name, running - name, |
583 results + (name -> Result(false, heap_stamp, Some(process_result_tail), job.info))) |
583 results + (name -> Result(false, heap_digest, Some(process_result_tail), job.info))) |
584 //}}} |
584 //}}} |
585 case None if running.size < (max_jobs max 1) => |
585 case None if running.size < (max_jobs max 1) => |
586 //{{{ check/start next job |
586 //{{{ check/start next job |
587 pending.dequeue(running.isDefinedAt(_)) match { |
587 pending.dequeue(running.isDefinedAt(_)) match { |
588 case Some((name, info)) => |
588 case Some((name, info)) => |
589 val ancestor_results = |
589 val ancestor_results = |
590 deps.sessions_structure.build_requirements(List(name)).filterNot(_ == name). |
590 deps.sessions_structure.build_requirements(List(name)).filterNot(_ == name). |
591 map(results(_)) |
591 map(results(_)) |
592 val ancestor_heaps = ancestor_results.flatMap(_.heap_stamp) |
592 val ancestor_heaps = ancestor_results.flatMap(_.heap_digest) |
593 |
593 |
594 val do_output = build_heap || Sessions.is_pure(name) || queue.is_inner(name) |
594 val do_output = build_heap || Sessions.is_pure(name) || queue.is_inner(name) |
595 |
595 |
596 val (current, heap_stamp) = |
596 val (current, heap_digest) = |
597 { |
597 { |
598 store.try_open_database(name) match { |
598 store.try_open_database(name) match { |
599 case Some(db) => |
599 case Some(db) => |
600 try { |
600 try { |
601 store.read_build(db, name) match { |
601 store.read_build(db, name) match { |
602 case Some(build) => |
602 case Some(build) => |
603 val heap_stamp = store.find_heap_digest(name) |
603 val heap_digest = store.find_heap_digest(name) |
604 val current = |
604 val current = |
605 !fresh_build && |
605 !fresh_build && |
606 build.ok && |
606 build.ok && |
607 build.sources == sources_stamp(deps, name) && |
607 build.sources == sources_stamp(deps, name) && |
608 build.input_heaps == ancestor_heaps && |
608 build.input_heaps == ancestor_heaps && |
609 build.output_heap == heap_stamp && |
609 build.output_heap == heap_digest && |
610 !(do_output && heap_stamp.isEmpty) |
610 !(do_output && heap_digest.isEmpty) |
611 (current, heap_stamp) |
611 (current, heap_digest) |
612 case None => (false, None) |
612 case None => (false, None) |
613 } |
613 } |
614 } finally { db.close } |
614 } finally { db.close } |
615 case None => (false, None) |
615 case None => (false, None) |
616 } |
616 } |
617 } |
617 } |
618 val all_current = current && ancestor_results.forall(_.current) |
618 val all_current = current && ancestor_results.forall(_.current) |
619 |
619 |
620 if (all_current) |
620 if (all_current) |
621 loop(pending - name, running, |
621 loop(pending - name, running, |
622 results + (name -> Result(true, heap_stamp, Some(Process_Result(0)), info))) |
622 results + (name -> Result(true, heap_digest, Some(Process_Result(0)), info))) |
623 else if (no_build) { |
623 else if (no_build) { |
624 if (verbose) progress.echo("Skipping " + name + " ...") |
624 if (verbose) progress.echo("Skipping " + name + " ...") |
625 loop(pending - name, running, |
625 loop(pending - name, running, |
626 results + (name -> Result(false, heap_stamp, Some(Process_Result(1)), info))) |
626 results + (name -> Result(false, heap_digest, Some(Process_Result(1)), info))) |
627 } |
627 } |
628 else if (ancestor_results.forall(_.ok) && !progress.stopped) { |
628 else if (ancestor_results.forall(_.ok) && !progress.stopped) { |
629 progress.echo((if (do_output) "Building " else "Running ") + name + " ...") |
629 progress.echo((if (do_output) "Building " else "Running ") + name + " ...") |
630 |
630 |
631 cleanup(name) |
631 cleanup(name) |
639 loop(pending, running + (name -> (ancestor_heaps, job)), results) |
639 loop(pending, running + (name -> (ancestor_heaps, job)), results) |
640 } |
640 } |
641 else { |
641 else { |
642 progress.echo(name + " CANCELLED") |
642 progress.echo(name + " CANCELLED") |
643 loop(pending - name, running, |
643 loop(pending - name, running, |
644 results + (name -> Result(false, heap_stamp, None, info))) |
644 results + (name -> Result(false, heap_digest, None, info))) |
645 } |
645 } |
646 case None => sleep(); loop(pending, running, results) |
646 case None => sleep(); loop(pending, running, results) |
647 } |
647 } |
648 ///}}} |
648 ///}}} |
649 case None => sleep(); loop(pending, running, results) |
649 case None => sleep(); loop(pending, running, results) |