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