From 22d13c4b349f6d27f1a54a370f82a9d4422d2a4d Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 27 Sep 2015 22:31:20 -0700 Subject: [PATCH] Fixed some small usage issues - Simplify waiting for changes - Fixed project dependencies --- src/Microsoft.Dnx.Watcher.Core/DnxWatcher.cs | 37 ++++++++----------- .../Impl/ProcessWatcher.cs | 32 +++++----------- .../Impl/Project.cs | 10 ++++- 3 files changed, 34 insertions(+), 45 deletions(-) diff --git a/src/Microsoft.Dnx.Watcher.Core/DnxWatcher.cs b/src/Microsoft.Dnx.Watcher.Core/DnxWatcher.cs index b71de61d59..3044b4e06c 100644 --- a/src/Microsoft.Dnx.Watcher.Core/DnxWatcher.cs +++ b/src/Microsoft.Dnx.Watcher.Core/DnxWatcher.cs @@ -182,41 +182,36 @@ namespace Microsoft.Dnx.Watcher.Core foreach (var projFile in project.ProjectDependencies) { - //var fullProjectFilePath = Path.Combine(Path.GetDirectoryName(project.ProjectFile), projFile); - AddProjectAndDependeciesToWatcher(projFile, fileWatcher); } } - private Task WatchForFileChangeAsync(IFileWatcher fileWatcher, CancellationToken cancellationToken) + private async Task WatchForFileChangeAsync(IFileWatcher fileWatcher, CancellationToken cancellationToken) { - return Task.Run(() => + var tcs = new TaskCompletionSource(); + + cancellationToken.Register(() => tcs.TrySetResult(null)); + + Action callback = path => { - using (var fileChangeEvent = new ManualResetEvent(false)) - { - string changedFile = null; + tcs.TrySetResult(path); + }; - fileWatcher.OnChanged += path => - { - changedFile = path; - fileChangeEvent.Set(); - }; + fileWatcher.OnChanged += callback; - while (!cancellationToken.IsCancellationRequested && - !fileChangeEvent.WaitOne(500)) - { - } + var changedPath = await tcs.Task; - return changedFile; - } - }); + // Don't need to listen anymore + fileWatcher.OnChanged -= callback; + + return changedPath; } public static DnxWatcher CreateDefault(ILoggerFactory loggerFactory) { return new DnxWatcher( - fileWatcherFactory: root => { return new FileWatcher(root); }, - processWatcherFactory: () => { return new ProcessWatcher(); }, + fileWatcherFactory: root => new FileWatcher(root), + processWatcherFactory: () => new ProcessWatcher(), projectProvider: new ProjectProvider(), loggerFactory: loggerFactory); } diff --git a/src/Microsoft.Dnx.Watcher.Core/Impl/ProcessWatcher.cs b/src/Microsoft.Dnx.Watcher.Core/Impl/ProcessWatcher.cs index 86b3cc13d7..153979d659 100644 --- a/src/Microsoft.Dnx.Watcher.Core/Impl/ProcessWatcher.cs +++ b/src/Microsoft.Dnx.Watcher.Core/Impl/ProcessWatcher.cs @@ -37,33 +37,19 @@ namespace Microsoft.Dnx.Watcher.Core return _runningProcess.Id; } - public async Task WaitForExitAsync(CancellationToken cancellationToken) + public Task WaitForExitAsync(CancellationToken cancellationToken) { - try + cancellationToken.Register(() => _runningProcess?.Kill()); + + return Task.Run(() => { - await Task.Run(() => - { - while (!cancellationToken.IsCancellationRequested) - { - if (_runningProcess.WaitForExit(500)) - { - break; - } - } + _runningProcess.WaitForExit(); - if (!_runningProcess.HasExited) - { - _runningProcess.Kill(); - } - - }); - - return _runningProcess.ExitCode; - } - finally - { + var exitCode = _runningProcess.ExitCode; _runningProcess = null; - } + + return exitCode; + }); } private static void RemoveCompilationPortEnvironmentVariable(ProcessStartInfo procStartInfo) diff --git a/src/Microsoft.Dnx.Watcher.Core/Impl/Project.cs b/src/Microsoft.Dnx.Watcher.Core/Impl/Project.cs index 8df5bd2ec8..a863154ce2 100644 --- a/src/Microsoft.Dnx.Watcher.Core/Impl/Project.cs +++ b/src/Microsoft.Dnx.Watcher.Core/Impl/Project.cs @@ -14,6 +14,7 @@ namespace Microsoft.Dnx.Watcher.Core public Project(Runtime.Project runtimeProject) { ProjectFile = runtimeProject.ProjectFilePath; + ProjectDirectory = runtimeProject.ProjectDirectory; Files = runtimeProject.Files.SourceFiles.Concat( runtimeProject.Files.ResourceFiles.Values.Concat( @@ -28,7 +29,7 @@ namespace Microsoft.Dnx.Watcher.Core if (File.Exists(projectLockJsonPath)) { var lockFile = lockFileReader.Read(projectLockJsonPath); - ProjectDependencies = lockFile.ProjectLibraries.Select(dep => dep.Path).ToList(); + ProjectDependencies = lockFile.ProjectLibraries.Select(dep => GetProjectRelativeFullPath(dep.Path)).ToList(); } else { @@ -41,5 +42,12 @@ namespace Microsoft.Dnx.Watcher.Core public IEnumerable Files { get; private set; } public string ProjectFile { get; private set; } + + public string ProjectDirectory { get; private set; } + + private string GetProjectRelativeFullPath(string path) + { + return Path.GetFullPath(Path.Combine(ProjectDirectory, path)); + } } }