Skip to content

Commit

Permalink
fixup! PerformRefreshRevisions: Cancel and restart reload
Browse files Browse the repository at this point in the history
Review comments + exception safety
  • Loading branch information
mstv committed Nov 13, 2023
1 parent bf53552 commit 3878b77
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 37 deletions.
54 changes: 30 additions & 24 deletions GitUI/CommandsDialogs/FormBrowse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1645,39 +1645,45 @@ private void SetGitModule(object sender, GitModuleEventArgs e)
if (Module.IsValidGitWorkingDir())
{
RevisionGrid.SuspendRefreshRevisions();
string path = Module.WorkingDir;
ThreadHelper.JoinableTaskFactory.Run(() => RepositoryHistoryManager.Locals.AddAsMostRecentAsync(path));
AppSettings.RecentWorkingDir = path;
try
{
string path = Module.WorkingDir;
ThreadHelper.JoinableTaskFactory.Run(() => RepositoryHistoryManager.Locals.AddAsMostRecentAsync(path));
AppSettings.RecentWorkingDir = path;

HideDashboard();
HideDashboard();

if (!string.Equals(originalWorkingDir, Module.WorkingDir, StringComparison.Ordinal))
{
ChangeTerminalActiveFolder(Module.WorkingDir);
if (!string.Equals(originalWorkingDir, Module.WorkingDir, StringComparison.Ordinal))
{
ChangeTerminalActiveFolder(Module.WorkingDir);

#if DEBUG
// Current encodings
Debug.WriteLine($"Encodings for {Module.WorkingDir}");
Debug.WriteLine($"Files content encoding: {Module.FilesEncoding.EncodingName}");
Debug.WriteLine($"Commit encoding: {Module.CommitEncoding.EncodingName}");
if (Module.LogOutputEncoding.CodePage != Module.CommitEncoding.CodePage)
{
Debug.WriteLine($"Log output encoding: {Module.LogOutputEncoding.EncodingName}");
}
// Current encodings
Debug.WriteLine($"Encodings for {Module.WorkingDir}");
Debug.WriteLine($"Files content encoding: {Module.FilesEncoding.EncodingName}");
Debug.WriteLine($"Commit encoding: {Module.CommitEncoding.EncodingName}");
if (Module.LogOutputEncoding.CodePage != Module.CommitEncoding.CodePage)
{
Debug.WriteLine($"Log output encoding: {Module.LogOutputEncoding.EncodingName}");
}
#endif

// Reset the filter when switching repos
// Reset the filter when switching repos

// If we're applying custom branch or revision filters - reset them
RevisionGrid.ResetAllFilters();
ToolStripFilters.ClearQuickFilters();
revisionDiff.RepositoryChanged();
}
// If we're applying custom branch or revision filters - reset them
RevisionGrid.ResetAllFilters();
ToolStripFilters.ClearQuickFilters();
revisionDiff.RepositoryChanged();
}

RevisionInfo.SetRevisionWithChildren(revision: null, children: Array.Empty<ObjectId>());
RevisionGrid.ResumeRefreshRevisions();
RevisionInfo.SetRevisionWithChildren(revision: null, children: Array.Empty<ObjectId>());
}
finally
{
RevisionGrid.ResumeRefreshRevisions();

RefreshRevisions();
RefreshRevisions();
}
}
else
{
Expand Down
19 changes: 6 additions & 13 deletions GitUI/UserControls/RevisionGrid/RevisionGridControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ public sealed partial class RevisionGridControl : GitModuleControl, ICheckRefs,
/// </summary>
private Lazy<IReadOnlyCollection<string>>? _ambiguousRefs;

private int _updatingFilters;
private int _suspendRefreshCounter;

private IDisposable? _revisionSubscription;
private GitRevision? _baseCommitToCompare;
Expand Down Expand Up @@ -471,15 +471,15 @@ public void DisableContextMenu()
/// Prevents revisions refreshes and stops <see cref="PerformRefreshRevisions"/> from executing
/// until <see cref="ResumeRefreshRevisions"/> is called.
/// </summary>
internal void SuspendRefreshRevisions() => _updatingFilters++;
internal void SuspendRefreshRevisions() => ++_suspendRefreshCounter;

/// <summary>
/// Resume revisions refreshes.
/// </summary>
internal void ResumeRefreshRevisions()
{
--_updatingFilters;
DebugHelpers.Assert(_updatingFilters >= 0, $"{nameof(ResumeRefreshRevisions)} was called without matching {nameof(SuspendRefreshRevisions)}!");
--_suspendRefreshCounter;
DebugHelpers.Assert(_suspendRefreshCounter >= 0, $"{nameof(ResumeRefreshRevisions)} was called without matching {nameof(SuspendRefreshRevisions)}!");
}

public void SetAndApplyBranchFilter(string filter)
Expand Down Expand Up @@ -855,7 +855,7 @@ private void ShowLoading(bool showSpinner = true)
/// i.e. it is not in a middle of reconfiguration process guarded by <see cref="SuspendRefreshRevisions"/>
/// and <see cref="ResumeRefreshRevisions"/>.
/// </summary>
private bool CanRefresh => _updatingFilters == 0;
private bool CanRefresh => _suspendRefreshCounter == 0;

#region PerformRefreshRevisions

Expand All @@ -864,8 +864,7 @@ private void ShowLoading(bool showSpinner = true)
/// </summary>
/// <exception cref="Exception"></exception>
/// <param name="forceRefreshRefs">Refresh may be required as references may be changed.</param>
/// <param name="skipIfAlreadyRefreshing">If true and grid is already / yet being refreshed, do not cancel and restart.</param>
public void PerformRefreshRevisions(Func<RefsFilter, IReadOnlyList<IGitRef>> getRefs = null, bool forceRefreshRefs = false, bool skipIfAlreadyRefreshing = false)
public void PerformRefreshRevisions(Func<RefsFilter, IReadOnlyList<IGitRef>> getRefs = null, bool forceRefreshRefs = false)
{
ThreadHelper.AssertOnUIThread();

Expand All @@ -877,12 +876,6 @@ public void PerformRefreshRevisions(Func<RefsFilter, IReadOnlyList<IGitRef>> get

if (_isRefreshingRevisions)
{
if (skipIfAlreadyRefreshing)
{
Trace.WriteLine("Ignoring refresh as RefreshRevisions() is already running.");
return;
}

Trace.WriteLine("Forcing refresh, cancel already running RefreshRevisions().");
if (!_gridView.IsDataLoadComplete)
{
Expand Down

0 comments on commit 3878b77

Please sign in to comment.