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 Oct 19, 2023
1 parent f6486e8 commit e414384
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 38 deletions.
56 changes: 31 additions & 25 deletions GitUI/CommandsDialogs/FormBrowse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1659,40 +1659,46 @@ 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();
AppSettings.BranchFilterEnabled = AppSettings.BranchFilterEnabled;
revisionDiff.RepositoryChanged();
}
// If we're applying custom branch or revision filters - reset them
RevisionGrid.ResetAllFilters();
ToolStripFilters.ClearQuickFilters();
AppSettings.BranchFilterEnabled = AppSettings.BranchFilterEnabled;
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 @@ -113,7 +113,7 @@ public sealed partial class RevisionGridControl : GitModuleControl, IScriptHostC
/// </summary>
private Lazy<IReadOnlyCollection<string>>? _ambiguousRefs;

private int _updatingFilters;
private int _suspendRefreshCounter;

private IDisposable? _revisionSubscription;
private GitRevision? _baseCommitToCompare;
Expand Down Expand Up @@ -472,15 +472,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 @@ -856,7 +856,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 @@ -865,8 +865,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 @@ -878,12 +877,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 e414384

Please sign in to comment.