Ejemplo n.º 1
0
        private void CommitMerge(CheckInSummaryViewModel vm, TrackProgressParameters externalProgress = null)
        {
            var associatedWorkItems
                = vm
                  .SourceChangesets
                  .SelectMany(changeset => changeset.RelatedWorkItems)
                  .GroupBy(workItem => workItem.WorkItem.Id)
                  .Select(group => group.First());

            int cs = -1;

            try
            {
                Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
                    (progressParams) =>
                {
                    //cs = vm.TemporaryWorkspace.CheckIn(associatedWorkItems, vm.CheckInComment);
                    cs = 1;
                }, externalProgress);
            }
            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 sourceCS in vm.SourceChangesets)
            {
                _allAssociatedChangesetsIncludingMerges.Add(new MergedChangesetLink()
                {
                    Source = TfsItemCache.GetChangesetFromCache(sourceCS.Changeset.ChangesetId), Target = newChangeset
                });
            }

            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);
            }
        }
Ejemplo n.º 2
0
        private void DetermineWarningStatus(ChangesetListElement changesetListElement)
        {
            if (changesetListElement.TargetCheckinId != 0)
            {
                return;
            }

            if (changesetListElement.SourceCheckinId == 0)
            {
                changesetListElement.HasWarning  = true;
                changesetListElement.WarningText =
                    "This changeset has not yet been merged to the selected source branch.";
                changesetListElement.CanBeMerged = false;
                return;
            }

            TfsChangesetWrapper sourceCS =
                TfsItemCache.GetChangesetFromCache(changesetListElement.SourceCheckinId);

            bool anyChangeNotInFilter
                = PathFilter == null ? false :
                  sourceCS.TfsChangeset.GetAllChanges()
                  .Any(change => !change.Change.Item.ServerItem.StartsWith(PathFilter));

            bool allChangesNotInFilter
                = PathFilter == null ? false :
                  sourceCS.TfsChangeset.GetAllChanges()
                  .All(change => !change.Change.Item.ServerItem.StartsWith(PathFilter));

            if (anyChangeNotInFilter || allChangesNotInFilter)
            {
                changesetListElement.HasWarning = true;
                if (allChangesNotInFilter)
                {
                    changesetListElement.WarningText =
                        "No change in this changeset is part of the merge due to the path filter selection.";
                    changesetListElement.CanBeMerged = false;
                }
                else if (anyChangeNotInFilter)
                {
                    changesetListElement.WarningText =
                        "Some changes in this changeset are not part of the merge due to the path filter selection.";
                }
            }
        }
Ejemplo n.º 3
0
        void FindOriginalChangeset(int id)
        {
            var listElement = ChangesetList.Where(item => item.SourceCheckinId == id).FirstOrDefault();

            if (listElement == null)
            {
                throw new ArgumentException("Changeset Id not found in list");
            }

            var changeset = TfsItemCache.GetChangesetFromCache(id);

            if (changeset == null)
            {
                throw new ArgumentException("Changeset not found");
            }

            var sourceChangesets = new Dictionary <int, MergedChangeset>();
            var targetChangesets = new Dictionary <int, MergedChangeset>();

            foreach (var merge in changeset.TfsChangeset.FindMergesForActiveProject(MergeSource, PossibleMergeTargets))
            {
                sourceChangesets[merge.Source.Changeset.ChangesetId] = merge;
                targetChangesets[merge.Target.Changeset.ChangesetId] = merge;
            }

            var relevantId = sourceChangesets.Keys.Except(targetChangesets.Keys).ToArray();

            if (relevantId.Length > 1)
            {
                listElement.OriginalChangesetId     = id;
                listElement.OriginalChangesetLoaded = true;
                listElement.HasWarning  = true;
                listElement.WarningText = "Could not determine original changeset.";
            }
            else
            {
                listElement.OriginalChangesetId     = relevantId.Length > 0 ? relevantId[0] : id;
                listElement.OriginalChangesetLoaded = true;
            }
        }
Ejemplo n.º 4
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);
        }
Ejemplo n.º 5
0
        bool PerformMerge(ChangesetListElement item, TrackProgressParameters externalProgress = null)
        {
            SimpleLogger.Checkpoint("PerformMerge: Starting");
            bool returnValue        = false;
            bool undoPendingChanges = true;

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

            SimpleLogger.Checkpoint("PerformMerge: Getting temporary workspace");
            var tempWorkspace = Repository.Instance.TfsBridgeProvider.GetTemporaryWorkspace(MergeSource, MergeTarget);

            SimpleLogger.Checkpoint("PerformMerge: Undoing pending changes in temporary workspace");
            tempWorkspace.UndoAllPendingChanges();

            try
            {
                var mergeChangeset = TfsItemCache.GetChangesetFromCache(item.SourceCheckinId).TfsChangeset;

                bool finished = false;
                try
                {
                    finished = Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
                        (progressParams) =>
                    {
                        tempWorkspace.Merge(
                            MergeTarget, PathFilter,
                            new ITfsChangeset[] { mergeChangeset }.AsEnumerable(),
                            progressParams.TrackProgress);
                    }, String.Format("Merging changeset #{0} ...", item.SourceCheckinId), externalProgress);
                }
                catch (AggregateException ex)
                {
                    bool otherExceptions = false;
                    foreach (var iex in ex.InnerExceptions)
                    {
                        if (iex is LocalPathTooLongException)
                        {
                            DisplayPathTooLongHelp();
                        }
                        else
                        {
                            SimpleLogger.Log(ex, false, false);
                            otherExceptions = true;
                        }
                    }
                    if (otherExceptions)
                    {
                        SimpleLogger.Log(ex, true);
                    }
                }
                catch (LocalPathTooLongException)
                {
                    DisplayPathTooLongHelp();
                    return(false);
                }
                catch (Exception ex)
                {
                    SimpleLogger.Log(ex);
                    return(false);
                }

                if (!finished)
                {
                    return(false);
                }

                SimpleLogger.Checkpoint("PerformMerge: Building check-in summary");
                var checkInSummary = new CheckInSummaryViewModel();
                SimpleLogger.Checkpoint("PerformMerge: Refreshing conflicts");
                tempWorkspace.RefreshConflicts();
                SimpleLogger.Checkpoint("PerformMerge: Refreshing pending changes");
                tempWorkspace.RefreshPendingChanges();
                checkInSummary.SourceBranch = MergeSource;
                checkInSummary.TargetBranch = MergeTarget;
                checkInSummary.Changes      =
                    tempWorkspace.PendingChanges
                    .Select(
                        change => new CheckInSummaryViewModel.PendingChangeWithConflict(
                            change,
                            tempWorkspace.Conflicts.Where(conflict => conflict.ServerPath == change.ServerPath).FirstOrDefault()))
                    .ToList();

                // Automerging but conflicts?
                if (externalProgress != null && tempWorkspace.Conflicts.Count != 0)
                {
                    return(false);
                }

                bool hadConflicts = ResolveConflicts(tempWorkspace, ref finished);

                if (finished)
                {
                    SimpleLogger.Checkpoint("PerformMerge: Finished");
                    if (!item.OriginalChangesetLoaded)
                    {
                        FindOriginalChangeset(item.SourceCheckinId);
                    }

                    checkInSummary.TemporaryWorkspace = tempWorkspace;

                    var originalCsWrapper = item.OriginalChangesetLoaded ? TfsItemCache.GetChangesetFromCache(item.OriginalChangesetId) : null;
                    var originalCs        = originalCsWrapper != null ? originalCsWrapper.TfsChangeset : null;
                    checkInSummary.OriginalChangesets  = new ITfsChangeset[] { originalCs ?? mergeChangeset }.ToList();
                    checkInSummary.SourceChangesets    = new ITfsChangeset[] { mergeChangeset }.ToList();
                    checkInSummary.AssociatedWorkItems = item.SourceChangeset.RelatedWorkItems;
                    checkInSummary.CheckInComment      = BuildCheckInComment(
                        item.SourceChangeset, mergeChangeset);

                    if (hadConflicts || (externalProgress == null && AutoMergeDirectly == false))
                    {
                        SimpleLogger.Checkpoint("PerformMerge: Showing check-in dialog");

                        if (Repository.Instance.Settings.FetchSettings <bool>(Constants.Settings.PerformNonModalMergeKey))
                        {
                            undoPendingChanges = false;
                            EmbeddedCheckInSummaryViewModel           = checkInSummary;
                            _temporaryWorkspace                       = tempWorkspace;
                            EmbeddedCheckInSummaryViewModel.Finished += EmbeddedCheckInSummaryViewModel_Finished;
                        }
                        else
                        {
                            Repository.Instance.ViewManager.ShowModal(checkInSummary);
                        }

                        if (!checkInSummary.Cancelled)
                        {
                            CommitMerge(checkInSummary);
                        }
                    }
                    else
                    {
                        SimpleLogger.Checkpoint("PerformMerge: Check-in automatically cancelled");
                        checkInSummary.Cancelled = false;
                        CommitMerge(checkInSummary, externalProgress);
                    }
                    returnValue = !hadConflicts;
                }
                else
                {
                    SimpleLogger.Checkpoint("PerformMerge: Not finished");
                }
            }
            finally
            {
                if (undoPendingChanges)
                {
                    SimpleLogger.Checkpoint("PerformMerge: Undoing pending changes");
                    tempWorkspace.UndoAllPendingChanges();
                }
                else
                {
                    SimpleLogger.Checkpoint("PerformMerge: NOT undoing pending changes");
                }
            }
            SimpleLogger.Checkpoint("PerformMerge: Returning");
            return(returnValue);
        }