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); }
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); }