diff --git a/src/Files.App/Utils/Git/GitHelpers.cs b/src/Files.App/Utils/Git/GitHelpers.cs index 59d6b4589e60..340e9395f89c 100644 --- a/src/Files.App/Utils/Git/GitHelpers.cs +++ b/src/Files.App/Utils/Git/GitHelpers.cs @@ -333,7 +333,7 @@ public static bool ValidateBranchNameForRepository(string branchName, string rep branch.FriendlyName.Equals(branchName, StringComparison.OrdinalIgnoreCase)); } - public static async void FetchOrigin(string? repositoryPath) + public static async void FetchOrigin(string? repositoryPath, CancellationToken cancellationToken = default) { if (string.IsNullOrWhiteSpace(repositoryPath)) return; @@ -359,11 +359,15 @@ public static async void FetchOrigin(string? repositoryPath) await DoGitOperationAsync(() => { + cancellationToken.ThrowIfCancellationRequested(); + var result = GitOperationResult.Success; try { foreach (var remote in repository.Network.Remotes) { + cancellationToken.ThrowIfCancellationRequested(); + LibGit2Sharp.Commands.Fetch( repository, remote.Name, @@ -371,6 +375,8 @@ await DoGitOperationAsync(() => _fetchOptions, "git fetch updated a ref"); } + + cancellationToken.ThrowIfCancellationRequested(); } catch (Exception ex) { @@ -384,6 +390,10 @@ await DoGitOperationAsync(() => MainWindow.Instance.DispatcherQueue.TryEnqueue(() => { + if (cancellationToken.IsCancellationRequested) + // Do nothing because the operation was cancelled and another fetch may be in progress + return; + IsExecutingGitAction = false; GitFetchCompleted?.Invoke(null, EventArgs.Empty); }); diff --git a/src/Files.App/Views/Shells/BaseShellPage.cs b/src/Files.App/Views/Shells/BaseShellPage.cs index 78429f89c3d0..a63a8447c1a0 100644 --- a/src/Files.App/Views/Shells/BaseShellPage.cs +++ b/src/Files.App/Views/Shells/BaseShellPage.cs @@ -238,16 +238,17 @@ protected async void FilesystemViewModel_DirectoryInfoUpdated(object sender, Eve ? headBranch.Name : string.Empty; + var isGitFetchCanceled = false; if (!_gitFetch.IsCompleted) { _gitFetchToken.Cancel(); - await _gitFetch; - _gitFetchToken.TryReset(); + _gitFetchToken = new CancellationTokenSource(); + isGitFetchCanceled = true; } - if (InstanceViewModel.IsGitRepository && !GitHelpers.IsExecutingGitAction) + if (InstanceViewModel.IsGitRepository && (!GitHelpers.IsExecutingGitAction || isGitFetchCanceled)) { _gitFetch = Task.Run( - () => GitHelpers.FetchOrigin(InstanceViewModel.GitRepositoryPath), + () => GitHelpers.FetchOrigin(InstanceViewModel.GitRepositoryPath, _gitFetchToken.Token), _gitFetchToken.Token); } }