private void MergeProjects(ISet<EquatableEdge<IBuilder>> graph, Dictionary<SlnBuilder, SolutionBuildPattern> patterns, Project[] projects, string name)
{
var existingPattern = patterns.Values.FirstOrDefault(
p => projects.All(p.Projects.Contains));
IBuilder mergedRoot;
if (existingPattern == null)
{
// Creating the new [MSBuildRunner] -> [SlnBuilder] -> ... branches
mergedRoot = CreateMergedBuild(graph, projects,
String.Format("Merged builders of module {0}", name));
}
else
{
mergedRoot = existingPattern.Root;
}
// Redirecting all * -> [MSBuildRunner] edges to the merged [MSBuildRunner]
RerouteEdgesTargeting(
graph,
new HashSet<IBuilder>(patterns.Values
.Where(p => p.Root != mergedRoot)
.Where(p => p.Projects.IsSubsetOf(projects))
.Select(p => p.Root)),
mergedRoot);
}