示例#1
0
        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);
        }