Skip to content

Commit

Permalink
File watcher now catches all changes
Browse files Browse the repository at this point in the history
  • Loading branch information
madskristensen committed Feb 24, 2016
1 parent eee64e5 commit a50153c
Showing 1 changed file with 33 additions and 18 deletions.
51 changes: 33 additions & 18 deletions src/BrowserLink/ReloadExtension.cs
Expand Up @@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Threading;
using EnvDTE;
using Microsoft.VisualStudio.Web.BrowserLink;

Expand All @@ -13,25 +13,29 @@ public class ReloadExtension : BrowserLinkExtension, IDisposable
IEnumerable<string> _extensions = VSPackage.Options.FileExtensions.Split(';');
IEnumerable<string> _ignorePatterns = VSPackage.Options.GetIgnorePatterns();
List<BrowserLinkConnection> _connections = new List<BrowserLinkConnection>();

bool _isDisposed;
Project _project;
Timer _timer;
FileSystemWatcher _watcher;
int _state;

public ReloadExtension(Project project)
{
_project = project;
string folder = project.Properties.Item("FullPath").Value?.ToString();

Watcher = new FileSystemWatcher(folder);
Watcher.Changed += FileChanged;
Watcher.IncludeSubdirectories = true;
Watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.Size;
Watcher.EnableRaisingEvents = VSPackage.Options.EnableReload;
_watcher = new FileSystemWatcher(folder);
_watcher.Changed += FileChanged;
_watcher.IncludeSubdirectories = true;
_watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.Size;
_watcher.EnableRaisingEvents = VSPackage.Options.EnableReload;

_timer = new Timer(TimerElapsed, null, 0, VSPackage.Options.Delay);

VSPackage.Options.Saved += OptionsSaved;
}

public FileSystemWatcher Watcher { get; }

public override void OnConnected(BrowserLinkConnection connection)
{
if (connection.Project == _project)
Expand All @@ -48,9 +52,8 @@ public override void OnDisconnecting(BrowserLinkConnection connection)
base.OnDisconnecting(connection);
}

public void Reload(string extension)
public void Reload()
{
Telemetry.TrackEvent("Saved ." + extension);
Browsers.Clients(_connections.ToArray()).Invoke("reload");
}

Expand All @@ -59,12 +62,14 @@ public void Dispose()
if (!_isDisposed)
{
VSPackage.Options.Saved -= OptionsSaved;
Watcher.Dispose();
_watcher.Dispose();
_timer.Dispose();

_isDisposed = true;
}
}

async void FileChanged(object sender, FileSystemEventArgs e)
void FileChanged(object sender, FileSystemEventArgs e)
{
if (e.ChangeType != WatcherChangeTypes.Changed)
return;
Expand All @@ -78,21 +83,31 @@ async void FileChanged(object sender, FileSystemEventArgs e)
if (ext == "css" && !_project.Kind.Equals("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}", StringComparison.OrdinalIgnoreCase))
return;

var watcher = (FileSystemWatcher)sender;
watcher.EnableRaisingEvents = false;
Interlocked.Exchange(ref _state, 2);
Telemetry.TrackEvent("Saved ." + ext);
}
}

await Task.Delay(VSPackage.Options.Delay);
Reload(ext);
void TimerElapsed(object state)
{
//Move from changed + refresh pending to just refresh pending
if (Interlocked.CompareExchange(ref _state, 1, 2) == 2)
{
return;
}

watcher.EnableRaisingEvents = true;
//Move from refresh pending without a recent change to no refresh pending
if (Interlocked.CompareExchange(ref _state, 0, 1) == 1)
{
Reload();
}
}

void OptionsSaved(object sender, EventArgs e)
{
_extensions = VSPackage.Options.FileExtensions.Split(';');
_ignorePatterns = VSPackage.Options.GetIgnorePatterns();
Watcher.EnableRaisingEvents = VSPackage.Options.EnableReload;
_watcher.EnableRaisingEvents = VSPackage.Options.EnableReload;
Telemetry.TrackEvent("Updated settings");
}
}
Expand Down

0 comments on commit a50153c

Please sign in to comment.