diff options
author | Lluis Sanchez <lluis@xamarin.com> | 2019-09-18 01:55:06 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-18 01:55:06 +0300 |
commit | 8cd3d4fb791c91d328669a8ed691f8de6328888d (patch) | |
tree | 4113d3825e600726e5f5ceb428f0f9f0551b7e65 /main | |
parent | baba2fc9a7ff402b8193c42696d1ecb38fcfd7e6 (diff) | |
parent | 40717533657e3ec7cecf70865ad2b7cc0b0afe37 (diff) |
Merge pull request #8749 from mono/vcs-task-freeze
[Git] Fix FileService discarding events due to imbalanced freeze/thaw
Diffstat (limited to 'main')
2 files changed, 84 insertions, 97 deletions
diff --git a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs index 2e7873b506..03f340c0c1 100644 --- a/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs +++ b/main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs @@ -167,22 +167,23 @@ namespace MonoDevelop.VersionControl.Git const string cherryPickHead = "CHERRY_PICK_HEAD"; const string revertHead = "REVERT_HEAD"; - static bool ShouldLock (string fullPath) - { - var fileName = Path.GetFileName (fullPath); - return fileName == rebaseApply || fileName == rebaseMerge || fileName == cherryPickHead || fileName == revertHead; - } + static bool ShouldLock (string fileName) + => fileName.EndsWith (".lock", FilePath.PathComparison) + || fileName == rebaseApply + || fileName == rebaseMerge + || fileName == cherryPickHead + || fileName == revertHead; void HandleGitLockCreated (object sender, FileSystemEventArgs e) { - if (e.FullPath.EndsWith (".lock", StringComparison.Ordinal) || ShouldLock (e.FullPath)) + if (ShouldLock (e.Name)) OnGitLocked (e.FullPath); } void HandleGitLockRenamed (object sender, RenamedEventArgs e) { - if (e.OldName.EndsWith (".lock", StringComparison.Ordinal) || ShouldLock (e.OldName)) { - if (!e.Name.EndsWith (".lock", StringComparison.Ordinal)) { + if (ShouldLock (e.OldName)) { + if (!ShouldLock (e.Name)) { OnGitUnlocked (e.OldFullPath); } else { lock (lockedPathes) { @@ -197,7 +198,7 @@ namespace MonoDevelop.VersionControl.Git void HandleGitLockDeleted (object sender, FileSystemEventArgs e) { - if (e.FullPath.EndsWith (".lock", StringComparison.Ordinal) || ShouldLock (e.FullPath)) + if (ShouldLock (e.Name)) OnGitUnlocked (e.FullPath); } @@ -213,7 +214,7 @@ namespace MonoDevelop.VersionControl.Git void OnGitLocked (string path) { lock (lockedPathes) { - if (lockedPathes.Add (path) && lockedPathes.Count == 1 && gitLock.IsSet) { + if (File.Exists (path) && lockedPathes.Add (path) && lockedPathes.Count == 1 && gitLock.IsSet) { gitLock.Reset (); FileService.FreezeEvents (); } @@ -224,6 +225,8 @@ namespace MonoDevelop.VersionControl.Git { lock (lockedPathes) { lockedPathes.Remove (file); + lockedPathes.RemoveWhere (path => !File.Exists (path)); + if (!gitLock.IsSet && lockedPathes.Count == 0) { gitLock.Set (); ThawEvents (); @@ -588,17 +591,6 @@ namespace MonoDevelop.VersionControl.Git get { return Thread.CurrentThread == GitScheduler.DedicatedThread; } } - internal void RunOperation (FilePath localPath, Action<LibGit2Sharp.Repository> action, bool hasUICallbacks = false) - { - EnsureInitialized (); - if (hasUICallbacks) - EnsureBackgroundThread (); - if (IsGitThread) - action (GetRepository (localPath)); - else - DedicatedOperationFactory.StartNew (() => action (GetRepository (localPath))).RunWaitAndCapture (); - } - internal void RunOperation (Action action, bool hasUICallbacks = false) { EnsureInitialized (); @@ -656,115 +648,110 @@ namespace MonoDevelop.VersionControl.Git return DedicatedOperationFactory.StartNew (() => action (GetRepository (localPath)), cancellationToken); } - internal void RunBlockingOperation (Action action, bool hasUICallbacks = false, CancellationToken cancellationToken = default) - { - if (hasUICallbacks) - EnsureBackgroundThread (); - if (!WaitAndFreezeEvents (cancellationToken)) - return; - try { - if (IsGitThread) - action (); - else - DedicatedOperationFactory.StartNew (action).RunWaitAndCapture (); - } finally { - ThawEvents (); - } - } - internal T RunBlockingOperation<T> (Func<T> action, bool hasUICallbacks = false, CancellationToken cancellationToken = default) { EnsureInitialized (); if (hasUICallbacks) EnsureBackgroundThread (); - if (!WaitAndFreezeEvents (cancellationToken)) - return default; - try { - if (IsGitThread) + + if (IsGitThread) { + return RunBlockingOperationInternal (action, cancellationToken); + } + + return DedicatedOperationFactory.StartNew (() => RunBlockingOperationInternal (action, cancellationToken)) + .RunWaitAndCapture (); + + T RunBlockingOperationInternal (Func<T> action, CancellationToken cancellationToken) + { + if (!WaitAndFreezeEvents (cancellationToken)) + return default; + + try { return action (); - return DedicatedOperationFactory.StartNew (action).RunWaitAndCapture (); - } finally { - ThawEvents (); + } finally { + ThawEvents (); + } } } internal Task RunBlockingOperationAsync (Action action, CancellationToken cancellationToken = default) { EnsureInitialized (); - try { - if (IsGitThread) { - if (!WaitAndFreezeEvents (cancellationToken)) - return Task.FromCanceled (cancellationToken); - action (); + if (IsGitThread) { + try { + RunBlockingOperationInternal (action, cancellationToken); return Task.CompletedTask; + } catch (OperationCanceledException) { + return Task.FromCanceled (cancellationToken); } - return DedicatedOperationFactory.StartNew (() => { - if (!WaitAndFreezeEvents (cancellationToken)) - return; + } + + return DedicatedOperationFactory.StartNew (() => RunBlockingOperationInternal (action, cancellationToken)); + + void RunBlockingOperationInternal (Action action, CancellationToken cancellationToken) + { + if (!WaitAndFreezeEvents (cancellationToken)) + cancellationToken.ThrowIfCancellationRequested (); + + try { action (); - }, cancellationToken); - } finally { - ThawEvents (); + } finally { + ThawEvents (); + } } } internal Task RunBlockingOperationAsync (FilePath localPath, Action<LibGit2Sharp.Repository> action, CancellationToken cancellationToken = default) { EnsureInitialized (); - try { - if (IsGitThread) { - if (!WaitAndFreezeEvents (cancellationToken)) - return Task.FromCanceled (cancellationToken); - action (GetRepository (localPath)); + if (IsGitThread) { + try { + RunBlockingOperationInternal (localPath, action, cancellationToken); return Task.CompletedTask; + } catch (OperationCanceledException) { + return Task.FromCanceled (cancellationToken); } - return DedicatedOperationFactory.StartNew (() => { - if (!WaitAndFreezeEvents (cancellationToken)) - return; + } + + return DedicatedOperationFactory.StartNew (() => RunBlockingOperationInternal (localPath, action, cancellationToken)); + + void RunBlockingOperationInternal (FilePath localPath, Action<LibGit2Sharp.Repository> action, CancellationToken cancellationToken) + { + if (!WaitAndFreezeEvents (cancellationToken)) + cancellationToken.ThrowIfCancellationRequested (); + + try { action (GetRepository (localPath)); - }); - } finally { - ThawEvents (); + } finally { + ThawEvents (); + } } } internal Task<T> RunBlockingOperationAsync<T> (Func<T> action, CancellationToken cancellationToken = default) { EnsureInitialized (); - if (!WaitAndFreezeEvents (cancellationToken)) - return default; - try { - if (IsGitThread) { - if (!WaitAndFreezeEvents (cancellationToken)) - return Task.FromCanceled<T> (cancellationToken); - return Task.FromResult (action ()); + + if (IsGitThread) { + try { + return Task.FromResult (RunBlockingOperationInternal (action, cancellationToken)); + } catch (OperationCanceledException) { + return Task.FromCanceled<T> (cancellationToken); } - return DedicatedOperationFactory.StartNew (() => { - if (!WaitAndFreezeEvents (cancellationToken)) - return default; - return action (); - }); - } finally { - ThawEvents (); } - } - internal Task<T> RunBlockingOperationAsync<T> (FilePath localPath, Func<LibGit2Sharp.Repository, T> action, CancellationToken cancellationToken = default) - { - EnsureInitialized (); - try { - if (IsGitThread) { - if (!WaitAndFreezeEvents (cancellationToken)) - return Task.FromCanceled<T> (cancellationToken); - return Task.FromResult (action (GetRepository (localPath))); + return DedicatedOperationFactory.StartNew<T> (() => action (), cancellationToken); + + T RunBlockingOperationInternal (Func<T> action, CancellationToken cancellationToken) + { + if (!WaitAndFreezeEvents (cancellationToken)) + cancellationToken.ThrowIfCancellationRequested (); + + try { + return action (); + } finally { + ThawEvents (); } - return DedicatedOperationFactory.StartNew (() => { - if (!WaitAndFreezeEvents (cancellationToken)) - return default; - return action (GetRepository (localPath)); - }); - } finally { - ThawEvents (); } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs index 0431faae5e..3ff7e145f4 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs @@ -1511,7 +1511,7 @@ namespace MonoDevelop.Ide.TypeSystem ProjectInfo newProjectContents = t.Result; newProjectContents = AddVirtualDocuments (newProjectContents); OnProjectReloaded (newProjectContents); - foreach (var docId in GetOpenDocumentIds (newProjectContents.Id)) { + foreach (var docId in GetOpenDocumentIds (newProjectContents.Id).ToArray ()) { if (CurrentSolution.GetDocument (docId) == null) { ClearOpenDocument (docId); } |