160 extends PartialFunction[String, Session_Info] |
160 extends PartialFunction[String, Session_Info] |
161 { |
161 { |
162 def apply(name: String): Session_Info = graph.get_node(name) |
162 def apply(name: String): Session_Info = graph.get_node(name) |
163 def isDefinedAt(name: String): Boolean = graph.defined(name) |
163 def isDefinedAt(name: String): Boolean = graph.defined(name) |
164 |
164 |
165 def selection(requirements: Boolean, all_sessions: Boolean, |
165 def selection( |
166 session_groups: List[String], sessions: List[String]): (List[String], Session_Tree) = |
166 requirements: Boolean = false, |
167 { |
167 all_sessions: Boolean = false, |
168 val bad_sessions = sessions.filterNot(isDefinedAt(_)) |
168 session_groups: List[String] = Nil, |
|
169 exclude_sessions: List[String] = Nil, |
|
170 sessions: List[String] = Nil): (List[String], Session_Tree) = |
|
171 { |
|
172 val bad_sessions = |
|
173 SortedSet((exclude_sessions ::: sessions).filterNot(isDefinedAt(_)): _*).toList |
169 if (bad_sessions.nonEmpty) error("Undefined session(s): " + commas_quote(bad_sessions)) |
174 if (bad_sessions.nonEmpty) error("Undefined session(s): " + commas_quote(bad_sessions)) |
170 |
175 |
|
176 val excluded = graph.all_succs(exclude_sessions).toSet |
171 val pre_selected = |
177 val pre_selected = |
172 { |
178 { |
173 if (all_sessions) graph.keys |
179 if (all_sessions) graph.keys |
174 else { |
180 else { |
175 val select_group = session_groups.toSet |
181 val select_group = session_groups.toSet |
177 (for { |
183 (for { |
178 (name, (info, _)) <- graph.iterator |
184 (name, (info, _)) <- graph.iterator |
179 if info.select || select(name) || apply(name).groups.exists(select_group) |
185 if info.select || select(name) || apply(name).groups.exists(select_group) |
180 } yield name).toList |
186 } yield name).toList |
181 } |
187 } |
182 } |
188 }.filterNot(excluded) |
|
189 |
183 val selected = |
190 val selected = |
184 if (requirements) (graph.all_preds(pre_selected).toSet -- pre_selected).toList |
191 if (requirements) (graph.all_preds(pre_selected).toSet -- pre_selected).toList |
185 else pre_selected |
192 else pre_selected |
186 |
193 |
187 val graph1 = graph.restrict(graph.all_preds(selected).toSet) |
194 val graph1 = graph.restrict(graph.all_preds(selected).toSet) |
531 options: Options, |
538 options: Options, |
532 inlined_files: Boolean, |
539 inlined_files: Boolean, |
533 dirs: List[Path], |
540 dirs: List[Path], |
534 sessions: List[String]): Deps = |
541 sessions: List[String]): Deps = |
535 { |
542 { |
536 val (_, tree) = find_sessions(options, dirs = dirs).selection(false, false, Nil, sessions) |
543 val (_, tree) = find_sessions(options, dirs = dirs).selection(sessions = sessions) |
537 dependencies(inlined_files = inlined_files, tree = tree) |
544 dependencies(inlined_files = inlined_files, tree = tree) |
538 } |
545 } |
539 |
546 |
540 def session_content( |
547 def session_content( |
541 options: Options, |
548 options: Options, |
756 list_files: Boolean = false, |
763 list_files: Boolean = false, |
757 check_keywords: Set[String] = Set.empty, |
764 check_keywords: Set[String] = Set.empty, |
758 no_build: Boolean = false, |
765 no_build: Boolean = false, |
759 system_mode: Boolean = false, |
766 system_mode: Boolean = false, |
760 verbose: Boolean = false, |
767 verbose: Boolean = false, |
|
768 exclude_sessions: List[String] = Nil, |
761 sessions: List[String] = Nil): Map[String, Int] = |
769 sessions: List[String] = Nil): Map[String, Int] = |
762 { |
770 { |
763 /* session tree and dependencies */ |
771 /* session tree and dependencies */ |
764 |
772 |
765 val full_tree = find_sessions(options.int("completion_limit") = 0, dirs, select_dirs) |
773 val full_tree = find_sessions(options.int("completion_limit") = 0, dirs, select_dirs) |
766 val (selected, selected_tree) = |
774 val (selected, selected_tree) = |
767 full_tree.selection(requirements, all_sessions, session_groups, sessions) |
775 full_tree.selection(requirements, all_sessions, session_groups, exclude_sessions, sessions) |
768 |
776 |
769 val deps = dependencies(progress, true, verbose, list_files, check_keywords, selected_tree) |
777 val deps = dependencies(progress, true, verbose, list_files, check_keywords, selected_tree) |
770 |
778 |
771 def make_stamp(name: String): String = |
779 def make_stamp(name: String): String = |
772 sources_stamp(selected_tree(name).entry_digest :: deps.sources(name)) |
780 sources_stamp(selected_tree(name).entry_digest :: deps.sources(name)) |
1008 list_files: Boolean = false, |
1016 list_files: Boolean = false, |
1009 check_keywords: Set[String] = Set.empty, |
1017 check_keywords: Set[String] = Set.empty, |
1010 no_build: Boolean = false, |
1018 no_build: Boolean = false, |
1011 system_mode: Boolean = false, |
1019 system_mode: Boolean = false, |
1012 verbose: Boolean = false, |
1020 verbose: Boolean = false, |
|
1021 exclude_sessions: List[String] = Nil, |
1013 sessions: List[String] = Nil): Int = |
1022 sessions: List[String] = Nil): Int = |
1014 { |
1023 { |
1015 val results = |
1024 val results = |
1016 build_results(options, progress, requirements, all_sessions, |
1025 build_results(options, progress, requirements, all_sessions, build_heap, clean_build, |
1017 build_heap, clean_build, dirs, select_dirs, session_groups, max_jobs, |
1026 dirs, select_dirs, session_groups, max_jobs, list_files, check_keywords, |
1018 list_files, check_keywords, no_build, system_mode, verbose, sessions) |
1027 no_build, system_mode, verbose, exclude_sessions, sessions) |
1019 |
1028 |
1020 val rc = (0 /: results)({ case (rc1, (_, rc2)) => rc1 max rc2 }) |
1029 val rc = (0 /: results)({ case (rc1, (_, rc2)) => rc1 max rc2 }) |
1021 if (rc != 0 && (verbose || !no_build)) { |
1030 if (rc != 0 && (verbose || !no_build)) { |
1022 val unfinished = |
1031 val unfinished = |
1023 (for ((name, r) <- results.iterator if r != 0) yield name).toList.sorted |
1032 (for ((name, r) <- results.iterator if r != 0) yield name).toList.sorted |
1041 Properties.Value.Int(max_jobs) :: |
1050 Properties.Value.Int(max_jobs) :: |
1042 Properties.Value.Boolean(list_files) :: |
1051 Properties.Value.Boolean(list_files) :: |
1043 Properties.Value.Boolean(no_build) :: |
1052 Properties.Value.Boolean(no_build) :: |
1044 Properties.Value.Boolean(system_mode) :: |
1053 Properties.Value.Boolean(system_mode) :: |
1045 Properties.Value.Boolean(verbose) :: |
1054 Properties.Value.Boolean(verbose) :: |
1046 Command_Line.Chunks( |
1055 Command_Line.Chunks(dirs, select_dirs, session_groups, check_keywords, |
1047 dirs, select_dirs, session_groups, check_keywords, build_options, sessions) => |
1056 build_options, exclude_sessions, sessions) => |
1048 val options = (Options.init() /: build_options)(_ + _) |
1057 val options = (Options.init() /: build_options)(_ + _) |
1049 val progress = new Console_Progress(verbose) |
1058 val progress = new Console_Progress(verbose) |
1050 progress.interrupt_handler { |
1059 progress.interrupt_handler { |
1051 build(options, progress, requirements, all_sessions, build_heap, clean_build, |
1060 build(options, progress, requirements, all_sessions, build_heap, clean_build, |
1052 dirs.map(Path.explode(_)), select_dirs.map(Path.explode(_)), session_groups, |
1061 dirs.map(Path.explode(_)), select_dirs.map(Path.explode(_)), session_groups, |
1053 max_jobs, list_files, check_keywords.toSet, no_build, system_mode, |
1062 max_jobs, list_files, check_keywords.toSet, no_build, system_mode, |
1054 verbose, sessions) |
1063 verbose, exclude_sessions, sessions) |
1055 } |
1064 } |
1056 case _ => error("Bad arguments:\n" + cat_lines(args)) |
1065 case _ => error("Bad arguments:\n" + cat_lines(args)) |
1057 } |
1066 } |
1058 } |
1067 } |
1059 } |
1068 } |