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