From 3369a4aea1f972fb6c8a5267594c080236b2b35f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Derriey?= Date: Sat, 28 Jan 2017 17:29:07 +1100 Subject: [PATCH] Add a build task to validate LINQPad samples (#1551) * add a build task to run LINQPad samples * make modifications to the validation of LINQPad samples * rename the CAKE task to its original name ValidateLINQPadSamples * rename the LINQPad samples file so they get executed in ordinal order (1, 2, ..., 10 and not 1, 10, 2, ...) * remove openssl linking in TravisCI when on macOS --- .gitignore | 3 +- .travis.yml | 3 - build/Tasks/LinkSources.cs | 8 +- build/Tasks/Package.cs | 1 + build/Tasks/ValidateLINQPadSamples.cs | 114 ++++++++++++++++++ ...tokit.linq => 01-introducing-octokit.linq} | 0 .../{2-releases.linq => 02-releases.linq} | 0 ...ories.linq => 03-browse-repositories.linq} | 0 ...=> 04-observable-browse-repositories.linq} | 0 ...inq => 05-interact-with-git-database.linq} | 0 ...ository.linq => 06-create-repository.linq} | 0 ...or-repos.linq => 07-search-for-repos.linq} | 0 .../{8-gists.linq => 08-gists.linq} | 0 .../{9-issues.linq => 09-issues.linq} | 0 14 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 build/Tasks/ValidateLINQPadSamples.cs rename samples/linqpad-samples/{1-introducing-octokit.linq => 01-introducing-octokit.linq} (100%) rename samples/linqpad-samples/{2-releases.linq => 02-releases.linq} (100%) rename samples/linqpad-samples/{3-browse-repositories.linq => 03-browse-repositories.linq} (100%) rename samples/linqpad-samples/{4-observable-browse-repositories.linq => 04-observable-browse-repositories.linq} (100%) rename samples/linqpad-samples/{5-interact-with-git-database.linq => 05-interact-with-git-database.linq} (100%) rename samples/linqpad-samples/{6-create-repository.linq => 06-create-repository.linq} (100%) rename samples/linqpad-samples/{7-search-for-repos.linq => 07-search-for-repos.linq} (100%) rename samples/linqpad-samples/{8-gists.linq => 08-gists.linq} (100%) rename samples/linqpad-samples/{9-issues.linq => 09-issues.linq} (100%) diff --git a/.gitignore b/.gitignore index ce0dac36..ce826aee 100644 --- a/.gitignore +++ b/.gitignore @@ -103,4 +103,5 @@ Backup/ !.vscode/launch.json # CAKE -tools/ \ No newline at end of file +tools/* +!tools/LINQPad \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 35172222..2b0df92c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,9 +10,6 @@ matrix: osx_image: xcode8 dotnet: 1.0.0-preview2-003121 -before_install: - - if test "$TRAVIS_OS_NAME" == "osx"; then ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/; ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/; fi - script: - dotnet --info - ./build.sh diff --git a/build/Tasks/LinkSources.cs b/build/Tasks/LinkSources.cs index d75a7867..1f5699f4 100644 --- a/build/Tasks/LinkSources.cs +++ b/build/Tasks/LinkSources.cs @@ -1,9 +1,9 @@ -using Cake.Common.Build; +using System.Linq; +using Cake.Common; +using Cake.Common.Build; using Cake.Common.Diagnostics; -using Cake.Core; using Cake.Core.IO; using Cake.Frosting; -using System.Linq; [Dependency(typeof(Build))] public class LinkSources : FrostingTask @@ -43,6 +43,6 @@ public class LinkSources : FrostingTask public override bool ShouldRun(BuildContext context) { - return !context.Environment.Platform.IsUnix(); + return context.IsRunningOnWindows(); } } diff --git a/build/Tasks/Package.cs b/build/Tasks/Package.cs index aa0232e8..c7834fdf 100644 --- a/build/Tasks/Package.cs +++ b/build/Tasks/Package.cs @@ -5,6 +5,7 @@ using Cake.Frosting; [Dependency(typeof(UnitTests))] [Dependency(typeof(LinkSources))] +[Dependency(typeof(ValidateLINQPadSamples))] public class Package : FrostingTask { public override void Run(BuildContext context) diff --git a/build/Tasks/ValidateLINQPadSamples.cs b/build/Tasks/ValidateLINQPadSamples.cs new file mode 100644 index 00000000..d0f056da --- /dev/null +++ b/build/Tasks/ValidateLINQPadSamples.cs @@ -0,0 +1,114 @@ +using System; +using System.IO; +using System.Linq; +using System.Xml.Linq; +using Cake.Common; +using Cake.Common.Diagnostics; +using Cake.Core; +using Cake.Core.IO; +using Cake.Frosting; + +[Dependency(typeof(Build))] +public class ValidateLINQPadSamples : FrostingTask +{ + public override void Run(BuildContext context) + { + var assembliesDirectoryPath = context.Environment.WorkingDirectory + .Combine("Octokit.Reactive") + .Combine("bin") + .Combine(context.Configuration) + .Combine("net45") + .MakeAbsolute(context.Environment) + .FullPath; + + var linqpadSamples = context.FileSystem + .GetDirectory("samples/linqpad-samples") + .GetFiles("*.linq", SearchScope.Current) + .Select(x => x.Path) + .ToArray(); + + var linqpadExe = context.Environment.WorkingDirectory + .Combine("tools") + .Combine("LINQPad") + .CombineWithFilePath("lprun.exe") + .MakeAbsolute(context.Environment); + + foreach (var linqpadSample in linqpadSamples) + { + var sampleName = linqpadSample.GetFilename(); + var rewrittenSample = RewriteLinqpadScriptToUseLocalAssemblies(assembliesDirectoryPath, linqpadSample.FullPath); + + context.Information("Executing sample {0}...", sampleName); + var exitCode = context.StartProcess( + linqpadExe, + $"-compileonly -lang=Program {rewrittenSample}"); + + if (exitCode != 0) + { + throw new CakeException($"Execution of sample {sampleName} failed"); + } + } + + context.Information("All samples executed successfully"); + } + + public override bool ShouldRun(BuildContext context) + { + return context.IsRunningOnWindows(); + } + + private static string RewriteLinqpadScriptToUseLocalAssemblies(string directory, string filePath) + { + var text = File.ReadAllText(filePath); + + var openTag = ""; + var openTagIndex = text.IndexOf(openTag); + var closeTag = ""; + var closeTagIndex = text.IndexOf(closeTag); + + if (openTagIndex == -1 || closeTagIndex == -1) + { + throw new InvalidOperationException(); + } + + var endOfMetadata = closeTagIndex + closeTag.Length; + + // write to temp file on disk + var tempFilePath = System.IO.Path.GetTempFileName(); + + using (var stream = File.OpenWrite(tempFilePath)) + using (var writer = new StreamWriter(stream)) + { + // reference all known assemblies + writer.WriteLine("ref {0}\\System.Reactive.Core.dll;", directory); + writer.WriteLine("ref {0}\\System.Reactive.Interfaces.dll;", directory); + writer.WriteLine("ref {0}\\System.Reactive.Linq.dll;", directory); + writer.WriteLine("ref {0}\\Octokit.dll;", directory); + writer.WriteLine("ref {0}\\Octokit.Reactive.dll;", directory); + writer.WriteLine("ref C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.5\\System.Net.Http.dll;"); + writer.WriteLine(); + + var xmlText = text.Substring(openTagIndex, endOfMetadata); + var rest = text.Substring(endOfMetadata); + + var doc = XDocument.Parse(xmlText); + + // add namespaces specified in xml + var namespaces = doc.Descendants() + .Where(x => x.Name == "Namespace") + .Select(x => x.Value.ToString()); + + foreach (var @namespace in namespaces) + { + writer.WriteLine("using {0};", @namespace); + } + + writer.WriteLine(); + writer.WriteLine(rest); + + writer.Flush(); + } + + return tempFilePath; + } +} \ No newline at end of file diff --git a/samples/linqpad-samples/1-introducing-octokit.linq b/samples/linqpad-samples/01-introducing-octokit.linq similarity index 100% rename from samples/linqpad-samples/1-introducing-octokit.linq rename to samples/linqpad-samples/01-introducing-octokit.linq diff --git a/samples/linqpad-samples/2-releases.linq b/samples/linqpad-samples/02-releases.linq similarity index 100% rename from samples/linqpad-samples/2-releases.linq rename to samples/linqpad-samples/02-releases.linq diff --git a/samples/linqpad-samples/3-browse-repositories.linq b/samples/linqpad-samples/03-browse-repositories.linq similarity index 100% rename from samples/linqpad-samples/3-browse-repositories.linq rename to samples/linqpad-samples/03-browse-repositories.linq diff --git a/samples/linqpad-samples/4-observable-browse-repositories.linq b/samples/linqpad-samples/04-observable-browse-repositories.linq similarity index 100% rename from samples/linqpad-samples/4-observable-browse-repositories.linq rename to samples/linqpad-samples/04-observable-browse-repositories.linq diff --git a/samples/linqpad-samples/5-interact-with-git-database.linq b/samples/linqpad-samples/05-interact-with-git-database.linq similarity index 100% rename from samples/linqpad-samples/5-interact-with-git-database.linq rename to samples/linqpad-samples/05-interact-with-git-database.linq diff --git a/samples/linqpad-samples/6-create-repository.linq b/samples/linqpad-samples/06-create-repository.linq similarity index 100% rename from samples/linqpad-samples/6-create-repository.linq rename to samples/linqpad-samples/06-create-repository.linq diff --git a/samples/linqpad-samples/7-search-for-repos.linq b/samples/linqpad-samples/07-search-for-repos.linq similarity index 100% rename from samples/linqpad-samples/7-search-for-repos.linq rename to samples/linqpad-samples/07-search-for-repos.linq diff --git a/samples/linqpad-samples/8-gists.linq b/samples/linqpad-samples/08-gists.linq similarity index 100% rename from samples/linqpad-samples/8-gists.linq rename to samples/linqpad-samples/08-gists.linq diff --git a/samples/linqpad-samples/9-issues.linq b/samples/linqpad-samples/09-issues.linq similarity index 100% rename from samples/linqpad-samples/9-issues.linq rename to samples/linqpad-samples/09-issues.linq