private static void ExportAux(XElement linksElement, ProjectDependenciesModel projectDependenciesModel, ProjectInfo projectInfo, Dictionary <ProjectDesignator, bool> visitedMap) { if (linksElement == null) { throw new ArgumentNullException("linksElement"); } if (projectDependenciesModel == null) { throw new ArgumentNullException("projectDependenciesModel"); } if (projectInfo == null) { throw new ArgumentNullException("projectInfo"); } if (visitedMap == null) { throw new ArgumentNullException("visitedMap"); } ProjectDesignator projectDesignator = ProjectDesignator.FromProjectInfo(projectInfo); visitedMap[projectDesignator] = true; foreach (ProjectDependency projectDependency in projectInfo.ProjectDependencies) { ProjectDesignator dependentProjectDesignator = ProjectDesignator.FromProjectDependency(projectDependency); ProjectInfo dependentProjectInfo = projectDependenciesModel.ProjectInfos[dependentProjectDesignator]; linksElement.Add( new XElement( _DgmlNamespace + "Link", new XAttribute("Source", CreateProjectDisplayString(projectInfo)), new XAttribute("Target", CreateProjectDisplayString(dependentProjectInfo)), new XAttribute("Label", projectDependency.ProjectVersion))); if (visitedMap.ContainsKey(dependentProjectDesignator)) { // already processed - skip it continue; } ExportAux(linksElement, projectDependenciesModel, dependentProjectInfo, visitedMap); } }
private static void GatherEdgesAux(ProjectInfo projectInfo, ProjectDependenciesGraph projectDependenciesGraph, Dictionary <ProjectDesignator, ProjectInfoVertex> verticesMap, Dictionary <ProjectDesignator, bool> visitedMap) { // TODO IMM HI: abstract the visitor -> such code is duplicated in DgmlProjectDependenciesModelExporter if (projectInfo == null) { throw new ArgumentNullException("projectInfo"); } if (projectDependenciesGraph == null) { throw new ArgumentNullException("projectDependenciesGraph"); } if (verticesMap == null) { throw new ArgumentNullException("verticesMap"); } ProjectDesignator projectDesignator = ProjectDesignator.FromProjectInfo(projectInfo); ProjectInfoVertex projectInfoVertex = verticesMap[projectDesignator]; visitedMap[projectDesignator] = true; foreach (ProjectDependency projectDependency in projectInfo.ProjectDependencies) { ProjectDesignator dependentProjectDesignator = ProjectDesignator.FromProjectDependency(projectDependency); ProjectInfoVertex dependentProjectInfoVertex = verticesMap[dependentProjectDesignator]; projectDependenciesGraph.AddEdge( new Edge <ProjectInfoVertex>( projectInfoVertex, dependentProjectInfoVertex)); if (visitedMap.ContainsKey(dependentProjectDesignator)) { // already processed - skip it continue; } GatherEdgesAux(dependentProjectInfoVertex.ProjectInfo, projectDependenciesGraph, verticesMap, visitedMap); } }
public ProjectDependenciesModel BuildModel(string projectName, string projectConfiguration) { if (projectName == null) { throw new ArgumentNullException("projectName"); } if (projectConfiguration == null) { throw new ArgumentNullException("projectConfiguration"); } var projectDependenciesModel = new ProjectDependenciesModel(); var projectDesignatorQueue = new Queue <ProjectDesignator>(); projectDesignatorQueue.Enqueue(new ProjectDesignator(projectName, projectConfiguration)); while (projectDesignatorQueue.Count > 0) { // get from queue the next project designator to process ProjectDesignator projectDesignator = projectDesignatorQueue.Dequeue(); // check if we've already obtained this project's info and if so - skip it if (projectDependenciesModel.ProjectInfos.ContainsKey(projectDesignator)) { continue; } OnLogMessagePosted( string.Format( "Obtaining project info. Project: {0} (configuration: {1}).", projectDesignator.ProjectName, projectDesignator.ProjectConfiguration)); // obtain project info ProjectInfo projectInfo = ObtainProjectInfo( projectDesignator.ProjectName, projectDesignator.ProjectConfiguration); // remember that we have this project info obtained projectDependenciesModel.ProjectInfos.Add(projectDesignator, projectInfo); // enqueue all dependent projects so that we'll obtain their infos foreach (ProjectDependency projectDependency in projectInfo.ProjectDependencies) { ProjectDesignator dependentProjectDesignator = ProjectDesignator.FromProjectDependency(projectDependency); // add this project to the queue if we haven't obtained its info yet if (!projectDependenciesModel.ProjectInfos.ContainsKey(dependentProjectDesignator)) { projectDesignatorQueue.Enqueue(dependentProjectDesignator); } } // store the root project info to return from the method (if it hasn't been set yet) if (projectDependenciesModel.RootProjectInfo == null) { projectDependenciesModel.RootProjectInfo = projectInfo; } } return(projectDependenciesModel); }
public ProjectDependenciesModel BuildWhoDependsOnModel(string projectName, string projectConfiguration) { if (projectName == null) { throw new ArgumentNullException("projectName"); } if (projectConfiguration == null) { throw new ArgumentNullException("projectConfiguration"); } string[] repositories = _svnClient.GetRepositoryNames(); var projectDependenciesModel = new ProjectDependenciesModel(); var projectDesignatorQueue = new Queue <ProjectDesignator>(); foreach (string repository in repositories) { projectDesignatorQueue.Enqueue(new ProjectDesignator(repository, projectConfiguration)); } projectDesignatorQueue.Enqueue(new ProjectDesignator(projectName, projectConfiguration)); while (projectDesignatorQueue.Count > 0) { // get from queue the next project designator to process ProjectDesignator projectDesignator = projectDesignatorQueue.Dequeue(); // check if we've already obtained this project's info and if so - skip it if (projectDependenciesModel.ProjectInfos.ContainsKey(projectDesignator)) { continue; } OnLogMessagePosted( string.Format( "Obtaining project info. Project: {0} (configuration: {1}).", projectDesignator.ProjectName, projectDesignator.ProjectConfiguration)); // obtain project info ProjectInfo projectInfo = ObtainProjectInfo( projectDesignator.ProjectName, projectDesignator.ProjectConfiguration); // remember that we have this project info obtained projectDependenciesModel.ProjectInfos.Add(projectDesignator, projectInfo); // enqueue all dependent projects so that we'll obtain their infos foreach (ProjectDependency projectDependency in projectInfo.ProjectDependencies) { ProjectDesignator dependentProjectDesignator = ProjectDesignator.FromProjectDependency(projectDependency); // add this project to the queue if we haven't obtained its info yet if (!projectDependenciesModel.ProjectInfos.ContainsKey(dependentProjectDesignator)) { projectDesignatorQueue.Enqueue(dependentProjectDesignator); } } } projectDependenciesModel.RootProjectInfo = projectDependenciesModel.ProjectInfos.FirstOrDefault(f => f.Key.ProjectName == projectName).Value; List <ProjectDesignator> removeList = new List <ProjectDesignator>(); foreach (ProjectDesignator projectDesignator in projectDependenciesModel.ProjectInfos.Keys) { if (projectDesignator.ProjectName == projectDependenciesModel.RootProjectInfo.ProjectName && projectDesignator.ProjectConfiguration == projectDependenciesModel.RootProjectInfo.ProjectConfiguration) { continue; } if (!HasPathTo(projectDependenciesModel.ProjectInfos[projectDesignator], projectDependenciesModel.RootProjectInfo, projectDependenciesModel)) { removeList.Add(projectDesignator); } } foreach (ProjectDesignator projectDesignator in removeList) { projectDependenciesModel.ProjectInfos.Remove(projectDesignator); foreach (ProjectInfo projectInfo in projectDependenciesModel.ProjectInfos.Values) { projectInfo.ProjectDependencies.RemoveAll(f => f.ProjectConfiguration == projectDesignator.ProjectConfiguration && f.ProjectName == projectDesignator.ProjectName); } } return(projectDependenciesModel); }