예제 #1
0
        private static bool ResolveConflicts(ITfsTemporaryWorkspace tempWorkspace, ref bool finished)
        {
            bool hadConflicts = false;

            while (tempWorkspace.Conflicts.Count != 0)
            {
                hadConflicts = true;
                int oldConflictsCount = tempWorkspace.Conflicts.Count;

                SimpleLogger.Checkpoint("PerformMerge: Resolving conflict ({0} remaining)", oldConflictsCount);
                //Repository.Instance.TfsUIInteractionProvider.ResolveConflictsInternally(tempWorkspace);
                //return false;
                Repository.Instance.TfsUIInteractionProvider.ResolveConflictsPerTF(tempWorkspace.MappedFolder);

                SimpleLogger.Checkpoint("PerformMerge: Finished resolving conflict ({0} remaining)", oldConflictsCount);
                tempWorkspace.RefreshConflicts();
                if (tempWorkspace.Conflicts.Count == oldConflictsCount)
                {
                    MessageBoxViewModel mbvm = new MessageBoxViewModel("Cancel merge?", "There are conflicts remaining to be resolved. Really cancel the merge?", MessageBoxViewModel.MessageBoxButtons.None);
                    var yesButton            = new MessageBoxViewModel.MessageBoxButton("_Yes");
                    mbvm.ConfirmButtons.Add(yesButton);
                    mbvm.ConfirmButtons.Add(new MessageBoxViewModel.MessageBoxButton("_No"));
                    Repository.Instance.ViewManager.ShowModal(mbvm);

                    if (yesButton.IsChecked)
                    {
                        finished = false;
                        break;
                    }
                }
            }
            return(hadConflicts);
        }
예제 #2
0
        private void AutoMerge()
        {
            var confirm = new MessageBoxViewModel("vMerge: AutoMerge all changesets", "All changesets will be merged silently as long as no conflict arises. Are you really sure to proceed?", MessageBoxViewModel.MessageBoxButtons.None);
            var goOn    = new MessageBoxViewModel.MessageBoxButton("Merge silently");
            var cancel  = new MessageBoxViewModel.MessageBoxButton("Cancel");

            confirm.ConfirmButtons.Add(goOn);
            confirm.ConfirmButtons.Add(cancel);
            Repository.Instance.ViewManager.ShowModal(confirm);
            if (goOn.IsChecked)
            {
                Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
                    (progressParams) =>
                {
                    progressParams.TrackProgress.MaxProgress = ChangesetList.Where(item => item.CanBeMerged).Count();
                    foreach (var changeset in ChangesetList.Where(item => item.CanBeMerged).OrderBy(item => item.SourceCheckinId))
                    {
                        progressParams.TrackProgress.Increment();
                        progressParams.CancellationToken.ThrowIfCancellationRequested();

                        var copy = progressParams.CloneWithoutIncrements();
                        if (!PerformMerge(changeset, copy))
                        {
                            var cancelled = new MessageBoxViewModel("vMerge: AutoMerge all changesets", "AutoMerge has been cancelled. Please merge the remaining changesets manually.", MessageBoxViewModel.MessageBoxButtons.OK);
                            Repository.Instance.ViewManager.ShowModal(cancelled);
                        }
                    }
                }, "Merging changesets ...");

                LoadAllAssociatedChangesetsIncludingMerges(true);
            }
        }
예제 #3
0
        private void AutoMerge()
        {
            try
            {
                var confirm = new MessageBoxViewModel("vMerge: AutoMerge all changesets", "All changesets will be merged silently as long as no conflict arises. Are you really sure to proceed?", MessageBoxViewModel.MessageBoxButtons.None);
                var goOn    = new MessageBoxViewModel.MessageBoxButton("Merge silently");
                var cancel  = new MessageBoxViewModel.MessageBoxButton("Cancel");

                confirm.ConfirmButtons.Add(goOn);
                confirm.ConfirmButtons.Add(cancel);
                Repository.Instance.ViewManager.ShowModal(confirm);
                if (goOn.IsChecked)
                {
                    ChangesetListElement conflictingChangeset = null;
                    Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
                        (progressParams) =>
                    {
                        progressParams.TrackProgress.MaxProgress = ChangesetList.Where(item => item.CanBeMerged).Count();
                        foreach (var changeset in ChangesetList.Where(item => item.CanBeMerged).OrderBy(item => item.SourceCheckinId))
                        {
                            progressParams.TrackProgress.Increment();
                            progressParams.CancellationToken.ThrowIfCancellationRequested();

                            var copy = progressParams.CloneWithoutIncrements();
                            if (!PerformMerge(changeset, copy))
                            {
                                SimpleLogger.Log(SimpleLogLevel.Info, "Merge conflict in: " + changeset.SourceCheckinId + " " + changeset.SourceComment);
                                conflictingChangeset = changeset;
                                break;
                            }
                        }
                    }, "Merging changesets ...");

                    if (conflictingChangeset != null)
                    {
                        var comment = conflictingChangeset.SourceComment;
                        if (comment.Length > 80)
                        {
                            comment = comment.Substring(0, 77) + "...";
                        }
                        var cancelled = new MessageBoxViewModel("vMerge: AutoMerge all changesets", String.Format("AutoMerge has stopped due to a conflict caused by changeset #{0} (comment: \"{1}\").\r\nPlease merge the remaining changesets manually.", conflictingChangeset.SourceCheckinId, comment), MessageBoxViewModel.MessageBoxButtons.OK);
                        Repository.Instance.ViewManager.ShowModal(cancelled);
                    }

                    LoadAllAssociatedChangesetsIncludingMerges(true);
                }
            } catch (Exception ex)
            {
                SimpleLogger.Log(ex, true, false);
            }
        }
예제 #4
0
        private void DeleteProfile(IProfileSettings profileSettings)
        {
            MessageBoxViewModel mbvm = new MessageBoxViewModel("Delete profile?", String.Format("You are about to delete the profile '{0}'. This action cannot be undone.\r\nProceed?", profileSettings.Name), MessageBoxViewModel.MessageBoxButtons.None);
            var yesButton            = new MessageBoxViewModel.MessageBoxButton("_Yes");

            mbvm.ConfirmButtons.Add(yesButton);
            mbvm.ConfirmButtons.Add(new MessageBoxViewModel.MessageBoxButton("_No"));
            Repository.Instance.ViewManager.ShowModal(mbvm);

            if (yesButton.IsChecked)
            {
                if (Repository.Instance.ProfileProvider.DeleteProfile(profileSettings))
                {
                    Profiles.Remove(profileSettings);
                }
            }
        }
예제 #5
0
 void Save()
 {
     if (!Repository.Instance.ProfileProvider.SaveProfileAs(null, ProfileName, false))
     {
         var mbvm = new MessageBoxViewModel("Profile already exists", "The selected profile '" + ProfileName + "' already exists. Overwrite?", MessageBoxViewModel.MessageBoxButtons.None);
         var yes  = new MessageBoxViewModel.MessageBoxButton("Overwrite");
         var no   = new MessageBoxViewModel.MessageBoxButton("Cancel");
         mbvm.ConfirmButtons.Add(yes);
         mbvm.ConfirmButtons.Add(no);
         Repository.Instance.ViewManager.ShowModal(mbvm);
         if (yes.IsChecked)
         {
             Repository.Instance.ProfileProvider.SaveProfileAs(null, ProfileName, true);
         }
         else
         {
             return;
         }
     }
     RaiseFinished(true);
 }
예제 #6
0
        bool PerformMerge(ChangesetListElement item, TrackProgressParameters externalProgress = null)
        {
            bool returnValue = false;

            if (item == null)
            {
                return(false);
            }

            var tempWorkspace  = Repository.Instance.TfsBridgeProvider.GetTemporaryWorkspace(MergeSource, MergeTarget);
            var mergeChangeset = TfsItemCache.GetChangesetFromCache(item.SourceCheckinId).TfsChangeset;

            bool finished = Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
                (progressParams) =>
            {
                tempWorkspace.Merge(
                    MergeTarget, PathFilter,
                    new ITfsChangeset[] { mergeChangeset }.AsEnumerable(),
                    progressParams.TrackProgress);
            }, String.Format("Merging changeset #{0} ...", item.SourceCheckinId), externalProgress);

            if (!finished)
            {
                tempWorkspace.UndoAllPendingChanges();
                return(false);
            }

            var checkInSummary = new CheckInSummaryViewModel();

            tempWorkspace.RefreshConflicts();
            checkInSummary.Changes =
                tempWorkspace.PendingChanges
                .Select(
                    change => new CheckInSummaryViewModel.PendingChangeWithConflict(
                        change,
                        tempWorkspace.Conflicts.Where(conflict => conflict.ServerPath == change.ServerPath).FirstOrDefault()))
                .ToList();

            while (tempWorkspace.Conflicts.Count != 0)
            {
                int oldConflictsCount = tempWorkspace.Conflicts.Count;
                Repository.Instance.TfsUIInteractionProvider.ResolveConflictsPerTF(tempWorkspace.MappedFolder);
                tempWorkspace.RefreshConflicts();
                if (tempWorkspace.Conflicts.Count == oldConflictsCount)
                {
                    MessageBoxViewModel mbvm = new MessageBoxViewModel("Cancel merge?", "There are conflicts remaining to be solved. Really cancel the merge?", MessageBoxViewModel.MessageBoxButtons.None);
                    var yesButton            = new MessageBoxViewModel.MessageBoxButton("_Yes");
                    mbvm.ConfirmButtons.Add(yesButton);
                    mbvm.ConfirmButtons.Add(new MessageBoxViewModel.MessageBoxButton("_No"));
                    Repository.Instance.ViewManager.ShowModal(mbvm);

                    if (yesButton.IsChecked)
                    {
                        finished = false;
                        break;
                    }
                }
            }

            if (finished)
            {
                checkInSummary.TemporaryWorkspace  = tempWorkspace;
                checkInSummary.OriginalChangesets  = new ITfsChangeset[] { item.Changeset.TfsChangeset }.ToList();
                checkInSummary.SourceChangesets    = new ITfsChangeset[] { mergeChangeset }.ToList();
                checkInSummary.AssociatedWorkItems = item.Changeset.TfsChangeset.RelatedWorkItems;
                checkInSummary.CheckInComment      = BuildCheckInComment(
                    item.Changeset.TfsChangeset, mergeChangeset);

                if (externalProgress == null)
                {
                    var view = Repository.Instance.ViewManager.CreateViewFor(checkInSummary);
                    view.Finished += CheckInDialogClosed;
                }
                else
                {
                    checkInSummary.Cancelled = false;
                    CommitMerge(checkInSummary, externalProgress);
                }
                returnValue = true;
            }
            else
            {
                tempWorkspace.UndoAllPendingChanges();
            }
            return(returnValue);
        }
예제 #7
0
        private void CommitMerge(CheckInSummaryViewModel vm, TrackProgressParameters externalProgress = null)
        {
            try
            {
                var associatedWorkItems
                    = vm
                      .SourceChangesets
                      .SelectMany(changeset => changeset.RelatedWorkItems)
                      .GroupBy(workItem => workItem.WorkItem.Id)
                      .Select(group => group.First());

                int cs = -1;

                try
                {
                    Exception ex = null;
                    Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
                        (progressParams) =>
                    {
                        try
                        {
                            cs = vm.TemporaryWorkspace.CheckIn(associatedWorkItems, vm.CheckInComment);
                            Repository.Instance.BackgroundTaskManager.Post(
                                () =>
                            {
                                TfsItemCache.ChangesetsHaveBeenMerged(vm.SourceChangesets);
                                return(true);
                            });
                        }
                        catch (Exception e)
                        {
                            ex = e;
                        }
                    }, externalProgress);

                    if (ex != null && ex.Message.Contains("TF26006"))
                    {
                        MessageBoxViewModel mbvm =
                            new MessageBoxViewModel(
                                "TFS Workspace Exception",
                                "Error TF26006 occurred during check in.\r\n" +
                                "Unfortunately when this happens, the check in has occurred already but\r\n" +
                                "the work item association didn't work; please associate the merged changeset\r\n" +
                                "manually.\r\n\r\n" +
                                "To avoid this error, please clear the local TFS cache manually by \r\n" +
                                "deleting all files in the cache folder before continuing merging.", MessageBoxViewModel.MessageBoxButtons.None);
                        var yesButton = new MessageBoxViewModel.MessageBoxButton("_Show TFS cache");
                        mbvm.ConfirmButtons.Add(yesButton);
                        mbvm.ConfirmButtons.Add(new MessageBoxViewModel.MessageBoxButton("_Ignore"));
                        Repository.Instance.ViewManager.ShowModal(mbvm);
                        if (yesButton.IsChecked)
                        {
                            Process.Start("explorer.exe", Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft\\TeamFoundation\\4.0\\Cache"));
                        }
                    }
                }
                catch (OperationCanceledException)
                {
                }

                var newChangeset = TfsItemCache.UpdateChangesetFromCache(new TfsChangesetWrapper(Repository.Instance.TfsBridgeProvider.GetChangesetById(cs)));

                var relatedChangesetListElements =
                    _changesetList.Where(element => vm.SourceChangesets.Any(changeset => changeset.Changeset.ChangesetId == element.SourceCheckinId));

                foreach (var element in relatedChangesetListElements)
                {
                    element.TargetCheckinDate = newChangeset.TfsChangeset.Changeset.CreationDate;
                    element.TargetCheckinId   = newChangeset.TfsChangeset.Changeset.ChangesetId;
                    element.TargetExists      = true;
                    element.CanBeMerged       = false;
                    DetermineWarningStatus(element);
                }

                if (SelectNewRowAction != null)
                {
                    SelectNewRowAction();
                }

                NothingToMergeLeft = !IsAnythingToMergeLeft();
            }
            catch (Exception ex)
            {
                SimpleLogger.Log(ex, true, true);
                throw;
            }
        }