private async Task <Solution> UpdateProjectsAsync(Solution solution, HashSet <Checksum> oldChecksums, HashSet <Checksum> newChecksums)
        {
            var oldMap = await GetProjectMapAsync(solution, oldChecksums).ConfigureAwait(false);

            var newMap = await GetProjectMapAsync(_assetService, newChecksums).ConfigureAwait(false);

            // added project
            foreach (var kv in newMap)
            {
                if (!oldMap.ContainsKey(kv.Key))
                {
                    // bulk sync project assets
                    await _assetService.SynchronizeProjectAssetsAsync(kv.Value.Checksum, _cancellationToken).ConfigureAwait(false);

                    var projectInfo = await CreateProjectInfoAsync(kv.Value.Checksum).ConfigureAwait(false);

                    if (projectInfo == null)
                    {
                        // this project is not supported in OOP
                        continue;
                    }

                    // we have new project added
                    solution = solution.AddProject(projectInfo);
                }
            }

            // changed project
            foreach (var kv in newMap)
            {
                ProjectStateChecksums oldProjectChecksums;
                if (!oldMap.TryGetValue(kv.Key, out oldProjectChecksums))
                {
                    continue;
                }

                var newProjectChecksums = kv.Value;
                Contract.ThrowIfTrue(oldProjectChecksums.Checksum == newProjectChecksums.Checksum);

                solution = await UpdateProjectAsync(solution.GetProject(kv.Key), oldProjectChecksums, newProjectChecksums).ConfigureAwait(false);
            }

            // removed project
            foreach (var kv in oldMap)
            {
                if (!newMap.ContainsKey(kv.Key))
                {
                    // we have a project removed
                    solution = solution.RemoveProject(kv.Key);
                }
            }

            return(solution);
        }
Exemple #2
0
        private async Task SynchronizeAssetsAsync(Solution solution, Dictionary <ProjectId, ProjectStateChecksums> oldMap, Dictionary <ProjectId, ProjectStateChecksums> newMap)
        {
            using var pooledObject = SharedPools.Default <HashSet <Checksum> >().GetPooledObject();

            // added project
            foreach (var kv in newMap)
            {
                if (oldMap.ContainsKey(kv.Key))
                {
                    continue;
                }

                pooledObject.Object.Add(kv.Value.Checksum);
            }

            await _assetService.SynchronizeProjectAssetsAsync(pooledObject.Object, _cancellationToken).ConfigureAwait(false);
        }