ignore disk events for files we save
This commit is contained in:
@@ -57,7 +57,7 @@ public class IdeFileManager
|
|||||||
if (file.IsDirty.Value is false) return;
|
if (file.IsDirty.Value is false) return;
|
||||||
|
|
||||||
var text = await GetFileTextAsync(file);
|
var text = await GetFileTextAsync(file);
|
||||||
await File.WriteAllTextAsync(file.Path, text);
|
await WriteAllText(file, text);
|
||||||
file.IsDirty.Value = false;
|
file.IsDirty.Value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,10 +70,23 @@ public class IdeFileManager
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await File.WriteAllTextAsync(file.Path, newText);
|
await WriteAllText(file, newText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static async Task WriteAllText(SharpIdeFile file, string text)
|
||||||
|
{
|
||||||
|
file.SuppressDiskChangeEvents.Value = true;
|
||||||
|
await File.WriteAllTextAsync(file.Path, text);
|
||||||
|
Console.WriteLine($"Saved file {file.Path}");
|
||||||
|
_ = Task.Delay(300).ContinueWith(_ =>
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Re-enabling disk change events for {file.Path}");
|
||||||
|
file.SuppressDiskChangeEvents.Value = false;
|
||||||
|
Console.WriteLine($"Value is now {file.SuppressDiskChangeEvents.Value}");
|
||||||
|
}, CancellationToken.None, TaskContinuationOptions.RunContinuationsAsynchronously, TaskScheduler.Default);
|
||||||
|
}
|
||||||
|
|
||||||
public async Task SaveAllOpenFilesAsync()
|
public async Task SaveAllOpenFilesAsync()
|
||||||
{
|
{
|
||||||
foreach (var file in _openFiles.Keys.ToList())
|
foreach (var file in _openFiles.Keys.ToList())
|
||||||
|
|||||||
@@ -11,11 +11,12 @@ public class IdeFileChangeHandler
|
|||||||
GlobalEvents.Instance.FileSystemWatcherInternal.FileChanged.Subscribe(OnFileChanged);
|
GlobalEvents.Instance.FileSystemWatcherInternal.FileChanged.Subscribe(OnFileChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task OnFileChanged(string arg)
|
private async Task OnFileChanged(string filePath)
|
||||||
{
|
{
|
||||||
var sharpIdeFile = SolutionModel.AllFiles.SingleOrDefault(f => f.Path == arg);
|
var sharpIdeFile = SolutionModel.AllFiles.SingleOrDefault(f => f.Path == filePath);
|
||||||
if (sharpIdeFile is null) return;
|
if (sharpIdeFile is null) return;
|
||||||
// TODO: Suppress if SharpIDE changed the file
|
if (sharpIdeFile.SuppressDiskChangeEvents.Value is true) return;
|
||||||
|
Console.WriteLine($"IdeFileChangeHandler: Changed - {filePath}");
|
||||||
await sharpIdeFile.FileContentsChangedExternallyFromDisk.InvokeParallelAsync();
|
await sharpIdeFile.FileContentsChangedExternallyFromDisk.InvokeParallelAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,8 +82,8 @@ public sealed class IdeFileWatcher : IDisposable
|
|||||||
// TODO: Make a note to users that they should not use files without extensions
|
// TODO: Make a note to users that they should not use files without extensions
|
||||||
private void HandleChanged(string fullPath)
|
private void HandleChanged(string fullPath)
|
||||||
{
|
{
|
||||||
if (Path.HasExtension(fullPath) is false) return;
|
if (Path.HasExtension(fullPath) is false) return; // we don't care about directory changes
|
||||||
Console.WriteLine($"FileSystemWatcher: Changed - {fullPath}");
|
//Console.WriteLine($"FileSystemWatcher: Changed - {fullPath}");
|
||||||
GlobalEvents.Instance.FileSystemWatcherInternal.FileChanged.InvokeParallelFireAndForget(fullPath);
|
GlobalEvents.Instance.FileSystemWatcherInternal.FileChanged.InvokeParallelFireAndForget(fullPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ public class SharpIdeFile : ISharpIdeNode, IChildSharpIdeNode
|
|||||||
public bool IsCshtmlFile => Path.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase);
|
public bool IsCshtmlFile => Path.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase);
|
||||||
public bool IsCsharpFile => Path.EndsWith(".cs", StringComparison.OrdinalIgnoreCase);
|
public bool IsCsharpFile => Path.EndsWith(".cs", StringComparison.OrdinalIgnoreCase);
|
||||||
public bool IsRoslynWorkspaceFile => IsCsharpFile || IsRazorFile || IsCshtmlFile;
|
public bool IsRoslynWorkspaceFile => IsCsharpFile || IsRazorFile || IsCshtmlFile;
|
||||||
public required ReactiveProperty<bool> IsDirty { get; set; }
|
public required ReactiveProperty<bool> IsDirty { get; init; }
|
||||||
|
public required ReactiveProperty<bool> SuppressDiskChangeEvents { get; init; }
|
||||||
public EventWrapper<Task> FileContentsChangedExternallyFromDisk { get; } = new(() => Task.CompletedTask);
|
public EventWrapper<Task> FileContentsChangedExternallyFromDisk { get; } = new(() => Task.CompletedTask);
|
||||||
public EventWrapper<Task> FileContentsChangedExternally { get; } = new(() => Task.CompletedTask);
|
public EventWrapper<Task> FileContentsChangedExternally { get; } = new(() => Task.CompletedTask);
|
||||||
|
|
||||||
@@ -26,6 +27,7 @@ public class SharpIdeFile : ISharpIdeNode, IChildSharpIdeNode
|
|||||||
Name = name;
|
Name = name;
|
||||||
Parent = parent;
|
Parent = parent;
|
||||||
IsDirty = new ReactiveProperty<bool>(false);
|
IsDirty = new ReactiveProperty<bool>(false);
|
||||||
|
SuppressDiskChangeEvents = new ReactiveProperty<bool>(false);
|
||||||
allFiles.Add(this);
|
allFiles.Add(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user