Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorLluis Sanchez <lluis@xamarin.com>2019-09-18 01:55:06 +0300
committerGitHub <noreply@github.com>2019-09-18 01:55:06 +0300
commit8cd3d4fb791c91d328669a8ed691f8de6328888d (patch)
tree4113d3825e600726e5f5ceb428f0f9f0551b7e65 /main
parentbaba2fc9a7ff402b8193c42696d1ecb38fcfd7e6 (diff)
parent40717533657e3ec7cecf70865ad2b7cc0b0afe37 (diff)
Merge pull request #8749 from mono/vcs-task-freeze
[Git] Fix FileService discarding events due to imbalanced freeze/thaw
Diffstat (limited to 'main')
-rw-r--r--main/src/addins/VersionControl/MonoDevelop.VersionControl.Git/MonoDevelop.VersionControl.Git/GitRepository.cs179
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/MonoDevelopWorkspace.cs2
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);
}