public async Task CheckoutSolutionsAsync(IEnumerable <ISolutionProjectModel> projectViewModels, IServiceSettings settings, CancellationToken cancellationToken = default(CancellationToken)) { if (cancellationToken.IsCancellationRequested) { return; } await cancellationToken.WaitWhenPaused(); var viewModels = projectViewModels as ISolutionProjectModel[] ?? projectViewModels.ToArray(); var versionSpec = settingsService.Get(SettingsKeys.VersionSpecKey, VersionSpec.Latest); statusService.InitOrAttach(viewModels.Length, $"Checkout (Get {VersionSpecToStringConverter.GetReadableString(versionSpec)})"); try { GetStatus[] getStatuses; List <string> pathFilter = new List <string>(); var checkoutServiceSettings = settings.GetSettingsFromProvider <CheckoutServiceSettings>(); if (mainLogic.IsCompleteRunning && checkoutServiceSettings.CheckoutWorkingfolder) { using (new PauseCheckedActionScope(() => viewModels.SetOperations(Operations.Checkout), () => viewModels.SetOperations(Operations.None), cancellationToken)) { var workingFolders = viewModels.Select(model => model.ParentWorkingFolder).Distinct().ToArray(); getStatuses = await Task.WhenAll(workingFolders.Select(folder => GetLatestVersionAsync(folder, settings, versionSpec, cancellationToken))); pathFilter.AddRange(workingFolders.Select(folder => folder.LocalItem)); viewModels.Apply(model => statusService.IncrementStep()); } } else { pathFilter.AddRange(viewModels.Select(m => m.SolutionFolder)); getStatuses = await Task.WhenAll(viewModels.Select(model => CheckoutSolutionAsync(model, settings, versionSpec, cancellationToken))); } if (checkoutServiceSettings.PromptForMerge && getStatuses.Any(status => status != null && status.NumConflicts > 0)) { Application.Current.Dispatcher.Invoke(() => { TeamControlFactory.ResolveConflictsVS(tfsContext.SelectedWorkspace, pathFilter.ToArray()); }); } } catch (TaskCanceledException) { } }
private async Task <GetStatus> GetLatestVersionAsync(ItemSpec itemSpec, VersionSpec versionSpec, IServiceSettings settings, object userData, CancellationToken cancellationToken = default(CancellationToken)) { ISolutionProjectModel projectModel = userData as ISolutionProjectModel; var workspace = tfsContext.SelectedWorkspace; var space = tfsContext.VersionControlServer?.TryGetWorkspace(itemSpec.Item); if (space != null) { workspace = space; } if (workspace == null || tfsContext.IsGitSourceControlled(projectModel.ItemPath) || (tfsContext.VersionControlServer == null && !tfsContext.IsTfsConnected && tfsContext.SelectedWorkspace == null)) { var dte = serviceProvider.Get <DTE2>(); if (dte?.SourceControl != null) { return(await CheckoutWithDTESourceControlProviderAsync(dte, itemSpec)); } var args = $"-C \"{projectModel.ItemPath}\" pull"; ScriptHelper.ExecuteScript("git", args, ScriptExecutionSettings.Default, Output.WriteLine); } await cancellationToken.WaitWhenPaused(); var request = new GetRequest(itemSpec, versionSpec); var checkoutServiceSettings = settings.GetSettingsFromProvider <CheckoutServiceSettings>(projectModel); bool forceAndOverwrite = checkoutServiceSettings.ForceAndOverwrite; GetOptions getOptions = forceAndOverwrite ? GetOptions.GetAll | GetOptions.Overwrite : GetOptions.None; GetFilterCallback filterCallback; if (cancellationToken.IsCancellationRequested) { return(null); } using (TrackProgress(projectModel, out filterCallback, cancellationToken)) { if (cancellationToken.IsCancellationRequested) { return(null); } await cancellationToken.WaitWhenPaused(); var status = await workspace.GetAsync(request, getOptions, filterCallback, userData, cancellationToken); Output.WriteLine(string.Empty); var sb = new StringBuilder(); Output.WriteLine("Get Version: " + VersionSpecToStringConverter.GetReadableString(versionSpec) + " '" + itemSpec.Item + "'"); sb.AppendDictionary(ReflectionHelper.GetProperties(status)); Output.WriteLine(sb.ToString()); foreach (Failure failure in status.GetFailures()) { Output.WriteError($"Fail:{failure.Message} with code {failure.Code}", failure.LocalItem); } if (status.NumConflicts > 0 && !checkoutServiceSettings.PromptForMerge) { Output.WriteWarning($"{status.NumConflicts} Checkout Conflicts for {itemSpec.Item}", itemSpec.Item); } return(status); } }