750 check_keywords: Set[String] = Set.empty, |
750 check_keywords: Set[String] = Set.empty, |
751 no_build: Boolean = false, |
751 no_build: Boolean = false, |
752 system_mode: Boolean = false, |
752 system_mode: Boolean = false, |
753 verbose: Boolean = false, |
753 verbose: Boolean = false, |
754 exclude_sessions: List[String] = Nil, |
754 exclude_sessions: List[String] = Nil, |
755 sessions: List[String] = Nil): Map[String, Int] = |
755 sessions: List[String] = Nil): Map[String, Option[Process_Result]] = |
756 { |
756 { |
757 /* session tree and dependencies */ |
757 /* session tree and dependencies */ |
758 |
758 |
759 val full_tree = find_sessions(options.int("completion_limit") = 0, dirs, select_dirs) |
759 val full_tree = find_sessions(options.int("completion_limit") = 0, dirs, select_dirs) |
760 val (selected, selected_tree) = |
760 val (selected, selected_tree) = |
833 if (!files.forall(p => p.file.delete)) progress.echo(name + " FAILED to delete") |
833 if (!files.forall(p => p.file.delete)) progress.echo(name + " FAILED to delete") |
834 } |
834 } |
835 } |
835 } |
836 |
836 |
837 // scheduler loop |
837 // scheduler loop |
838 case class Result(current: Boolean, heap: String, rc: Int) |
838 case class Result(current: Boolean, heap: String, process: Option[Process_Result]) |
|
839 { |
|
840 def ok: Boolean = |
|
841 process match { |
|
842 case None => false |
|
843 case Some(res) => res.rc == 0 |
|
844 } |
|
845 } |
839 |
846 |
840 def sleep() |
847 def sleep() |
841 { |
848 { |
842 try { Thread.sleep(500) } |
849 try { Thread.sleep(500) } |
843 catch { case Exn.Interrupt() => Exn.Interrupt.impose() } |
850 catch { case Exn.Interrupt() => Exn.Interrupt.impose() } |
885 } |
892 } |
886 |
893 |
887 no_heap |
894 no_heap |
888 } |
895 } |
889 loop(pending - name, running - name, |
896 loop(pending - name, running - name, |
890 results + (name -> Result(false, heap, process_result.rc))) |
897 results + (name -> Result(false, heap, Some(process_result.clear)))) |
891 //}}} |
898 //}}} |
892 case None if running.size < (max_jobs max 1) => |
899 case None if running.size < (max_jobs max 1) => |
893 //{{{ check/start next job |
900 //{{{ check/start next job |
894 pending.dequeue(running.isDefinedAt(_)) match { |
901 pending.dequeue(running.isDefinedAt(_)) match { |
895 case Some((name, info)) => |
902 case Some((name, info)) => |
896 val parent_result = |
903 val parent_result = |
897 info.parent match { |
904 info.parent match { |
898 case None => Result(true, no_heap, 0) |
905 case None => Result(true, no_heap, Some(Process_Result(0))) |
899 case Some(parent) => results(parent) |
906 case Some(parent) => results(parent) |
900 } |
907 } |
901 val output = output_dir + Path.basic(name) |
908 val output = output_dir + Path.basic(name) |
902 val do_output = build_heap || queue.is_inner(name) |
909 val do_output = build_heap || queue.is_inner(name) |
903 |
910 |
916 } |
923 } |
917 } |
924 } |
918 val all_current = current && parent_result.current |
925 val all_current = current && parent_result.current |
919 |
926 |
920 if (all_current) |
927 if (all_current) |
921 loop(pending - name, running, results + (name -> Result(true, heap, 0))) |
928 loop(pending - name, running, |
|
929 results + (name -> Result(true, heap, Some(Process_Result(0))))) |
922 else if (no_build) { |
930 else if (no_build) { |
923 if (verbose) progress.echo("Skipping " + name + " ...") |
931 if (verbose) progress.echo("Skipping " + name + " ...") |
924 loop(pending - name, running, results + (name -> Result(false, heap, 1))) |
932 loop(pending - name, running, |
|
933 results + (name -> Result(false, heap, Some(Process_Result(1))))) |
925 } |
934 } |
926 else if (parent_result.rc == 0 && !progress.stopped) { |
935 else if (parent_result.ok && !progress.stopped) { |
927 progress.echo((if (do_output) "Building " else "Running ") + name + " ...") |
936 progress.echo((if (do_output) "Building " else "Running ") + name + " ...") |
928 val job = |
937 val job = |
929 new Job(progress, name, info, output, do_output, verbose, browser_info, |
938 new Job(progress, name, info, output, do_output, verbose, browser_info, |
930 deps(name).session_graph, queue.command_timings(name)) |
939 deps(name).session_graph, queue.command_timings(name)) |
931 loop(pending, running + (name -> (parent_result.heap, job)), results) |
940 loop(pending, running + (name -> (parent_result.heap, job)), results) |
932 } |
941 } |
933 else { |
942 else { |
934 progress.echo(name + " CANCELLED") |
943 progress.echo(name + " CANCELLED") |
935 loop(pending - name, running, results + (name -> Result(false, heap, 1))) |
944 loop(pending - name, running, results + (name -> Result(false, heap, None))) |
936 } |
945 } |
937 case None => sleep(); loop(pending, running, results) |
946 case None => sleep(); loop(pending, running, results) |
938 } |
947 } |
939 ///}}} |
948 ///}}} |
940 case None => sleep(); loop(pending, running, results) |
949 case None => sleep(); loop(pending, running, results) |
957 |
966 |
958 if (!no_build) { |
967 if (!no_build) { |
959 val browser_chapters = |
968 val browser_chapters = |
960 (for { |
969 (for { |
961 (name, result) <- results.iterator |
970 (name, result) <- results.iterator |
962 if result.rc == 0 && !is_pure(name) |
971 if result.ok && !is_pure(name) |
963 info = full_tree(name) |
972 info = full_tree(name) |
964 if info.options.bool("browser_info") |
973 if info.options.bool("browser_info") |
965 } yield (info.chapter, (name, info.description))).toList.groupBy(_._1). |
974 } yield (info.chapter, (name, info.description))).toList.groupBy(_._1). |
966 map({ case (chapter, es) => (chapter, es.map(_._2)) }).filterNot(_._2.isEmpty) |
975 map({ case (chapter, es) => (chapter, es.map(_._2)) }).filterNot(_._2.isEmpty) |
967 |
976 |
1003 val results = |
1012 val results = |
1004 build_results(options, progress, requirements, all_sessions, build_heap, clean_build, |
1013 build_results(options, progress, requirements, all_sessions, build_heap, clean_build, |
1005 dirs, select_dirs, exclude_session_groups, session_groups, max_jobs, list_files, |
1014 dirs, select_dirs, exclude_session_groups, session_groups, max_jobs, list_files, |
1006 check_keywords, no_build, system_mode, verbose, exclude_sessions, sessions) |
1015 check_keywords, no_build, system_mode, verbose, exclude_sessions, sessions) |
1007 |
1016 |
1008 val rc = (0 /: results)({ case (rc1, (_, rc2)) => rc1 max rc2 }) |
1017 val rc = (0 /: results.iterator.flatMap(p => p._2.map(_.rc)))(_ max _) |
1009 if (rc != 0 && (verbose || !no_build)) { |
1018 if (rc != 0 && (verbose || !no_build)) { |
1010 val unfinished = |
1019 val unfinished = |
1011 (for ((name, r) <- results.iterator if r != 0) yield name).toList.sorted |
1020 (for { |
|
1021 (name, r) <- results.iterator |
|
1022 if r.isEmpty || r.isDefined && !r.get.ok |
|
1023 } yield name).toList.sorted |
1012 progress.echo("Unfinished session(s): " + commas(unfinished)) |
1024 progress.echo("Unfinished session(s): " + commas(unfinished)) |
1013 } |
1025 } |
1014 rc |
1026 rc |
1015 } |
1027 } |
1016 |
1028 |