diff --git a/GitUI/CommandsDialogs/FormBrowse.cs b/GitUI/CommandsDialogs/FormBrowse.cs index f5572f6c5d8..345de67b6fe 100644 --- a/GitUI/CommandsDialogs/FormBrowse.cs +++ b/GitUI/CommandsDialogs/FormBrowse.cs @@ -311,14 +311,11 @@ public FormBrowse(GitUICommands commands, BrowseArguments args) _aheadBehindDataProvider = new AheadBehindDataProvider(() => Module.GitExecutable); toolStripButtonPush.Initialize(_aheadBehindDataProvider); repoObjectsTree.Initialize(_aheadBehindDataProvider, branchFilterAction: ToolStripFilters.SetBranchFilter, RevisionGrid, RevisionGrid, RevisionGrid); - revisionDiff.Bind(RevisionGrid, fileTree, RequestRefresh); - fileTree.Bind(RevisionGrid, RequestRefresh); - - // We're launching the main form, and whilst the module has been set for us we still need to formally switch to it - SetGitModule(this, new GitModuleEventArgs(new GitModule(Module.WorkingDir))); - + revisionDiff.Bind(RevisionGrid, fileTree, RefreshGitStatusMonitor); + fileTree.Bind(RevisionGrid, RefreshGitStatusMonitor); RevisionGrid.ResumeRefreshRevisions(); + // Application is init, the repo related operations are triggered in OnLoad() return; void InitCountArtificial(out GitStatusMonitor gitStatusMonitor) @@ -442,20 +439,20 @@ protected override void OnApplicationActivated() base.OnApplicationActivated(); } - // Contains app init logics ONLY. All repo-specific logic must be placed UICommands.PostRepositoryChanged handler. protected override void OnLoad(EventArgs e) { _formBrowseMenus.CreateToolbarsMenus(ToolStripMain, ToolStripFilters, ToolStripScripts); - HideVariableMainMenuItems(); RefreshSplitViewLayout(); LayoutRevisionInfo(); SetSplitterPositions(); - InternalInitialize(false); base.OnLoad(e); _formBrowseDiagnosticsReporter.Report(); + + // All app init is done, make all repo related similar to switching repos (like triggering RefreshRevisions()) + SetGitModule(this, new GitModuleEventArgs(new GitModule(Module.WorkingDir))); } protected override void OnActivated(EventArgs e) @@ -572,22 +569,28 @@ private void RefreshRevisions() return; } - _gitStatusMonitor.InvalidateGitWorkingDirectoryStatus(); - RequestRefresh(); - - if (_dashboard is null || !_dashboard.Visible) + bool isDashboard = string.IsNullOrEmpty(Module.WorkingDir) || (_dashboard?.Visible ?? false); + if (isDashboard) { - revisionDiff.RefreshArtificial(); - RevisionGrid.ForceRefreshRevisions(); - RevisionGrid.IndexWatcher.Reset(); + // Explicit call: Title is normally updated on RevisionGrid filter change + _appTitleGenerator.Generate(); + + // "Repo" related methods, creates _dashboard + InternalInitialize(); - InternalInitialize(true); + return; } - toolStripButtonPush.DisplayAheadBehindInformation(Module.GetSelectedBranch()); + Debug.Assert(RevisionGrid.CanRefresh, "Already loading revisions when running RefreshRevisions(). This could cause the commits in the grid to be loaded several times."); + RevisionGrid.PerformRefreshRevisions(); + + InternalInitialize(); + + RefreshGitStatusMonitor(); + revisionDiff.RefreshArtificial(); } - private void RequestRefresh() => _gitStatusMonitor?.RequestRefresh(); + private void RefreshGitStatusMonitor() => _gitStatusMonitor?.RequestRefresh(); private void RefreshSelection() { @@ -658,7 +661,7 @@ private void ShowDashboard() private void HideDashboard() { MainSplitContainer.Visible = true; - if (_dashboard is null || !_dashboard.Visible) + if (!_dashboard?.Visible ?? true) { return; } @@ -714,6 +717,7 @@ private void RegisterPlugins() { if (plugin.Execute(new GitUIEventArgs(this, UICommands))) { + _gitStatusMonitor.InvalidateGitWorkingDirectoryStatus(); RefreshRevisions(); } }; @@ -772,7 +776,7 @@ private void HideVariableMainMenuItems() mainMenuStrip.Refresh(); } - private void InternalInitialize(bool hard) + private void InternalInitialize() { toolPanel.SuspendLayout(); toolPanel.TopToolStripPanel.SuspendLayout(); @@ -798,7 +802,7 @@ private void InternalInitialize(bool hard) } bool bareRepository = Module.IsBareRepository(); - bool isDashboard = _dashboard is not null && _dashboard.Visible; + bool isDashboard = _dashboard?.Visible ?? false; bool validBrowseDir = !isDashboard && Module.IsValidGitWorkingDir(); branchSelect.Text = validBrowseDir ? Module.GetSelectedBranch() : ""; @@ -834,7 +838,8 @@ private void InternalInitialize(bool hard) _createPullRequestsToolStripMenuItem.Enabled = validBrowseDir; _viewPullRequestsToolStripMenuItem.Enabled = validBrowseDir; - if (repositoryToolStripMenuItem.Visible) + // repositoryToolStripMenuItem.Visible + if (validBrowseDir) { manageSubmodulesToolStripMenuItem.Enabled = !bareRepository; updateAllSubmodulesToolStripMenuItem.Enabled = !bareRepository; @@ -844,7 +849,8 @@ private void InternalInitialize(bool hard) editmailmapToolStripMenuItem.Enabled = !bareRepository; } - if (commandsToolStripMenuItem.Visible) + // commandsToolStripMenuItem.Visible + if (validBrowseDir) { commitToolStripMenuItem.Enabled = !bareRepository; mergeToolStripMenuItem.Enabled = !bareRepository; @@ -863,7 +869,7 @@ private void InternalInitialize(bool hard) SetShortcutKeyDisplayStringsFromHotkeySettings(); - if (hard && hasWorkingDir) + if (hasWorkingDir) { ShowRevisions(); } @@ -885,7 +891,7 @@ private void InternalInitialize(bool hard) _formBrowseMenus.InsertRevisionGridMainMenuItems(repositoryToolStripMenuItem); - toolStripButtonPush.DisplayAheadBehindInformation(Module.GetSelectedBranch()); + toolStripButtonPush.DisplayAheadBehindInformation(branchSelect.Text); ActiveControl = RevisionGrid; RevisionGrid.IndexWatcher.Reset(); @@ -1309,7 +1315,7 @@ private void StashToolStripMenuItemClick(object sender, EventArgs e) private void ResetToolStripMenuItem_Click(object sender, EventArgs e) { UICommands.StartResetChangesDialog(this); - RequestRefresh(); + RefreshGitStatusMonitor(); revisionDiff.RefreshArtificial(); } @@ -1773,6 +1779,7 @@ private void SetGitModule(object sender, GitModuleEventArgs e) UICommands = new GitUICommands(module); if (Module.IsValidGitWorkingDir()) { + RevisionGrid.SuspendRefreshRevisions(); var path = Module.WorkingDir; ThreadHelper.JoinableTaskFactory.Run(() => RepositoryHistoryManager.Locals.AddAsMostRecentAsync(path)); AppSettings.RecentWorkingDir = path; @@ -1803,8 +1810,9 @@ private void SetGitModule(object sender, GitModuleEventArgs e) } RevisionInfo.SetRevisionWithChildren(revision: null, children: Array.Empty()); + RevisionGrid.ResumeRefreshRevisions(); - // This will raise UICommands.PostRepositoryChanged event + // This will raise UICommands.PostRepositoryChanged -> RefreshRevisions() UICommands.RepoChangedNotifier.Notify(); } else @@ -2993,7 +3001,7 @@ private void undoLastCommitToolStripMenuItem_Click(object sender, EventArgs e) var args = GitCommandHelpers.ResetCmd(ResetMode.Soft, "HEAD~1"); Module.GitExecutable.GetOutput(args); refreshToolStripMenuItem.PerformClick(); - RequestRefresh(); + RefreshGitStatusMonitor(); } } diff --git a/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs b/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs index c280c8e953a..b46283d076f 100644 --- a/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs +++ b/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs @@ -385,7 +385,7 @@ public void DisableFilters() public void DisableRevisionFilter() { _filterInfo.DisableFilters(); - ForceRefreshRevisions(); + PerformRefreshRevisions(); } public void SetAndApplyPathFilter(string filter) @@ -393,7 +393,7 @@ public void SetAndApplyPathFilter(string filter) _filterInfo.ByPathFilter = !string.IsNullOrWhiteSpace(filter); _filterInfo.PathFilter = filter; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } private void InitiateRefAction(IReadOnlyList? refs, Action action, FormQuickGitRefSelector.Action actionLabel) @@ -465,23 +465,18 @@ public void DisableContextMenu() } /// - /// Prevents revisions refreshes and stops from executing + /// Prevents revisions refreshes and stops from executing /// until is called. /// internal void SuspendRefreshRevisions() => _updatingFilters++; /// - /// Resume revisions refreshes and invokes . + /// Resume revisions refreshes. /// internal void ResumeRefreshRevisions() { --_updatingFilters; Debug.Assert(_updatingFilters >= 0, $"{nameof(ResumeRefreshRevisions)} was called without matching {nameof(SuspendRefreshRevisions)}!"); - - if (_updatingFilters == 0) - { - ForceRefreshRevisions(); - } } public void SetAndApplyBranchFilter(string filter) @@ -497,7 +492,7 @@ public void SetAndApplyBranchFilter(string filter) _filterInfo.ByBranchFilter = !string.IsNullOrWhiteSpace(newFilter); _filterInfo.BranchFilter = newFilter; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } /// @@ -513,7 +508,7 @@ public void SetAndApplyRevisionFilter(RevisionFilter filter) return; } - ForceRefreshRevisions(); + PerformRefreshRevisions(); } public override void Refresh() @@ -559,7 +554,7 @@ public new void Load() ReloadHotkeys(); } - ForceRefreshRevisions(); + PerformRefreshRevisions(); LoadCustomDifftools(); } @@ -800,11 +795,14 @@ public GitRevision GetActualRevision(GitRevision revision) return revision; } + /// + /// Refreshes the revision grid, if there are any changes reported by . + /// public void RefreshRevisions() { if (IndexWatcher.IndexChanged) { - ForceRefreshRevisions(); + PerformRefreshRevisions(); } } @@ -831,11 +829,22 @@ private void ShowLoading(bool sync = true) _loadingControlAsync.BringToFront(); } - public void ForceRefreshRevisions() + /// + /// Indicates whether the revision grid can be refreshed, i.e. it is not currently being refreshed + /// or it is not in a middle of reconfiguration process guarded by + /// and . + /// + public bool CanRefresh => !_isRefreshingRevisions && _updatingFilters == 0; + + /// + /// Queries git for the new set of revisions and refreshes the grid. + /// + /// + public void PerformRefreshRevisions() { ThreadHelper.AssertOnUIThread(); - if (_isRefreshingRevisions || _updatingFilters != 0) + if (!CanRefresh) { return; } @@ -1629,7 +1638,7 @@ public void ShowCurrentBranchOnly() _filterInfo.ShowCurrentBranchOnly = true; _filterInfo.ShowReflogReferences = false; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } public void ShowAllBranches() @@ -1642,7 +1651,7 @@ public void ShowAllBranches() _filterInfo.ByBranchFilter = false; _filterInfo.ShowCurrentBranchOnly = false; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } public void ShowFilteredBranches() @@ -1656,7 +1665,7 @@ public void ShowFilteredBranches() _filterInfo.ShowCurrentBranchOnly = false; _filterInfo.ShowReflogReferences = false; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } public void ShowRevisionFilterDialog() @@ -1664,7 +1673,7 @@ public void ShowRevisionFilterDialog() using FormRevisionFilter form = new(UICommands, _filterInfo); if (form.ShowDialog(ParentForm) == DialogResult.OK) { - ForceRefreshRevisions(); + PerformRefreshRevisions(); } } @@ -2027,43 +2036,43 @@ internal void ToggleShowRemoteBranches() internal void ToggleShowArtificialCommits() { AppSettings.RevisionGraphShowArtificialCommits = !AppSettings.RevisionGraphShowArtificialCommits; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } internal void ToggleAuthorDateSort() { AppSettings.SortByAuthorDate = !AppSettings.SortByAuthorDate; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } public void ToggleShowReflogReferences() { _filterInfo.ShowReflogReferences = !_filterInfo.ShowReflogReferences; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } internal void ToggleShowLatestStash() { AppSettings.ShowLatestStash = !AppSettings.ShowLatestStash; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } internal void ToggleShowSuperprojectTags() { AppSettings.ShowSuperprojectTags = !AppSettings.ShowSuperprojectTags; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } internal void ShowSuperprojectBranches_ToolStripMenuItemClick() { AppSettings.ShowSuperprojectBranches = !AppSettings.ShowSuperprojectBranches; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } internal void ShowSuperprojectRemoteBranches_ToolStripMenuItemClick() { AppSettings.ShowSuperprojectRemoteBranches = !AppSettings.ShowSuperprojectRemoteBranches; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } private void RevertCommitToolStripMenuItemClick(object sender, EventArgs e) @@ -2191,7 +2200,7 @@ private void StopBisectToolStripMenuItemClick(object sender, EventArgs e) internal void ToggleShowGitNotes() { AppSettings.ShowGitNotes = !AppSettings.ShowGitNotes; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } internal void ToggleShowMergeCommits() @@ -2206,7 +2215,7 @@ internal void ToggleShowMergeCommits() AppSettings.ShowRevisionGridGraphColumn = !AppSettings.ShowRevisionGridGraphColumn; } - ForceRefreshRevisions(); + PerformRefreshRevisions(); } internal void ToggleShowCommitBodyInRevisionGrid() @@ -2219,7 +2228,7 @@ internal void ToggleShowCommitBodyInRevisionGrid() public void ToggleShowFirstParent() { _filterInfo.ShowFirstParent = !_filterInfo.ShowFirstParent; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } internal void ToggleBetweenArtificialAndHeadCommits() @@ -2268,7 +2277,7 @@ internal void ToggleRevisionGraphColumn() if (!AppSettings.ShowMergeCommits && AppSettings.ShowRevisionGridGraphColumn) { AppSettings.ShowMergeCommits = true; - ForceRefreshRevisions(); + PerformRefreshRevisions(); } else {