private IEnumerable <FileInfo> GetInventory( FileInfo file, Func <IEnumerable <FileInfo> > beforeAction, Action action) { var inventory = Enumerable.Empty <FileInfo>(); IEnumerable <FileInfo> preInventory; if (beforeAction == null) { preInventory = new List <FileInfo>(); } else { preInventory = beforeAction(); } ExclusiveFolderAccess.Do(_dataDirectory, (folder) => { file.Refresh(); if (file.Exists) { inventory = folder.LoadInventory(file); } else { action(); inventory = GetFileList().Where(i => !preInventory.Select(p => p.FullName).Contains(i.FullName)); folder.SaveInventory(file, inventory); } }); return(inventory); }
private void ThrowIfAssetSourcesHaveChanged() { if (!_dataDirectory.Exists) { return; } var dataDirectoryFiles = _dataDirectory.GetFiles("*", SearchOption.AllDirectories); if (!dataDirectoryFiles.Any()) { return; } IEnumerable <FileInfo> trackedFiles = null; ExclusiveFolderAccess.Do(_dataDirectory, (folder) => { trackedFiles = _inventoryFiles.AllInventoryFiles.SelectMany(f => folder.LoadInventory(f)); }); var assetFiles = GetFileList(); var untrackedFiles = assetFiles.Where(a => !trackedFiles.Any(t => t.FullName.Equals(a.FullName))); if (untrackedFiles.Any()) { var message = $"TestAsset {_assetName} has untracked files. " + "Consider cleaning the asset and deleting its `.tam` directory to " + "recreate tracking files.\n\n" + $".tam directory: {_dataDirectory.FullName}\n" + "Untracked Files: \n"; message += String.Join("\n", untrackedFiles.Select(f => $" - {f.FullName}\n")); throw new Exception(message); } var earliestDataDirectoryTimestamp = dataDirectoryFiles .OrderBy(f => f.LastWriteTime) .First() .LastWriteTime; if (earliestDataDirectoryTimestamp == null) { return; } var updatedSourceFiles = ExclusiveFolderAccess.Read(_inventoryFiles.Source) .Where(f => f.LastWriteTime > earliestDataDirectoryTimestamp); if (updatedSourceFiles.Any()) { var message = $"TestAsset {_assetName} has updated files. " + "Consider cleaning the asset and deleting its `.tam` directory to " + "recreate tracking files.\n\n" + $".tam directory: {_dataDirectory.FullName}\n" + "Updated Files: \n"; message += String.Join("\n", updatedSourceFiles.Select(f => $" - {f.FullName}\n")); throw new GracefulException(message); } }