コード例 #1
0
        public PrepareMergeViewModel(TfsItemCache tfsItemCache, IEnumerable <ITfsWorkItem> workItems)
            : base(typeof(PrepareMergeViewModel))
        {
            try
            {
                TfsItemCache = tfsItemCache;

                MergeSourcesLoading  = new LoadingProgressViewModel();
                MergeTargetsLoading  = new LoadingProgressViewModel();
                ChangesetsLoading    = new LoadingProgressViewModel();
                ChangesetsRefreshing = new LoadingProgressViewModel();

                OpenChangesetCommand         = new RelayCommand((o) => OpenChangeset((int)o));
                FindOriginalChangesetCommand = new RelayCommand((o) => FindOriginalChangeset((int)o));
                PerformMergeCommand          = new RelayCommand((o) => PerformMerge(o as ChangesetListElement), (o) => o != null);
                PickPathFilterCommand        = new RelayCommand((o) => PickPathFilter());
                AutoMergeCommand             = new RelayCommand((o) => AutoMerge(), (o) => IsAnythingToMergeLeft());
                OKCommand = new RelayCommand((o) => OK());

                var  potentialMergeSourceBranches = Enumerable.Empty <ITfsBranch>();
                bool finished = Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
                    (progressParams) =>
                {
                    Changesets = new List <ITfsChangeset>();
                    progressParams.TrackProgress.MaxProgress = workItems.Count();
                    foreach (var workItem in workItems)
                    {
                        progressParams.CancellationToken.ThrowIfCancellationRequested();
                        foreach (var changeset in workItem.RelatedChangesets)
                        {
                            progressParams.CancellationToken.ThrowIfCancellationRequested();
                            Changesets.Add(changeset);
                            potentialMergeSourceBranches = potentialMergeSourceBranches.Union(changeset.GetAffectedBranchesForActiveProject());
                        }
                        progressParams.TrackProgress.Increment();
                    }
                    Changesets = Changesets
                                 .GroupBy(changeset => changeset.Changeset.ChangesetId)
                                 .Select(group => group.First())
                                 .OrderBy(changeset => changeset.Changeset.ChangesetId).ToList();
                });
                if (!finished)
                {
                    throw new OperationCanceledException();
                }
                if (!potentialMergeSourceBranches.Any())
                {
                    throw new ArgumentException();
                }

                PossibleMergeSources = potentialMergeSourceBranches.ToList();
                ListenToSettingsChanges();
            } catch (Exception ex)
            {
                SimpleLogger.Log(ex, true, true);
                throw;
            }
        }
コード例 #2
0
 protected override void Refresh()
 {
     base.Refresh();
     ItemsLoading.IsLoading    = true;
     ItemsLoading.ProgressInfo = "Reloading projects, branches and changesets ... please wait";
     ResetWorkItems();
     SetContent(new ObservableCollection <TfsWorkItemWrapper>());
     TfsItemCache.Clear();
     Repository.Instance.TfsBridgeProvider.Refresh();
 }
コード例 #3
0
        private void LoadChangesetList(bool refresh = false)
        {
            if (_changesetLoadingTaskActive)
            {
                if (!refresh)
                {
                    return;
                }
            }

            _changesetLoadingTaskActive = true;
            Repository.Instance.BackgroundTaskManager.Start(
                Constants.Tasks.LoadChangesetListKey,
                refresh ? ChangesetsRefreshing : ChangesetsLoading,
                (task) =>
            {
                var results = new List <ChangesetListElement>();
                task.TrackProgress.ProgressInfo = "Loading changesets ...";
                lock (_changesetLock)
                {
                    int count = 0;
                    foreach (var changeset in _changesets)
                    {
                        task.TrackProgress.ProgressInfo = string.Format("Loading changesets ({0} done) ...", ++count);
                        var source = FindChangeset(changeset, MergeSource);
                        var target = FindChangeset(changeset, MergeTarget);

                        var changesetListElement =
                            new ChangesetListElement()
                        {
                            Changeset   = TfsItemCache.UpdateChangesetFromCache(new TfsChangesetWrapper(changeset)),
                            CanBeMerged = (target == null),

                            SourceExists      = (source != null),
                            SourceCheckinDate = (source != null) ? source.Changeset.CreationDate : DateTime.MinValue,
                            SourceCheckinId   = (source != null) ? source.Changeset.ChangesetId : 0,

                            TargetExists      = (target != null),
                            TargetCheckinDate = (target != null) ? new DateTime?(target.Changeset.CreationDate) : null,
                            TargetCheckinId   = (target != null) ? target.Changeset.ChangesetId : 0
                        };
                        DetermineWarningStatus(changesetListElement);
                        results.Add(changesetListElement);
                    }
                }
                Repository.Instance.BackgroundTaskManager.Post(
                    () =>
                {
                    _changesetLoadingTaskActive = false;
                    _changesetList = results;
                    RaisePropertyChanged("ChangesetList");
                    return(true);
                });
            });
        }
コード例 #4
0
        private void HighlightChangesets(TfsWorkItemWrapper sender)
        {
            _workItemHighlightUpdatePending = false;

            if (!Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
                    (trackProgressParameters) => TfsItemCache.HighlightChangesets(trackProgressParameters),
                    "Please wait while the changeset view is being updated ..."))
            {
                sender.IsSelected = false;
            }
        }
コード例 #5
0
        private void LoadChangesets(ITfsBranch sourceBranch, ITfsBranch targetBranch, string sourcePathFilter, BackgroundTask task)
        {
            task.TrackProgress.ProgressInfo = "Loading merge candidates ...";
            var changesets = new ObservableCollection <TfsChangesetWrapper>(TfsItemCache.QueryChangesets(sourceBranch, targetBranch, sourcePathFilter));

            Repository.Instance.BackgroundTaskManager.Post(
                () =>
            {
                if (!task.Cancelled.IsCancellationRequested)
                {
                    SetContent(changesets);
                }
                return(true);
            });
        }
コード例 #6
0
        public ChangesetViewModel(TfsItemCache tfsItemCache)
            : base("Changeset", typeof(ChangesetViewModel))
        {
            Repository.Instance.VMergeUIProvider.MergeWindowVisibilityChanged += (o, a) => Enabled = !Repository.Instance.VMergeUIProvider.IsMergeWindowVisible();
            Enabled                    = !Repository.Instance.VMergeUIProvider.IsMergeWindowVisible();
            _applyFilterTimer          = new DispatcherTimer();
            _applyFilterTimer.Interval = new TimeSpan(0, 0, 0, 0, 350);
            _applyFilterTimer.Tick    += (o, a) => PerformApplyFilter();

            TfsItemCache = tfsItemCache;

            ViewSelectionViewModel     = new ViewSelectionViewModel();
            Changesets                 = new ObservableCollection <TfsChangesetWrapper>();
            FilteredChangesets         = new ObservableCollection <TfsChangesetWrapper>();
            _changesetsToResetOnCancel = new List <Tuple <TfsChangesetWrapper, bool> >();
            ChangesetList              =
                new FieldMapperGridViewModel <TfsChangesetWrapper>(
                    new ChangesetPropertyAccessor(),
                    FilteredChangesets,
                    Columns);
            ChangesetList.ColumnSettingsChanged += (o, a) => DataWasModified();

            ViewSelectionViewModel.ViewSelectionChanged += OnViewSelectionChanged;

            ItemSelectedCommand      = new RelayCommand((o) => ItemSelected(o), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);
            ShowWorkItemViewCommand  = new RelayCommand((o) => ShowWorkItemView(), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);
            SelectMarkedItemsCommand = new RelayCommand((o) => SelectMarkedItems(), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);
            ViewChangesetCommand     = new RelayCommand((o) => ViewChangeset(o), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);
            TrackChangesetCommand    = new RelayCommand((o) => TrackChangeset(o), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);
            MergeCommand             = new RelayCommand((o) => Merge(o), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);
            ShowMergeViewCommand     = new RelayCommand((o) => ShowMergeView(), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);
            SelectAllCommand         = new RelayCommand((o) => SelectAll(), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);
            SaveMergeProfileCommand  = new RelayCommand((o) => SaveMergeProfile(), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);
            RefreshCommand           = new RelayCommand((o) => Refresh(), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);
            ShowLogFileWindowCommand = new RelayCommand((o) => ShowLogFileWindow(o), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);

            AttachToChangesetCache();
            AttachToProfileProvider();
            Repository.Instance.TfsBridgeProvider.ActiveProjectSelected += (o, a) =>
            {
                Changesets.Clear();
                FilteredChangesets.Clear();
                if (Repository.Instance.TfsBridgeProvider.ActiveTeamProject != null)
                {
                    Repository.Instance.BackgroundTaskManager.DelayedPost(() => { ProfileProvider_DefaultProfileChanged(null, null); return(true); });
                }
            };
        }
コード例 #7
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);
            }
        }
コード例 #8
0
        public WorkItemViewModel(TfsItemCache tfsItemCache)
            : base("Work Item", typeof(WorkItemViewModel))
        {
            try
            {
                Repository.Instance.VMergeUIProvider.MergeWindowVisibilityChanged += (o, a) => Enabled = !Repository.Instance.VMergeUIProvider.IsMergeWindowVisible();
                Enabled      = !Repository.Instance.VMergeUIProvider.IsMergeWindowVisible();
                TfsItemCache = tfsItemCache;

                ViewSelectionViewModel = new ViewSelectionViewModel();
                WorkItems    = new ObservableCollection <TfsWorkItemWrapper>();
                WorkItemList =
                    new FieldMapperGridViewModel <TfsWorkItemWrapper>(
                        new WorkItemPropertyAccessor(),
                        WorkItems,
                        Columns);
                WorkItemList.ColumnSettingsChanged += (o, a) => DataWasModified();

                ItemSelectedCommand      = new RelayCommand((o) => ItemSelected(o));
                ShowChangesetViewCommand = new RelayCommand((o) => ShowChangesetView());
                SelectMarkedItemsCommand = new RelayCommand((o) => SelectMarkedItems());
                ViewWorkItemCommand      = new RelayCommand((o) => ViewWorkItem(o));
                TrackWorkItemCommand     = new RelayCommand((o) => TrackWorkItem(o));
                MergeCommand             = new RelayCommand((o) => Merge(o));
                ShowMergeViewCommand     = new RelayCommand((o) => ShowMergeView());
                RefreshCommand           = new RelayCommand((o) => Refresh(), (o) => Repository.Instance.TfsBridgeProvider.TfsTeamProjectCollection != null);

                ViewSelectionViewModel.ViewSelectionChanged += OnViewSelectionChanged;

                AttachToWorkItemCache();
                AttachToProfileProvider();
                Repository.Instance.TfsBridgeProvider.ActiveProjectSelected += (o, a) =>
                {
                    WorkItems.Clear();
                    if (Repository.Instance.TfsBridgeProvider.ActiveTeamProject != null)
                    {
                        Repository.Instance.BackgroundTaskManager.DelayedPost(() => { ProfileProvider_DefaultProfileChanged(null, null); return(true); });
                    }
                };
            } catch (Exception ex)
            {
                SimpleLogger.Log(ex, false, false);
                throw;
            }
        }
コード例 #9
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.";
                }
            }
        }
コード例 #10
0
        public PrepareMergeViewModel(TfsItemCache tfsItemCache, IEnumerable <ITfsChangeset> changesets)
            : base(typeof(PrepareMergeViewModel))
        {
            TfsItemCache = tfsItemCache;
            Changesets   = changesets.Where(changeset => changeset.Changeset.CreationDate >= (DateTime.Now - new TimeSpan(30, 0, 0, 0))).ToList();

            MergeSourcesLoading  = new LoadingProgressViewModel();
            MergeTargetsLoading  = new LoadingProgressViewModel();
            ChangesetsLoading    = new LoadingProgressViewModel();
            ChangesetsRefreshing = new LoadingProgressViewModel();

            OpenChangesetCommand  = new RelayCommand((o) => OpenChangeset((int)o));
            PerformMergeCommand   = new RelayCommand((o) => PerformMerge(o as ChangesetListElement));
            PickPathFilterCommand = new RelayCommand((o) => PickPathFilter());
            AutoMergeCommand      = new RelayCommand((o) => AutoMerge(), (o) => IsAnythingToMergeLeft());
            OKCommand             = new RelayCommand((o) => OK());

            var  potentialMergeSourceBranches = Enumerable.Empty <ITfsBranch>();
            bool finished = Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
                (progressParams) =>
            {
                WorkItems = new List <ITfsWorkItem>();
                progressParams.TrackProgress.MaxProgress = Changesets.Count();
                foreach (var changeset in Changesets)
                {
                    progressParams.CancellationToken.ThrowIfCancellationRequested();
                    foreach (var workItem in changeset.RelatedWorkItems)
                    {
                        progressParams.CancellationToken.ThrowIfCancellationRequested();
                        WorkItems.Add(workItem);
                    }
                    potentialMergeSourceBranches = potentialMergeSourceBranches.Union(changeset.GetAffectedBranchesForActiveProject());
                    progressParams.TrackProgress.Increment();
                }
            });

            if (!finished)
            {
                throw new OperationCanceledException();
            }

            _potentialMergeSourceBranches = potentialMergeSourceBranches.ToList();
        }
コード例 #11
0
        private void FindMergesForChangesetAndBranch(List <MergedChangesetLink> results, ITfsChangeset changeset, ITfsBranch rootBranch)
        {
            var merges
                = changeset.FindMergesForActiveProject(rootBranch, _potentialMergeSourceBranches)
                  .Select(
                      item => new MergedChangesetLink()
            {
                Source = TfsItemCache.UpdateChangesetFromCache(new TfsChangesetWrapper(item.Source)),
                Target = TfsItemCache.UpdateChangesetFromCache(new TfsChangesetWrapper(item.Target))
            });

            results.Add(
                new MergedChangesetLink()
            {
                Source = null,
                Target = TfsItemCache.UpdateChangesetFromCache(new TfsChangesetWrapper(changeset))
            });
            results.AddRange(merges);
        }
コード例 #12
0
 protected override void Refresh()
 {
     try
     {
         SimpleLogger.Log(SimpleLogLevel.Info, "Reload called (Changeset)");
         base.Refresh();
         ItemsLoading.IsLoading    = true;
         ItemsLoading.ProgressInfo = "Reloading projects, branches and changesets ... please wait";
         ResetChangesets();
         SetContent(new ObservableCollection <TfsChangesetWrapper>());
         SimpleLogger.Log(SimpleLogLevel.Info, "Reload clear list (Changeset)");
         TfsItemCache.Clear();
         SimpleLogger.Log(SimpleLogLevel.Info, "Reload call TFS Bridge (Changeset)");
         Repository.Instance.TfsBridgeProvider.Refresh();
         SimpleLogger.Log(SimpleLogLevel.Info, "Reload finished (Changeset)");
     } catch (Exception ex)
     {
         SimpleLogger.Log(ex, true, false);
     }
 }
コード例 #13
0
        public PrepareMergeViewModel(TfsItemCache tfsItemCache, IEnumerable <ITfsChangeset> changesets)
            : base(typeof(PrepareMergeViewModel))
        {
            TfsItemCache = tfsItemCache;
            Changesets   = changesets.OrderBy(changeset => changeset.Changeset.ChangesetId).ToList();

            MergeSourcesLoading  = new LoadingProgressViewModel();
            MergeTargetsLoading  = new LoadingProgressViewModel();
            ChangesetsLoading    = new LoadingProgressViewModel();
            ChangesetsRefreshing = new LoadingProgressViewModel();

            OpenChangesetCommand         = new RelayCommand((o) => OpenChangeset((int)o));
            FindOriginalChangesetCommand = new RelayCommand((o) => FindOriginalChangeset((int)o));
            PerformMergeCommand          = new RelayCommand((o) => PerformMerge(o as ChangesetListElement));
            PickPathFilterCommand        = new RelayCommand((o) => PickPathFilter());
            AutoMergeCommand             = new RelayCommand((o) => AutoMerge(), (o) => IsAnythingToMergeLeft());
            OKCommand = new RelayCommand((o) => OK());


            var  potentialMergeSourceBranches = Enumerable.Empty <ITfsBranch>();
            bool finished = Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
                (progressParams) =>
            {
                progressParams.TrackProgress.MaxProgress = Changesets.Count();
                foreach (var changeset in Changesets)
                {
                    progressParams.CancellationToken.ThrowIfCancellationRequested();
                    var list = changeset.GetAffectedBranchesForActiveProject().ToArray();
                    potentialMergeSourceBranches = potentialMergeSourceBranches.Union(list);
                    progressParams.TrackProgress.Increment();
                }
            });

            if (!finished)
            {
                throw new OperationCanceledException();
            }

            PossibleMergeSources = potentialMergeSourceBranches.ToList();
            ListenToSettingsChanges();
        }
コード例 #14
0
        private void LoadWorkItems(ITfsBranch sourceBranch, ITfsBranch targetBranch, string pathFilter, BackgroundTask task)
        {
            task.TrackProgress.ProgressInfo = "Loading merge candidates ...";
            var changesets = new List <TfsChangesetWrapper>(TfsItemCache.QueryChangesets(sourceBranch, targetBranch, pathFilter));

            task.TrackProgress.ProgressInfo = "Loading work items ...";
            task.TrackProgress.MaxProgress  = changesets.Count;
            var workItems
                = new ObservableCollection <TfsWorkItemWrapper>(
                      TfsItemCache.QueryWorkItems(changesets, task.TrackProgress, task.Cancelled.Token));

            Repository.Instance.BackgroundTaskManager.Post(
                () =>
            {
                if (!task.Cancelled.IsCancellationRequested)
                {
                    SetContent(workItems);
                }
                return(true);
            });
        }
コード例 #15
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;
            }
        }
コード例 #16
0
        private void LoadChangesets(ITfsQuery query, BackgroundTask task)
        {
            task.TrackProgress.ProgressInfo = "Loading work items ...";
            var workItems = new List <TfsWorkItemWrapper>(
                TfsItemCache.QueryWorkItems(query));

            task.TrackProgress.ProgressInfo = "Loading changesets ...";
            task.TrackProgress.MaxProgress  = workItems.Count;
            var changesets
                = new ObservableCollection <TfsChangesetWrapper>(
                      TfsItemCache.QueryChangesets(workItems, task.TrackProgress, task.Cancelled.Token));

            Repository.Instance.BackgroundTaskManager.Post(
                () =>
            {
                if (!task.Cancelled.IsCancellationRequested)
                {
                    SetContent(changesets);
                }
                return(true);
            });
        }
コード例 #17
0
        private void LoadWorkItems(ITfsQuery query, BackgroundTask task)
        {
            task.TrackProgress.ProgressInfo = "Loading work items ...";
            var workItems = new ObservableCollection <TfsWorkItemWrapper>(
                TfsItemCache.QueryWorkItems(query));

            Repository.Instance.BackgroundTaskManager.Post(
                () =>
            {
                try
                {
                    if (!task.Cancelled.IsCancellationRequested)
                    {
                        SetContent(workItems);
                    }
                }
                catch (Exception)
                {
                    return(true);
                }
                return(true);
            });
        }
コード例 #18
0
 private void HighlightWorkItems()
 {
     _changesetHighlightUpdatePending = false;
     if (!Repository.Instance.BackgroundTaskManager.RunWithCancelDialog(
             (trackProgressParameters) =>
     {
         TfsItemCache.HighlightWorkItems(trackProgressParameters);
     }))
     {
         SuppressNotifications();
         try
         {
             foreach (var item in _changesetsToResetOnCancel)
             {
                 item.Item1.IsSelected = item.Item2;
             }
         }
         finally
         {
             AllowNotifications();
         }
     }
     _changesetsToResetOnCancel.Clear();
 }
コード例 #19
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);
        }
コード例 #20
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;
            }
        }
コード例 #21
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);
        }