public bool TryCreateHash(ExecuteScriptCommandOptions options, out string hash) { if (options.NoCache) { _logger.Debug($"The script {options.File.Path} was executed with the '--no-cache' flag. Skipping cache."); hash = null; return(false); } var scriptFilesProvider = new ScriptFilesResolver(); var allScriptFiles = scriptFilesProvider.GetScriptFiles(options.File.Path); var projectFile = new ScriptProjectProvider(_logFactory).CreateProjectFileFromScriptFiles(ScriptEnvironment.Default.TargetFramework, allScriptFiles.ToArray()); if (!projectFile.IsCacheable) { _logger.Warning($"The script {options.File.Path} is not cacheable. For caching and optimal performance, ensure that the script only contains NuGet references with pinned/exact versions."); hash = null; return(false); } IncrementalHash incrementalHash = IncrementalHash.CreateHash(HashAlgorithmName.SHA256); foreach (var scriptFile in allScriptFiles) { incrementalHash.AppendData(File.ReadAllBytes(scriptFile)); } var configuration = options.OptimizationLevel.ToString(); incrementalHash.AppendData(Encoding.UTF8.GetBytes(configuration)); hash = Convert.ToBase64String(incrementalHash.GetHashAndReset()); return(true); }
public void ShouldNotParseLoadDirectiveIgnoringCase() { using (var rootFolder = new DisposableFolder()) { var rootScript = WriteScript("#LOAD \"Bar.csx\"", rootFolder.Path, "Foo.csx"); WriteScript(string.Empty, rootFolder.Path, "Bar.csx"); var scriptFilesResolver = new ScriptFilesResolver(); var files = scriptFilesResolver.GetScriptFiles(rootScript); Assert.Equal(new[] { "Foo.csx" }, files.Select(Path.GetFileName)); } }
public void ShouldOnlyResolveRootScript() { using (var rootFolder = new DisposableFolder()) { var rootScript = WriteScript(string.Empty, rootFolder.Path, "Foo.csx"); WriteScript(string.Empty, rootFolder.Path, "Bar.csx"); var scriptFilesResolver = new ScriptFilesResolver(); var files = scriptFilesResolver.GetScriptFiles(rootScript); Assert.True(files.Count == 1); Assert.Contains(files, f => f.Contains("Foo.csx")); Assert.Contains(files, f => !f.Contains("Bar.csx")); } }
public void ShouldParseFilesStartingWithNuGet() { using (var rootFolder = new DisposableFolder()) { var rootScript = WriteScript("#load \"NuGet.csx\"", rootFolder.Path, "Foo.csx"); WriteScript(string.Empty, rootFolder.Path, "NuGet.csx"); var scriptFilesResolver = new ScriptFilesResolver(); var files = scriptFilesResolver.GetScriptFiles(rootScript); Assert.True(files.Count == 2); Assert.Contains(files, f => f.Contains("Foo.csx")); Assert.Contains(files, f => f.Contains("NuGet.csx")); } }
public void ShouldResolveLoadedScriptInSubFolder() { using (var rootFolder = new DisposableFolder()) { var rootScript = WriteScript("#load \"SubFolder/Bar.csx\"", rootFolder.Path, "Foo.csx"); var subFolder = Path.Combine(rootFolder.Path, "SubFolder"); Directory.CreateDirectory(subFolder); WriteScript(string.Empty, subFolder, "Bar.csx"); var scriptFilesResolver = new ScriptFilesResolver(); var files = scriptFilesResolver.GetScriptFiles(rootScript); Assert.True(files.Count == 2); Assert.Contains(files, f => f.Contains("Foo.csx")); Assert.Contains(files, f => f.Contains("Bar.csx")); } }
public ScriptSource(string code, FileInfo file = null) { Code = code; File = file; if (file == null) { return; } var imports = new ScriptFilesResolver().GetScriptFiles(file.FullName); imports.RemoveWhere(x => x.ToLowerInvariant().Equals(File.FullName.ToLowerInvariant())); Imports = imports .Select(x => new ScriptSource(System.IO.File.ReadAllText(x), new FileInfo(x))) .ToArray(); }