private void AddProjectDependencies( GitRepository gitRepository, DotNetProjectInfo project, List <DotNetProjectInfo> allProjectList) { var projectInfo = allProjectList.FirstOrDefault(e => e.CsProjPath == project.CsProjPath); if (projectInfo == null) { return; } var dependencies = projectInfo.Dependencies; foreach (var dependency in dependencies) { if (allProjectList.IsMarkedForBuild(dependency.RepositoryName, dependency.CsProjPath)) { continue; } allProjectList.MarkForBuild(dependency.RepositoryName, dependency.CsProjPath); AddProjectDependencies(gitRepository, dependency, allProjectList); } }
private void MarkDependantProjectsForBuild( GitRepository gitRepository, string csProjFilePath, List <DotNetProjectInfo> allProjectList) { var repositoryName = gitRepository.FindRepositoryOf(csProjFilePath); var project = new DotNetProjectInfo(repositoryName, csProjFilePath, true); if (allProjectList.IsMarkedForBuild(repositoryName, csProjFilePath)) { return; } allProjectList.MarkForBuild(project); AddProjectDependencies(gitRepository, project, allProjectList); }
private void FillProjectDependencies(DotNetProjectInfo project) { var projectNode = XElement.Load(project.CsProjPath); var referenceNodes = projectNode.Descendants("ItemGroup").Descendants("ProjectReference"); foreach (var referenceNode in referenceNodes) { if (referenceNode.Attribute("Include") == null) { continue; } var relativePath = referenceNode.Attribute("Include").Value; var file = new FileInfo(project.CsProjPath); var referenceProjectInfo = new FileInfo(Path.Combine(file.Directory.FullName, relativePath)); var referenceProject = new DotNetProjectInfo(project.RepositoryName, referenceProjectInfo.FullName, false); project.Dependencies.Add(referenceProject); } }
private void BuildInternal(DotNetProjectInfo project, string arguments, ConcurrentBag <string> builtProjects) { var buildArguments = arguments.TrimStart('"').TrimEnd('"'); Console.WriteLine("Executing...: dotnet build " + project.CsProjPath + " " + buildArguments); var output = CmdHelper.RunCmdAndGetOutput( "dotnet build " + project.CsProjPath + " " + buildArguments, out int buildStatus ); if (buildStatus == 0) { builtProjects.Add(project.CsProjPath); WriteOutput(output, ConsoleColor.Green); } else { WriteOutput(output, ConsoleColor.Red); Console.WriteLine("Build failed for :" + project.CsProjPath); throw new Exception("Build failed!"); } }
private void SortByDependenciesVisit( List <DotNetProjectInfo> source, DotNetProjectInfo item, List <DotNetProjectInfo> sorted, Dictionary <DotNetProjectInfo, bool> visited) { bool inProcess; var alreadyVisited = visited.TryGetValue(item, out inProcess); if (alreadyVisited) { if (inProcess) { throw new ArgumentException("Cyclic dependency found! Item: " + item); } } else { visited[item] = true; var dependencies = item.Dependencies; if (dependencies != null) { foreach (var dependency in dependencies) { var dependencyItem = source.FirstOrDefault(e => e.CsProjPath == dependency.CsProjPath); if (dependencyItem != null) { SortByDependenciesVisit(source, dependencyItem, sorted, visited); } } } visited[item] = false; sorted.Add(item); } }
public static bool IsMarkedForBuild(this List <DotNetProjectInfo> projects, DotNetProjectInfo project) { return(projects.IsMarkedForBuild(project.RepositoryName, project.CsProjPath)); }
public static void MarkForBuild(this List <DotNetProjectInfo> projects, DotNetProjectInfo project) { projects.MarkForBuild(project.RepositoryName, project.CsProjPath); }