Example #1
0
        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)
            { }
        }
Example #2
0
        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);
            }
        }