private void DoCommanderSetup(ElectricCommander EC, IEnumerable<BuildNode> AllNodes, IEnumerable<AggregateNode> AllAggregates, List<BuildNode> OrdereredToDo, int TimeIndex, int TimeQuantum, bool bSkipTriggers, bool bFake, bool bFakeEC, string CLString, TriggerNode ExplicitTrigger, List<TriggerNode> UnfinishedTriggers, string FakeFail, bool bPreflightBuild) { List<BuildNode> SortedNodes = TopologicalSort(new HashSet<BuildNode>(AllNodes), null, SubSort: false, DoNotConsiderCompletion: true); Log("******* {0} GUBP Nodes", SortedNodes.Count); List<BuildNode> FilteredOrdereredToDo = new List<BuildNode>(); using(TelemetryStopwatch StartFilterTimer = new TelemetryStopwatch("FilterNodes")) { // remove nodes that have unfinished triggers foreach (BuildNode NodeToDo in OrdereredToDo) { if (NodeToDo.ControllingTriggers.Length == 0 || !UnfinishedTriggers.Contains(NodeToDo.ControllingTriggers.Last())) { // if we are triggering, then remove nodes that are not controlled by the trigger or are dependencies of this trigger if (ExplicitTrigger != null && ExplicitTrigger != NodeToDo && !ExplicitTrigger.DependsOn(NodeToDo) && !NodeToDo.DependsOn(ExplicitTrigger)) { continue; // this wasn't on the chain related to the trigger we are triggering, so it is not relevant } // in preflight builds, we are either skipping triggers (and running things downstream) or we just stop at triggers and don't make them available for triggering. if (bPreflightBuild && !bSkipTriggers && (NodeToDo is TriggerNode)) { continue; } FilteredOrdereredToDo.Add(NodeToDo); } } } using(TelemetryStopwatch PrintNodesTimer = new TelemetryStopwatch("SetupCommanderPrint")) { Log("*********** EC Nodes, in order."); PrintNodes(this, FilteredOrdereredToDo, AllAggregates, UnfinishedTriggers, TimeQuantum); } EC.DoCommanderSetup(AllNodes, AllAggregates, FilteredOrdereredToDo, SortedNodes, TimeIndex, TimeQuantum, bSkipTriggers, bFake, bFakeEC, CLString, ExplicitTrigger, UnfinishedTriggers, FakeFail); }