Пример #1
0
 private void EmitProject(string eventType, DotNetProjectInfo information)
 {
     _emitter.Emit(
         eventType,
         new ProjectInformationResponse()
     {
         { "DotNetProject", information }
     });
 }
Пример #2
0
        public void Update(string projectDirectory,
                           IEnumerable <ProjectContext> contexts,
                           Action <ProjectId, ProjectContext> addAction,
                           Action <ProjectId> removeAction)
        {
            _logger.LogDebug($"Updating project ${projectDirectory}");

            var entry = GetOrAddEntry(projectDirectory, out bool added);

            // remove frameworks which don't exist after update
            var remove = entry.Frameworks.Except(contexts.Select(c => c.TargetFramework));

            foreach (var each in remove)
            {
                var toRemove = entry.Get(each);
                removeAction(toRemove.Id);
                entry.Remove(each);
            }

            foreach (var context in contexts)
            {
                _logger.LogDebug($"  For context {context.TargetFramework}");
                ProjectState currentState = entry.Get(context.TargetFramework);
                if (currentState != null)
                {
                    _logger.LogDebug($"  Update exsiting {nameof(ProjectState)}.");
                    currentState.ProjectContext = context;
                }
                else
                {
                    _logger.LogDebug($"  Add new {nameof(ProjectState)}.");
                    var projectId = ProjectId.CreateNewId();
                    entry.Set(new ProjectState(projectId, context));
                    addAction(projectId, context);
                }
            }

            var projectInformation = new DotNetProjectInfo(entry);

            if (added)
            {
                EmitProject(EventTypes.ProjectChanged, projectInformation);
            }
            else
            {
                EmitProject(EventTypes.ProjectAdded, projectInformation);
            }
        }
Пример #3
0
        /// <summary>
        /// Remove projects not in the give project set and execute the <paramref name="removeAction"/> on the removed project id.
        /// </summary>
        /// <param name="perservedProjects">Projects to perserve</param>
        /// <param name="removeAction"></param>
        public void RemoveExcept(IEnumerable <string> perservedProjects, Action <ProjectEntry> removeAction)
        {
            var removeList = new HashSet <string>(_projects.Keys, StringComparer.OrdinalIgnoreCase);

            removeList.ExceptWith(perservedProjects);

            foreach (var key in removeList)
            {
                var entry = _projects[key];
                var projectInformation = new DotNetProjectInfo(entry);

                EmitProject(EventTypes.ProjectRemoved, projectInformation);
                removeAction(entry);

                _projects.Remove(key);
            }
        }
Пример #4
0
    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);
        }
    }
Пример #5
0
    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!");
        }
    }
Пример #6
0
    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);
        }
    }
Пример #7
0
 public static bool IsMarkedForBuild(this List <DotNetProjectInfo> projects, DotNetProjectInfo project)
 {
     return(projects.IsMarkedForBuild(project.RepositoryName, project.CsProjPath));
 }
Пример #8
0
 public static void MarkForBuild(this List <DotNetProjectInfo> projects, DotNetProjectInfo project)
 {
     projects.MarkForBuild(project.RepositoryName, project.CsProjPath);
 }