public void Apply() { if (!_directoryFullPath.StartsWithIgnoreCase(_rootDirectory)) { return; } Queue <string> directories = new Queue <string>(); directories.Enqueue(_directoryFullPath); while (directories.Count > 0) { var directoryPath = directories.Dequeue(); var directory = _fileSystem.GetDirectoryInfo(directoryPath); var relativeDirectoryPath = PathHelper.MakeRelative(_rootDirectory, directoryPath); if (!directory.Exists) { continue; } // We don't want to add root directory if (!string.IsNullOrEmpty(relativeDirectoryPath)) { relativeDirectoryPath = PathHelper.EnsureTrailingSlash(relativeDirectoryPath); // We don't add symlinks if (directory.Attributes.HasFlag(FileAttributes.ReparsePoint)) { continue; } if (!_fileSystemFilter.IsDirectoryAllowed(relativeDirectoryPath, directory.Attributes)) { continue; } _entries.AddDirectory(relativeDirectoryPath); } foreach (var entry in directory.EnumerateFileSystemInfos()) { if (entry is IDirectoryInfo) { directories.Enqueue(entry.FullName); } else { var relativeFilePath = PathHelper.MakeRelative(_rootDirectory, entry.FullName); if (_fileSystemFilter.IsFileAllowed(relativeFilePath, entry.Attributes)) { _entries.AddFile(relativeFilePath); } } } } }
public MsBuildFileSystemWatcherEntriesTest() { _entries = new MsBuildFileSystemWatcherEntries(); /* Basic relative path structure ├─[A] │ ├─[A] │ │ ├─[A] │ │ │ ├─a.x │ │ │ └─a.y │ │ ├─[B] │ │ │ ├─a.x │ │ │ └─a.y │ │ ├─c.x │ │ └─c.y │ ├─[B] │ │ ├─[A] │ │ ├─b.x │ │ └─b.y │ │ │ ├─c.x │ └─c.y ├─[B] │ ├─[A] │ │ ├─[A] │ │ │ ├─a.x │ │ │ └─a.y │ │ ├─[B] │ │ │ ├─a.x │ │ │ └─a.y │ │ ├─c.x │ │ └─c.y │ └─[B] │ ├─[A] │ ├─b.x │ └─b.y ├─.x └─.y */ _entries.AddDirectory(@"A", @"A"); _entries.AddDirectory(@"A\A", @"A\A"); _entries.AddDirectory(@"A\A\A", @"A\A\A"); _entries.AddDirectory(@"A\A\B", @"A\A\B"); _entries.AddDirectory(@"A\B", @"A\B"); _entries.AddDirectory(@"A\B\A", @"A\B\A"); _entries.AddDirectory(@"B", @"B"); _entries.AddDirectory(@"B\A", @"B\A"); _entries.AddDirectory(@"B\A\A", @"B\A\A"); _entries.AddDirectory(@"B\A\B", @"B\A\B"); _entries.AddDirectory(@"B\B", @"B\B"); _entries.AddDirectory(@"B\B\A", @"B\B\A"); _entries.AddFile(@"A\A\A\a.x", @"A\A\A\a.x"); _entries.AddFile(@"A\A\A\a.y", @"A\A\A\a.y"); _entries.AddFile(@"A\A\B\a.x", @"A\A\B\a.x"); _entries.AddFile(@"A\A\B\a.y", @"A\A\B\a.y"); _entries.AddFile(@"A\A\c.x", @"A\A\c.x"); _entries.AddFile(@"A\A\c.y", @"A\A\c.y"); _entries.AddFile(@"A\B\b.x", @"A\B\b.x"); _entries.AddFile(@"A\B\b.y", @"A\B\b.y"); _entries.AddFile(@"A\c.x", @"A\c.x"); _entries.AddFile(@"A\c.y", @"A\c.y"); _entries.AddFile(@"B\A\A\a.x", @"B\A\A\a.x"); _entries.AddFile(@"B\A\A\a.y", @"B\A\A\a.y"); _entries.AddFile(@"B\A\B\a.x", @"B\A\B\a.x"); _entries.AddFile(@"B\A\B\a.y", @"B\A\B\a.y"); _entries.AddFile(@"B\A\c.x", @"B\A\c.x"); _entries.AddFile(@"B\A\c.y", @"B\A\c.y"); _entries.AddFile(@"B\B\b.x", @"B\B\b.x"); _entries.AddFile(@"B\B\b.y", @"B\B\b.y"); _entries.AddFile(@".x", @".x"); _entries.AddFile(@".y", @".y"); _entries.ProduceChangeset(); }