diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..58f3c07
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+/Build/bin
+/Build/obj
+/Build/.vs
+/DependenciesBuild
+/DependenciesSource
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..26db2c7
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "Dependencies/Actions.Library"]
+ path = Dependencies/Actions.Library
+ url = https://github.com/L-proger/Actions.Library.git
diff --git a/Build/Build.csproj b/Build/Build.csproj
new file mode 100644
index 0000000..97b262f
--- /dev/null
+++ b/Build/Build.csproj
@@ -0,0 +1,14 @@
+
+
+
+ Exe
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/Build/Build.sln b/Build/Build.sln
new file mode 100644
index 0000000..5dd3bec
--- /dev/null
+++ b/Build/Build.sln
@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.12.35707.178 d17.12
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Build", "Build.csproj", "{227CD697-3936-44E6-9804-5FD12EDF17E6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Actions.Library", "..\Dependencies\Actions.Library\Actions.Library.csproj", "{15ECFF80-DEAF-4227-831B-D71FC0B65371}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {227CD697-3936-44E6-9804-5FD12EDF17E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {227CD697-3936-44E6-9804-5FD12EDF17E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {227CD697-3936-44E6-9804-5FD12EDF17E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {227CD697-3936-44E6-9804-5FD12EDF17E6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {15ECFF80-DEAF-4227-831B-D71FC0B65371}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {15ECFF80-DEAF-4227-831B-D71FC0B65371}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {15ECFF80-DEAF-4227-831B-D71FC0B65371}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {15ECFF80-DEAF-4227-831B-D71FC0B65371}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Build/Dependencies.cs b/Build/Dependencies.cs
new file mode 100644
index 0000000..65341d0
--- /dev/null
+++ b/Build/Dependencies.cs
@@ -0,0 +1,87 @@
+using Actions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Build {
+ public static class Dependencies {
+ static readonly string APR_VERSION = "1.7.5";
+ static readonly string APU_VERSION = "1.6.3";
+ static readonly string PY3C_VERSION = "1.1";
+ static readonly string SERF_VERSION = "1.3.10";
+ static readonly string ZLIB_VERSION = "1.2.8";
+ static readonly string SQLITE_VERSION = "3.39.4";
+ static readonly int SQLITE_VERSION_REL_YEAR = 2022;
+ static readonly string APACHE_MIRROR = "https://archive.apache.org/dist";
+
+
+ public static async Task DownloadIfNotExist(string url, string outPath) {
+ string? result = outPath;
+ if (!File.Exists(outPath)) {
+ Console.Write($"Downloading: {url}");
+ result = await Download.FileFromUrl(url, outPath);
+ Console.WriteLine($" Done");
+ } else {
+ Console.WriteLine($"Skip downloading: {url}");
+ }
+ return result;
+ }
+
+ public static async Task GetZLib(string dir) {
+ var ZLIB = $"zlib-{ZLIB_VERSION}";
+ var archiveFile = await DownloadIfNotExist($"https://github.com/madler/zlib/archive/refs/tags/v{ZLIB_VERSION}.tar.gz", Path.Combine(dir, $"{ZLIB}.tar.gz"));
+ Archive.UnpackTarGz(archiveFile, dir);
+ return Path.Combine(dir, ZLIB);
+ }
+
+ public static async Task GetSqlite(string dir) {
+ var SQLITE_VERSION_LIST = SQLITE_VERSION.Split(".");
+ var SQLITE = string.Format("sqlite-amalgamation-{0}{1}{2}00", SQLITE_VERSION_LIST[0], SQLITE_VERSION_LIST[1].PadLeft(2, '0'), SQLITE_VERSION_LIST[2].PadLeft(2, '0'));
+ var archiveFile = await DownloadIfNotExist($"https://www.sqlite.org/{SQLITE_VERSION_REL_YEAR}/{SQLITE}.zip", Path.Combine(dir, $"{SQLITE}.zip"));
+ Archive.UnpackZip(archiveFile, dir);
+ return Path.Combine(dir, $"{SQLITE}");
+ }
+
+ public static async Task GetSerf(string dir) {
+ var SERF = $"serf-{SERF_VERSION}";
+ var archiveFile = await DownloadIfNotExist($"https://archive.apache.org/dist/serf/{SERF}.tar.bz2", Path.Combine(dir, $"{SERF}.tar.bz2"));
+ Archive.UnpackTarBz2(archiveFile, dir);
+ return Path.Combine(dir, $"{SERF}");
+ }
+
+ public static async Task GetExpat(string dir) {
+
+ var archiveFile = await DownloadIfNotExist($"https://github.com/libexpat/libexpat/releases/download/R_2_6_4/expat-win64bin-2.6.4.zip", Path.Combine(dir, $"expat-win64bin-2.6.4.zip"));
+ var resultDir = Path.Combine(dir, "expat-win64bin-2.6.4");
+ Directory.CreateDirectory(resultDir);
+ Archive.UnpackZip(archiveFile, resultDir);
+ return Path.Combine(dir, resultDir);
+ }
+
+ public static async Task GetOpenssl(string dir) {
+ var archiveFile = await DownloadIfNotExist($"https://github.com/openssl/openssl/releases/download/openssl-3.2.3/openssl-3.2.3.tar.gz", Path.Combine(dir, $"openssl-3.2.3.tar.gz"));
+ Archive.UnpackTarGz(archiveFile, dir);
+ return Path.Combine(dir, $"openssl-3.2.3");
+ }
+
+ public static async Task GetApr(string dir) {
+ var APR = $"apr-{APR_VERSION}";
+ var archiveFile = await DownloadIfNotExist($"{APACHE_MIRROR}/apr/{APR}.tar.bz2", Path.Combine(dir, $"{APR}.tar.bz2"));
+ Archive.UnpackTarBz2(archiveFile, dir);
+ return Path.Combine(dir, $"{APR}");
+ }
+
+ public static async Task GetAprUtil(string dir) {
+ var APR_UTIL = $"apr-util-{APU_VERSION}";
+ var archiveFile = await DownloadIfNotExist($"{APACHE_MIRROR}/apr/{APR_UTIL}.tar.bz2", Path.Combine(dir, $"{APR_UTIL}.tar.bz2"));
+ Archive.UnpackTarBz2(archiveFile, dir);
+ return Path.Combine(dir, $"{APR_UTIL}");
+ }
+
+ public static async Task GetSubversion(string projectRootDir) {
+ return Path.GetFullPath(Path.Combine(projectRootDir, "..", "subversion"));
+ }
+ }
+}
diff --git a/Build/Program.cs b/Build/Program.cs
new file mode 100644
index 0000000..be09937
--- /dev/null
+++ b/Build/Program.cs
@@ -0,0 +1,195 @@
+
+
+
+using Actions;
+using Actions.Library;
+using Build;
+using System.Collections.Generic;
+using System.Data.SqlTypes;
+using System.Runtime.CompilerServices;
+using System.Security.Cryptography;
+using static System.Runtime.InteropServices.JavaScript.JSType;
+
+
+class Application {
+
+ static string GetCurrentFileDir([CallerFilePath]string callerFilePath = null) {
+ return Path.GetDirectoryName(callerFilePath);
+ }
+
+ static string GetProjectRootDir() {
+ return Path.GetDirectoryName(GetCurrentFileDir());
+ }
+
+
+ static void BuildZLib(string zlib, string installDir) {
+ var buildDir = TempDirectory.New();
+ var cmake = Find.Executable("cmake");
+ var ninja = Find.Executable("ninja");
+ var configResult = cmake.Run($"-G \"Ninja\" -DCMAKE_INSTALL_PREFIX={Path.Combine(installDir, "zlib")} -DCMAKE_BUILD_TYPE=RELEASE {zlib}", buildDir);
+ var buildResult = ninja.Run("", buildDir);
+ var installResult = ninja.Run("install", buildDir);
+ }
+
+ static void BuildOpenssl(string source, string installDir) {
+ var tmpDir = TempDirectory.New();
+
+ var perl = Find.Executable("perl");
+ if (perl == null) {
+ throw new Exception("Perl not found but required for OpenSSL build");
+ }
+
+ var nasm = Find.Executable("nasm");
+ if (nasm == null) {
+ throw new Exception("Nasm not found but required for OpenSSL build");
+ }
+
+ var installPrefix = Path.Combine(installDir, "openssl").Replace("\\", "/");
+ var configFilePath = Path.Combine(source, "Configure").Replace("\\", "/");
+
+ var configureResult = perl.Run($"{configFilePath} VC-WIN64A enable-capieng --prefix={installPrefix} --openssldir={installPrefix}", tmpDir);
+
+ var nmake = Find.Executable("nmake");
+
+ var buildResult = nmake.Run("", tmpDir);
+ var installResult = nmake.Run("install", tmpDir);
+ }
+
+
+ static void BuildApr(string source, string installDir) {
+ var tmpDir = TempDirectory.New();
+
+ var cmake = Find.Executable("cmake");
+ var ninja = Find.Executable("ninja");
+ var installPrefix = Path.Combine(installDir, "apr").Replace("\\", "/");
+
+ var configResult = cmake.Run($"-DCMAKE_INSTALL_PREFIX={installPrefix} -G \"Ninja\" -DAPR_INSTALL_PRIVATE_H=ON -DCMAKE_BUILD_TYPE=RELEASE -DAPR_BUILD_STATIC=ON {source}", tmpDir);
+ var buildResult = ninja.Run("", tmpDir);
+ var installResult = ninja.Run("install", tmpDir);
+ }
+
+ static void BuildAprUtil(string source, string expatLibDir, string installDir) {
+ var tmpDir = TempDirectory.New();
+
+ var cmake = Find.Executable("cmake");
+ var ninja = Find.Executable("ninja");
+ var installPrefix = Path.Combine(installDir, "apr").Replace("\\", "/");
+
+ var expatLibPath = Path.Combine(expatLibDir, "Bin", "libexpat.lib").Replace("\\", "/");
+ var expatIncPath = Path.Combine(expatLibDir, "Source", "lib").Replace("\\", "/");
+ var opensslPath = Path.Combine(installDir, "openssl").Replace("\\", "/");
+
+ var configResult = cmake.Run($"-DCMAKE_INSTALL_PREFIX={installPrefix} -G \"Ninja\" -DAPR_INSTALL_PRIVATE_H=ON -DCMAKE_BUILD_TYPE=RELEASE -DEXPAT_LIBRARY={expatLibPath} -DEXPAT_INCLUDE_DIR={expatIncPath} -DAPU_HAVE_CRYPTO=ON -DOPENSSL_ROOT_DIR={opensslPath} {source}", tmpDir);
+ var buildResult = ninja.Run("", tmpDir);
+ var installResult = ninja.Run("install", tmpDir);
+ }
+
+ static void BuildSerf(string source, string installDir) {
+ var scons = Find.Executable("scons");
+ var installPrefix = Path.Combine(installDir, "serf").Replace("\\", "/");
+ var libinstallPrefix = Path.Combine(installPrefix, "lib").Replace("\\", "/");
+
+ var aprPath = Path.Combine(installDir, "apr").Replace("\\", "/");
+ var aprUtilPath = Path.Combine(installDir, "apr").Replace("\\", "/");
+ var zlibPath = Path.Combine(installDir, "zlib").Replace("\\", "/");
+ var opensslPath = Path.Combine(installDir, "openssl").Replace("\\", "/");
+ //
+ scons.Run($"APR={aprPath} APU={aprUtilPath} ZLIB={zlibPath} OPENSSL={opensslPath} SOURCE_LAYOUT=0 TARGET_ARCH=X64 MSVC_VERSION=2022 PREFIX={installPrefix} LIBDIR={libinstallPrefix}", source);
+ scons.Run("install", source);
+ }
+
+ static void FixAprForSerf(string installDir) {
+ var aprPath = Path.Combine(installDir, "apr");
+ var incPath = Path.Combine(aprPath, "include");
+
+ var fixPath = Path.Combine(incPath, "apr-1");
+ Directory.CreateDirectory(fixPath);
+
+ var files = Directory.GetFiles(incPath);
+
+ foreach (var file in files) {
+ var name = Path.GetFileName(file);
+ var destPath = Path.Combine(fixPath, name);
+ File.Copy(file, destPath, true);
+ }
+ }
+
+ static void PatchSerf(string serfSource) {
+ var sconstructPath = Path.Combine(serfSource, "SConstruct");
+
+
+ string text = File.ReadAllText(sconstructPath);
+ text = text.Replace("$OPENSSL/include/openssl", "$OPENSSL/include");
+ File.WriteAllText(sconstructPath, text);
+ }
+
+ static void BuildSubversion(string svnSource, string sqlSource, string installDir) {
+ var aprPath = Path.Combine(installDir, "apr").Replace("\\", "/");
+ var serfPath = Path.Combine(installDir, "serf").Replace("\\", "/");
+ var zlibPath = Path.Combine(installDir, "zlib").Replace("\\", "/");
+ var opensslPath = Path.Combine(installDir, "openssl").Replace("\\", "/");
+ string libPaths = $"{aprPath};{serfPath};{zlibPath}";
+ string expatBinDir = "e:/SvnDeps/expat/Bin";
+ string expatIncDir = "e:/SvnDeps/expat/Source/lib";
+ string installPrefix = Path.Combine(installDir, "subversion");
+
+ List args = new List();
+ args.Add("-G \"Ninja\"");
+ args.Add($"-DCMAKE_LIBRARY_PATH={libPaths}");
+ args.Add($"-DCMAKE_PREFIX_PATH={libPaths}");
+ args.Add($"-DPC_EXPAT_LIBRARY_DIRS={expatBinDir}");
+ args.Add($"-DPC_EXPAT_INCLUDE_DIRS={expatIncDir}");
+ args.Add($"-DSVN_SQLITE_USE_AMALGAMATION=ON");
+ args.Add($"-DSQLITE_AMALGAMATION_DIR={sqlSource}");
+ args.Add($"-DCMAKE_BUILD_TYPE=RELEASE");
+ args.Add($"-DSVN_ENABLE_RA_SERF=ON");
+ args.Add($"-DOPENSSL_ROOT_DIR={opensslPath}");
+ args.Add($"-DSVN_ENABLE_SVNXX=ON");
+ args.Add($"-DSVN_ENABLE_NLS=OFF");
+ args.Add($"-DZLIB_USE_STATIC_LIBS=ON");
+ args.Add($"-DCMAKE_INSTALL_PREFIX={installPrefix}");
+ args.Add($"{svnSource}");
+
+ var argsString = string.Join(" ", args);
+
+ var cmake = Find.Executable("cmake");
+ var ninja = Find.Executable("ninja");
+
+ var tmpDir = TempDirectory.New();
+ var configResult = cmake.Run(argsString, tmpDir);
+
+ var buildResult = ninja.Run("", tmpDir);
+ var installResult = ninja.Run("install", tmpDir);
+ }
+
+ public static async Task Main() {
+ VisualStudio.SetupEnvironment(CpuArchitecture.x64);
+
+ var projectRootDir = GetProjectRootDir();
+ var depsSourceDirectory = Path.Combine(projectRootDir, "DependenciesSource");
+ Directory.CreateDirectory(depsSourceDirectory);
+ var depsBuildDirectory = Path.Combine(projectRootDir, "DependenciesBuild");
+ Directory.CreateDirectory(depsBuildDirectory);
+
+ var svn = await Dependencies.GetSubversion(projectRootDir);
+ var zLib = await Dependencies.GetZLib(depsSourceDirectory);
+ var sqLite = await Dependencies.GetSqlite(depsSourceDirectory);
+ var apr = await Dependencies.GetApr(depsSourceDirectory);
+ var aprUtil = await Dependencies.GetAprUtil(depsSourceDirectory);
+ var serf = await Dependencies.GetSerf(depsSourceDirectory);
+ var openssl = await Dependencies.GetOpenssl(depsSourceDirectory);
+ var expat = await Dependencies.GetExpat(depsSourceDirectory);
+
+ BuildOpenssl(openssl, depsBuildDirectory);
+ BuildZLib(zLib, depsBuildDirectory);
+ BuildApr(apr, depsBuildDirectory);
+ BuildAprUtil(aprUtil, expat, depsBuildDirectory);
+ FixAprForSerf(depsBuildDirectory);
+ PatchSerf(serf);
+ BuildSerf(serf, depsBuildDirectory);
+ BuildSubversion(svn, sqLite, depsBuildDirectory);
+
+ return 0;
+ }
+
+}
diff --git a/Dependencies/Actions.Library/.gitignore b/Dependencies/Actions.Library/.gitignore
new file mode 100644
index 0000000..4c7473d
--- /dev/null
+++ b/Dependencies/Actions.Library/.gitignore
@@ -0,0 +1,2 @@
+/bin
+/obj
diff --git a/Dependencies/Actions.Library/Action.cs b/Dependencies/Actions.Library/Action.cs
new file mode 100644
index 0000000..c00192e
--- /dev/null
+++ b/Dependencies/Actions.Library/Action.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Actions {
+ public class Action {
+
+ }
+}
diff --git a/Dependencies/Actions.Library/Actions.Library.csproj b/Dependencies/Actions.Library/Actions.Library.csproj
new file mode 100644
index 0000000..0be27ab
--- /dev/null
+++ b/Dependencies/Actions.Library/Actions.Library.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net8.0
+ enable
+ enable
+ Actions
+
+
+
+
+
+
+
diff --git a/Dependencies/Actions.Library/Archive.cs b/Dependencies/Actions.Library/Archive.cs
new file mode 100644
index 0000000..c4a1b7b
--- /dev/null
+++ b/Dependencies/Actions.Library/Archive.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.IO.Compression;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Formats.Tar;
+using SharpCompress.Compressors.BZip2;
+using SharpCompress.Archives;
+using SharpCompress.Common;
+
+namespace Actions {
+ public static class Archive {
+
+ public static void UnpackTarGz(string archiveFileName, string outDirectory) {
+ using var fileStream = File.OpenRead(archiveFileName);
+ using var gzipStream = new GZipStream(fileStream, CompressionMode.Decompress);
+ TarFile.ExtractToDirectory(gzipStream, outDirectory, true);
+ }
+
+ public static void UnpackTarBz2(string archiveFileName, string outDirectory) {
+ using var fileStream = File.OpenRead(archiveFileName);
+ using var bz2Stream = new BZip2Stream(fileStream, SharpCompress.Compressors.CompressionMode.Decompress, false);
+ TarFile.ExtractToDirectory(bz2Stream, outDirectory, true);
+ }
+
+ public static void UnpackZip(string archiveFileName, string outDirectory) {
+ using var fileStream = File.OpenRead(archiveFileName);
+
+ using var zipArchive = SharpCompress.Archives.Zip.ZipArchive.Open(fileStream);
+ foreach (var entry in zipArchive.Entries.Where(entry => !entry.IsDirectory)) {
+ entry.WriteToDirectory(outDirectory, new ExtractionOptions() {
+ ExtractFullPath = true,
+ Overwrite = true
+ });
+ }
+ }
+ }
+}
diff --git a/Dependencies/Actions.Library/CMake.cs b/Dependencies/Actions.Library/CMake.cs
new file mode 100644
index 0000000..d922e90
--- /dev/null
+++ b/Dependencies/Actions.Library/CMake.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Actions.Library {
+ public class CMake {
+
+ public static void Configure(string sourceDirectoryPath, string buildDirectoryPath) {
+ SystemProcess.Run("cmake", $"-DCMAKE_BUILD_TYPE:STRING=\"Release\" -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE:PATH=\"{buildDirectoryPath}/bin\" -H{sourceDirectoryPath} -B{buildDirectoryPath}", null);
+ }
+
+ public static void Build(string buildDirectoryPath) {
+ SystemProcess.Run("cmake", $"--build {buildDirectoryPath} --config Release", null);
+ }
+ }
+}
diff --git a/Dependencies/Actions.Library/Config.cs b/Dependencies/Actions.Library/Config.cs
new file mode 100644
index 0000000..43f3155
--- /dev/null
+++ b/Dependencies/Actions.Library/Config.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Actions.Library {
+ public static class Config {
+ private static string PropertyNamePrefix = "Actions_";
+
+ private static string? Get([CallerMemberName]string? name = null) {
+ if(string.IsNullOrWhiteSpace(name)) {
+ throw new ArgumentNullException(nameof(name));
+ }
+ var result = System.Environment.GetEnvironmentVariable(PropertyNamePrefix + name);
+ return result;
+ }
+ private static void Set(string? value, [CallerMemberName] string? name = null) {
+ if (string.IsNullOrWhiteSpace(name)) {
+ throw new ArgumentNullException(nameof(name));
+ }
+ System.Environment.SetEnvironmentVariable(PropertyNamePrefix + name, value);
+ }
+
+
+ public static string? Nuget_RepoAuth { get { return Get(); } set { Set(value); } }
+ public static string? Nuget_RepoName { get { return Get(); } set { Set(value); } }
+
+ public static string? ArtifactsOutputDirectory { get { var result = Get(); return string.IsNullOrWhiteSpace(result) ? ".artifacts" : result; } set { Set(value); } }
+
+ }
+}
diff --git a/Dependencies/Actions.Library/CpuArchitecture.cs b/Dependencies/Actions.Library/CpuArchitecture.cs
new file mode 100644
index 0000000..b39ff00
--- /dev/null
+++ b/Dependencies/Actions.Library/CpuArchitecture.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Actions {
+ public enum CpuArchitecture {
+ x86,
+ x64,
+ armeabi_v7a,
+ arm64_v8a,
+ riscv32
+ }
+}
diff --git a/Dependencies/Actions.Library/Download.cs b/Dependencies/Actions.Library/Download.cs
new file mode 100644
index 0000000..0f408dc
--- /dev/null
+++ b/Dependencies/Actions.Library/Download.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using static Actions.Library.SystemProcess;
+
+namespace Actions {
+ public static class Download {
+ public static async Task BytesFromUrl(string url) {
+ using (var client = new HttpClient())
+ using (var result = await client.GetAsync(url))
+ return result.IsSuccessStatusCode ? await result.Content.ReadAsByteArrayAsync() : null;
+ }
+
+ public static async Task FileFromUrl(string url, string outputFilePath) {
+ using var client = new HttpClient();
+ using var result = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
+ if(!result.IsSuccessStatusCode) {
+ return null;
+ }
+ using var responseStream = result.Content.ReadAsStream();
+ using var destinationFileStream = new FileStream(outputFilePath, FileMode.CreateNew);
+ responseStream.CopyTo(destinationFileStream);
+ return outputFilePath;
+ }
+ }
+}
diff --git a/Dependencies/Actions.Library/Executable.cs b/Dependencies/Actions.Library/Executable.cs
new file mode 100644
index 0000000..6f0d993
--- /dev/null
+++ b/Dependencies/Actions.Library/Executable.cs
@@ -0,0 +1,25 @@
+using Actions.Library;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Actions {
+ public class Executable {
+ public string FullPath {
+ get; private set;
+ }
+ private Executable() { FullPath = "UNKNOWN"; }
+ public Executable(string fullPath) {
+ if (!File.Exists(fullPath)) {
+ throw new FileNotFoundException($"Executable file not found at path {fullPath}");
+ }
+ FullPath = fullPath;
+ }
+
+ public SystemProcess.Result Run(string args, string? workingDirectory = null) {
+ return SystemProcess.Run(FullPath, args, workingDirectory);
+ }
+ }
+}
diff --git a/Dependencies/Actions.Library/Find.cs b/Dependencies/Actions.Library/Find.cs
new file mode 100644
index 0000000..55ae40c
--- /dev/null
+++ b/Dependencies/Actions.Library/Find.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Actions {
+ public static class Find {
+ public static string? SystemFilePath(string name) {
+ name = Environment.ExpandEnvironmentVariables(name);
+ if (!File.Exists(name)) {
+ if (string.IsNullOrEmpty(Path.GetDirectoryName(name))) {
+ foreach (string test in (Environment.GetEnvironmentVariable("PATH") ?? "").Split(';')) {
+ string path = test.Trim();
+ if (!String.IsNullOrEmpty(path) && File.Exists(path = Path.Combine(path, name)))
+ return Path.GetFullPath(path);
+ }
+ }
+ return null;
+ }
+ return Path.GetFullPath(name);
+ }
+
+
+ public static string? ExecutablePath(string name) {
+ string? result = SystemFilePath(name);
+ if (result == null) {
+ if (!name.ToLower().EndsWith(".exe")) {
+ name = name + ".exe";
+ result = SystemFilePath(name);
+ }
+ }
+ return result;
+ }
+
+ public static Executable? Executable(string name) {
+ var path = ExecutablePath(name);
+ if (path == null) {
+ return null;
+ }
+ return new Executable(path);
+ }
+ }
+}
diff --git a/Dependencies/Actions.Library/LICENSE b/Dependencies/Actions.Library/LICENSE
new file mode 100644
index 0000000..033687c
--- /dev/null
+++ b/Dependencies/Actions.Library/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Sergey Serb
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Dependencies/Actions.Library/Nuget/Nuget.cs b/Dependencies/Actions.Library/Nuget/Nuget.cs
new file mode 100644
index 0000000..718afb2
--- /dev/null
+++ b/Dependencies/Actions.Library/Nuget/Nuget.cs
@@ -0,0 +1,31 @@
+using Actions.Library;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Actions.Nuget {
+ public class Nuget {
+ public static void DeletePackage(string repository, string packageName, string packageVersion) {
+ var result = SystemProcess.Run("dotnet", $"nuget delete {packageName} {packageVersion} -s {repository} --non-interactive");
+ if (!result.Succeeded) {
+ throw new Exception("Failed to delete nuget package");
+ }
+ }
+
+ public static void PushPackage(string repository, string packageFilePath, string? workingDirectory = null) {
+ var result = SystemProcess.Run("dotnet", $"nuget push --source {repository} {packageFilePath}", workingDirectory);
+ if (!result.Succeeded) {
+ throw new Exception("Failed to push nuget package");
+ }
+ }
+
+ public static void PackPackage(string workingDirectory) {
+ var result = SystemProcess.Run("nuget", "pack", workingDirectory);
+ if (!result.Succeeded) {
+ throw new Exception($"Failed to pack nuget package: {string.Join("\n", result.StdError)}");
+ }
+ }
+ }
+}
diff --git a/Dependencies/Actions.Library/Nuget/NuspecFile.cs b/Dependencies/Actions.Library/Nuget/NuspecFile.cs
new file mode 100644
index 0000000..64dedba
--- /dev/null
+++ b/Dependencies/Actions.Library/Nuget/NuspecFile.cs
@@ -0,0 +1,58 @@
+using Actions.Nuget.Nuspec;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Serialization;
+
+namespace Actions.Nuget {
+
+
+
+
+ public class NuspecFile {
+ public Nuspec.Package package;
+
+ public NuspecFile() {
+ package = new Nuspec.Package();
+ }
+ public NuspecFile(string id, string version, string authors, string owners, Uri projectUrl, bool requireLicenseAcceptance, string description, string[] tags, string license) {
+ package = new Nuspec.Package();
+ package.Metadata = new Nuspec.PackageMetadata();
+ package.Metadata.Authors = authors;
+ package.Metadata.Owners = owners;
+ package.Metadata.Id = id;
+ package.Metadata.Version = version;
+ package.Metadata.ProjectUrl = projectUrl.ToString();
+ package.Metadata.RequireLicenseAcceptance = requireLicenseAcceptance;
+ package.Metadata.Description = description;
+ package.Metadata.Tags = string.Join(" ", tags);
+ package.Metadata.License = new PackageMetadataLicense();
+ package.Metadata.License.Value = license;
+ package.Metadata.License.Type = "expression";
+ }
+
+ public void Serialize(Stream outStream) {
+ XmlSerializer serializer = new XmlSerializer(typeof(Nuspec.Package), "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd");
+ serializer.Serialize(outStream, package);
+ }
+
+ public void SerializeToFile(string path) {
+ var outFileStream = System.IO.File.Open(path, FileMode.Create, FileAccess.Write);
+ Serialize(outFileStream);
+ outFileStream.Close();
+ }
+
+ public void Deserialize(Stream inStream) {
+ XmlSerializer serializer = new XmlSerializer(typeof(Nuspec.Package), "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd");
+ package = (Nuspec.Package)serializer.Deserialize(inStream);
+ }
+
+ public void DeserializeFromFile(string path) {
+ var inFileStream = System.IO.File.Open(path, FileMode.Open, FileAccess.Read);
+ Deserialize(inFileStream);
+ inFileStream.Close();
+ }
+ }
+}
diff --git a/Dependencies/Actions.Library/Nuget/nuspec.cs b/Dependencies/Actions.Library/Nuget/nuspec.cs
new file mode 100644
index 0000000..53a72db
--- /dev/null
+++ b/Dependencies/Actions.Library/Nuget/nuspec.cs
@@ -0,0 +1,962 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+// This code was generated by XmlSchemaClassGenerator version 2.1.1142.0 using the following command:
+// XmlSchemaClassGenerator.Console -n http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd=Actions.Nuget.Nuspec --nullable E:\nuspec.xsd
+namespace Actions.Nuget.Nuspec {
+
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("dependency", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class Dependency {
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlAttributeAttribute("id")]
+ public string Id { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("version")]
+ public string Version { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("include")]
+ public string Include { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("exclude")]
+ public string Exclude { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("dependencyGroup", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class DependencyGroup {
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _dependency;
+
+ [System.Xml.Serialization.XmlElementAttribute("dependency")]
+ public System.Collections.ObjectModel.Collection Dependency {
+ get {
+ return _dependency;
+ }
+ private set {
+ _dependency = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the Dependency collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool DependencySpecified {
+ get {
+ return (this.Dependency.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public DependencyGroup() {
+ this._dependency = new System.Collections.ObjectModel.Collection();
+ }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("targetFramework")]
+ public string TargetFramework { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("reference", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class Reference {
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlAttributeAttribute("file")]
+ public string File { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("contentFileEntries", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class ContentFileEntries {
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlAttributeAttribute("include")]
+ public string Include { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("exclude")]
+ public string Exclude { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("buildAction")]
+ public string BuildAction { get; set; }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
+ [System.Xml.Serialization.XmlAttributeAttribute("copyToOutput")]
+ public bool CopyToOutputValue { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether the CopyToOutput property is specified.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
+ public bool CopyToOutputValueSpecified { get; set; }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public System.Nullable CopyToOutput {
+ get {
+ if (this.CopyToOutputValueSpecified) {
+ return this.CopyToOutputValue;
+ } else {
+ return null;
+ }
+ }
+ set {
+ this.CopyToOutputValue = value.GetValueOrDefault();
+ this.CopyToOutputValueSpecified = value.HasValue;
+ }
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
+ [System.Xml.Serialization.XmlAttributeAttribute("flatten")]
+ public bool FlattenValue { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether the Flatten property is specified.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
+ public bool FlattenValueSpecified { get; set; }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public System.Nullable Flatten {
+ get {
+ if (this.FlattenValueSpecified) {
+ return this.FlattenValue;
+ } else {
+ return null;
+ }
+ }
+ set {
+ this.FlattenValue = value.GetValueOrDefault();
+ this.FlattenValueSpecified = value.HasValue;
+ }
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("referenceGroup", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class ReferenceGroup {
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _reference;
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlElementAttribute("reference")]
+ public System.Collections.ObjectModel.Collection Reference {
+ get {
+ return _reference;
+ }
+ private set {
+ _reference = value;
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public ReferenceGroup() {
+ this._reference = new System.Collections.ObjectModel.Collection();
+ }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("targetFramework")]
+ public string TargetFramework { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("frameworkReference", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class FrameworkReference {
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlAttributeAttribute("name")]
+ public string Name { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("frameworkReferenceGroup", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class FrameworkReferenceGroup {
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _frameworkReference;
+
+ [System.Xml.Serialization.XmlElementAttribute("frameworkReference")]
+ public System.Collections.ObjectModel.Collection FrameworkReference {
+ get {
+ return _frameworkReference;
+ }
+ private set {
+ _frameworkReference = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the FrameworkReference collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool FrameworkReferenceSpecified {
+ get {
+ return (this.FrameworkReference.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public FrameworkReferenceGroup() {
+ this._frameworkReference = new System.Collections.ObjectModel.Collection();
+ }
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlAttributeAttribute("targetFramework")]
+ public string TargetFramework { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("package", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ [System.Xml.Serialization.XmlRootAttribute("package", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ public partial class Package {
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlElementAttribute("metadata")]
+ public PackageMetadata Metadata { get; set; }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _files;
+
+ [System.Xml.Serialization.XmlArrayAttribute("files", IsNullable = true)]
+ [System.Xml.Serialization.XmlArrayItemAttribute("file", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ public System.Collections.ObjectModel.Collection Files {
+ get {
+ return _files;
+ }
+ private set {
+ _files = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the Files collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool FilesSpecified {
+ get {
+ return (this.Files.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public Package() {
+ this._files = new System.Collections.ObjectModel.Collection();
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadata", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadata {
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlElementAttribute("id")]
+ public string Id { get; set; }
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlElementAttribute("version")]
+ public string Version { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("title")]
+ public string Title { get; set; }
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlElementAttribute("authors")]
+ public string Authors { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("owners")]
+ public string Owners { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("licenseUrl")]
+ public string LicenseUrl { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("projectUrl")]
+ public string ProjectUrl { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("iconUrl")]
+ public string IconUrl { get; set; }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
+ [System.Xml.Serialization.XmlElementAttribute("requireLicenseAcceptance")]
+ public bool RequireLicenseAcceptanceValue { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether the RequireLicenseAcceptance property is specified.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
+ public bool RequireLicenseAcceptanceValueSpecified { get; set; }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public System.Nullable RequireLicenseAcceptance {
+ get {
+ if (this.RequireLicenseAcceptanceValueSpecified) {
+ return this.RequireLicenseAcceptanceValue;
+ } else {
+ return null;
+ }
+ }
+ set {
+ this.RequireLicenseAcceptanceValue = value.GetValueOrDefault();
+ this.RequireLicenseAcceptanceValueSpecified = value.HasValue;
+ }
+ }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
+ [System.Xml.Serialization.XmlElementAttribute("developmentDependency")]
+ public bool DevelopmentDependencyValue { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether the DevelopmentDependency property is specified.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
+ public bool DevelopmentDependencyValueSpecified { get; set; }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public System.Nullable DevelopmentDependency {
+ get {
+ if (this.DevelopmentDependencyValueSpecified) {
+ return this.DevelopmentDependencyValue;
+ } else {
+ return null;
+ }
+ }
+ set {
+ this.DevelopmentDependencyValue = value.GetValueOrDefault();
+ this.DevelopmentDependencyValueSpecified = value.HasValue;
+ }
+ }
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlElementAttribute("description")]
+ public string Description { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("summary")]
+ public string Summary { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("releaseNotes")]
+ public string ReleaseNotes { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("copyright")]
+ public string Copyright { get; set; }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private string _language = "en-US";
+
+ [System.ComponentModel.DefaultValueAttribute("en-US")]
+ [System.Xml.Serialization.XmlElementAttribute("language")]
+ public string Language {
+ get {
+ return _language;
+ }
+ set {
+ _language = value;
+ }
+ }
+
+ [System.Xml.Serialization.XmlElementAttribute("tags")]
+ public string Tags { get; set; }
+
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
+ [System.Xml.Serialization.XmlElementAttribute("serviceable")]
+ public bool ServiceableValue { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether the Serviceable property is specified.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
+ public bool ServiceableValueSpecified { get; set; }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public System.Nullable Serviceable {
+ get {
+ if (this.ServiceableValueSpecified) {
+ return this.ServiceableValue;
+ } else {
+ return null;
+ }
+ }
+ set {
+ this.ServiceableValue = value.GetValueOrDefault();
+ this.ServiceableValueSpecified = value.HasValue;
+ }
+ }
+
+ [System.Xml.Serialization.XmlElementAttribute("icon")]
+ public string Icon { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("readme")]
+ public string Readme { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("repository")]
+ public PackageMetadataRepository Repository { get; set; }
+
+ [System.Xml.Serialization.XmlElementAttribute("license")]
+ public PackageMetadataLicense License { get; set; }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _packageTypes;
+
+ [System.Xml.Serialization.XmlArrayAttribute("packageTypes")]
+ [System.Xml.Serialization.XmlArrayItemAttribute("packageType", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ public System.Collections.ObjectModel.Collection PackageTypes {
+ get {
+ return _packageTypes;
+ }
+ private set {
+ _packageTypes = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the PackageTypes collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool PackageTypesSpecified {
+ get {
+ return (this.PackageTypes.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public PackageMetadata() {
+ this._packageTypes = new System.Collections.ObjectModel.Collection();
+ this._frameworkAssemblies = new System.Collections.ObjectModel.Collection();
+ this._frameworkReferences = new System.Collections.ObjectModel.Collection();
+ this._contentFiles = new System.Collections.ObjectModel.Collection();
+ }
+
+ [System.Xml.Serialization.XmlElementAttribute("dependencies")]
+ public PackageMetadataDependencies Dependencies { get; set; }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _frameworkAssemblies;
+
+ [System.Xml.Serialization.XmlArrayAttribute("frameworkAssemblies")]
+ [System.Xml.Serialization.XmlArrayItemAttribute("frameworkAssembly", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ public System.Collections.ObjectModel.Collection FrameworkAssemblies {
+ get {
+ return _frameworkAssemblies;
+ }
+ private set {
+ _frameworkAssemblies = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the FrameworkAssemblies collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool FrameworkAssembliesSpecified {
+ get {
+ return (this.FrameworkAssemblies.Count != 0);
+ }
+ }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _frameworkReferences;
+
+ [System.Xml.Serialization.XmlArrayAttribute("frameworkReferences")]
+ [System.Xml.Serialization.XmlArrayItemAttribute("group", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ public System.Collections.ObjectModel.Collection FrameworkReferences {
+ get {
+ return _frameworkReferences;
+ }
+ private set {
+ _frameworkReferences = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the FrameworkReferences collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool FrameworkReferencesSpecified {
+ get {
+ return (this.FrameworkReferences.Count != 0);
+ }
+ }
+
+ [System.Xml.Serialization.XmlElementAttribute("references")]
+ public PackageMetadataReferences References { get; set; }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _contentFiles;
+
+ [System.Xml.Serialization.XmlArrayAttribute("contentFiles")]
+ [System.Xml.Serialization.XmlArrayItemAttribute("files", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ public System.Collections.ObjectModel.Collection ContentFiles {
+ get {
+ return _contentFiles;
+ }
+ private set {
+ _contentFiles = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the ContentFiles collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool ContentFilesSpecified {
+ get {
+ return (this.ContentFiles.Count != 0);
+ }
+ }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("minClientVersion")]
+ public string MinClientVersion { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadataRepository", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadataRepository {
+
+ [System.Xml.Serialization.XmlAttributeAttribute("type")]
+ public string Type { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("url")]
+ public string Url { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("branch")]
+ public string Branch { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("commit")]
+ public string Commit { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadataLicense", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadataLicense {
+
+ ///
+ /// Gets or sets the text value.
+ ///
+ [System.Xml.Serialization.XmlTextAttribute()]
+ public string Value { get; set; }
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlAttributeAttribute("type")]
+ public string Type { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("version")]
+ public string Version { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadataPackageTypes", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadataPackageTypes {
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _packageType;
+
+ [System.Xml.Serialization.XmlElementAttribute("packageType")]
+ public System.Collections.ObjectModel.Collection PackageType {
+ get {
+ return _packageType;
+ }
+ private set {
+ _packageType = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the PackageType collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool PackageTypeSpecified {
+ get {
+ return (this.PackageType.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public PackageMetadataPackageTypes() {
+ this._packageType = new System.Collections.ObjectModel.Collection();
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadataPackageTypesPackageType", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadataPackageTypesPackageType {
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlAttributeAttribute("name")]
+ public string Name { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("version")]
+ public string Version { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadataDependencies", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadataDependencies {
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _dependency;
+
+ [System.Xml.Serialization.XmlElementAttribute("dependency")]
+ public System.Collections.ObjectModel.Collection Dependency {
+ get {
+ return _dependency;
+ }
+ private set {
+ _dependency = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the Dependency collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool DependencySpecified {
+ get {
+ return (this.Dependency.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public PackageMetadataDependencies() {
+ this._dependency = new System.Collections.ObjectModel.Collection();
+ this._group = new System.Collections.ObjectModel.Collection();
+ }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _group;
+
+ [System.Xml.Serialization.XmlElementAttribute("group")]
+ public System.Collections.ObjectModel.Collection Group {
+ get {
+ return _group;
+ }
+ private set {
+ _group = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the Group collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool GroupSpecified {
+ get {
+ return (this.Group.Count != 0);
+ }
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadataFrameworkAssemblies", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadataFrameworkAssemblies {
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _frameworkAssembly;
+
+ [System.Xml.Serialization.XmlElementAttribute("frameworkAssembly")]
+ public System.Collections.ObjectModel.Collection FrameworkAssembly {
+ get {
+ return _frameworkAssembly;
+ }
+ private set {
+ _frameworkAssembly = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the FrameworkAssembly collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool FrameworkAssemblySpecified {
+ get {
+ return (this.FrameworkAssembly.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public PackageMetadataFrameworkAssemblies() {
+ this._frameworkAssembly = new System.Collections.ObjectModel.Collection();
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadataFrameworkAssembliesFrameworkAssembly", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadataFrameworkAssembliesFrameworkAssembly {
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlAttributeAttribute("assemblyName")]
+ public string AssemblyName { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("targetFramework")]
+ public string TargetFramework { get; set; }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadataFrameworkReferences", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadataFrameworkReferences {
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _group;
+
+ [System.Xml.Serialization.XmlElementAttribute("group")]
+ public System.Collections.ObjectModel.Collection Group {
+ get {
+ return _group;
+ }
+ private set {
+ _group = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the Group collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool GroupSpecified {
+ get {
+ return (this.Group.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public PackageMetadataFrameworkReferences() {
+ this._group = new System.Collections.ObjectModel.Collection();
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadataReferences", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadataReferences {
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _reference;
+
+ [System.Xml.Serialization.XmlElementAttribute("reference")]
+ public System.Collections.ObjectModel.Collection Reference {
+ get {
+ return _reference;
+ }
+ private set {
+ _reference = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the Reference collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool ReferenceSpecified {
+ get {
+ return (this.Reference.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public PackageMetadataReferences() {
+ this._reference = new System.Collections.ObjectModel.Collection();
+ this._group = new System.Collections.ObjectModel.Collection();
+ }
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _group;
+
+ [System.Xml.Serialization.XmlElementAttribute("group")]
+ public System.Collections.ObjectModel.Collection Group {
+ get {
+ return _group;
+ }
+ private set {
+ _group = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the Group collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool GroupSpecified {
+ get {
+ return (this.Group.Count != 0);
+ }
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageMetadataContentFiles", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageMetadataContentFiles {
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _files;
+
+ [System.Xml.Serialization.XmlElementAttribute("files")]
+ public System.Collections.ObjectModel.Collection Files {
+ get {
+ return _files;
+ }
+ private set {
+ _files = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the Files collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool FilesSpecified {
+ get {
+ return (this.Files.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public PackageMetadataContentFiles() {
+ this._files = new System.Collections.ObjectModel.Collection();
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageFiles", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageFiles {
+
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ private System.Collections.ObjectModel.Collection _file;
+
+ [System.Xml.Serialization.XmlElementAttribute("file")]
+ public System.Collections.ObjectModel.Collection File {
+ get {
+ return _file;
+ }
+ private set {
+ _file = value;
+ }
+ }
+
+ ///
+ /// Gets a value indicating whether the File collection is empty.
+ ///
+ [System.Xml.Serialization.XmlIgnoreAttribute()]
+ public bool FileSpecified {
+ get {
+ return (this.File.Count != 0);
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public PackageFiles() {
+ this._file = new System.Collections.ObjectModel.Collection();
+ }
+ }
+
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.1.1142.0")]
+ [System.SerializableAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute("PackageFilesFile", Namespace = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd", AnonymousType = true)]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class PackageFilesFile {
+
+ [System.ComponentModel.DataAnnotations.RequiredAttribute(AllowEmptyStrings = true)]
+ [System.Xml.Serialization.XmlAttributeAttribute("src")]
+ public string Src { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("target")]
+ public string Target { get; set; }
+
+ [System.Xml.Serialization.XmlAttributeAttribute("exclude")]
+ public string Exclude { get; set; }
+ }
+}
diff --git a/Dependencies/Actions.Library/README.md b/Dependencies/Actions.Library/README.md
new file mode 100644
index 0000000..6f7be7c
--- /dev/null
+++ b/Dependencies/Actions.Library/README.md
@@ -0,0 +1 @@
+# Actions.Library
\ No newline at end of file
diff --git a/Dependencies/Actions.Library/RunCmake.cs b/Dependencies/Actions.Library/RunCmake.cs
new file mode 100644
index 0000000..69c562e
--- /dev/null
+++ b/Dependencies/Actions.Library/RunCmake.cs
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Actions {
+ public class RunCmake : Action {
+ }
+}
diff --git a/Dependencies/Actions.Library/SystemProcess.cs b/Dependencies/Actions.Library/SystemProcess.cs
new file mode 100644
index 0000000..4faae35
--- /dev/null
+++ b/Dependencies/Actions.Library/SystemProcess.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Actions.Library {
+ public class SystemProcess {
+
+ public class Result {
+ public List StdError = new List();
+ public List StdOut = new List();
+ public int ExitCode;
+
+ public bool Succeeded {
+ get { return ExitCode == 0; }
+ }
+ }
+
+ public static Result Run(string executablePath, string arguments, string? workingDirectory = null) {
+ Result result = new Result();
+
+ Process process = new Process();
+
+ process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => {
+ if(e.Data != null) {
+ result.StdOut.Add(e.Data);
+ Console.WriteLine(e.Data);
+ }
+ };
+
+ process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => {
+ if (e.Data != null) {
+ result.StdError.Add(e.Data);
+ Console.WriteLine(e.Data);
+ }
+ };
+ process.StartInfo.FileName = executablePath;
+
+ process.StartInfo.Arguments = arguments;
+ process.StartInfo.UseShellExecute = false;
+ process.StartInfo.RedirectStandardOutput = true;
+ process.StartInfo.RedirectStandardError = true;
+ process.StartInfo.CreateNoWindow = true;
+
+
+ if (!string.IsNullOrWhiteSpace(workingDirectory)) {
+ process.StartInfo.WorkingDirectory = workingDirectory;
+ }
+
+
+ process.Start();
+ process.BeginOutputReadLine();
+ process.BeginErrorReadLine();
+
+
+ process.WaitForExit();
+ result.ExitCode = process.ExitCode;
+
+ return result;
+ }
+
+ }
+}
diff --git a/Dependencies/Actions.Library/TempDirectory.cs b/Dependencies/Actions.Library/TempDirectory.cs
new file mode 100644
index 0000000..9633f5d
--- /dev/null
+++ b/Dependencies/Actions.Library/TempDirectory.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Actions.Library {
+ public static class TempDirectory {
+
+ public static string New() {
+ var assemblyPath = Assembly.GetEntryAssembly().Location;
+ var assemblyDir = Path.GetDirectoryName(assemblyPath);
+ var tmpDir = Path.Combine(assemblyDir, "Temp");
+ Directory.CreateDirectory(tmpDir);
+
+ int id = 0;
+ while (true) {
+ var dir = Path.Combine(tmpDir, id.ToString());
+ if (!Directory.Exists(dir)) {
+ Directory.CreateDirectory(dir);
+ return dir;
+ }
+ ++id;
+ }
+ }
+ }
+}
diff --git a/Dependencies/Actions.Library/VisualStudio.cs b/Dependencies/Actions.Library/VisualStudio.cs
new file mode 100644
index 0000000..149e079
--- /dev/null
+++ b/Dependencies/Actions.Library/VisualStudio.cs
@@ -0,0 +1,117 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using System.Text.RegularExpressions;
+using Actions.Library;
+
+namespace Actions {
+ public static class VisualStudio {
+ public static class Version {
+ public static readonly string VisualStudio2017 = "14.16";
+ public static readonly string VisualStudio2015 = "14.0";
+ }
+
+ public class VSWhereOutput {
+ public List Instances = new List();
+
+ public class Instance {
+ public System.Text.Json.JsonElement JsonElement;
+
+ public string DisplayName => JsonElement.GetProperty("displayName").GetString();
+ public bool IsLaunchable => JsonElement.GetProperty("isLaunchable").GetBoolean();
+ public bool IsPrerelease => JsonElement.GetProperty("isPrerelease").GetBoolean();
+
+ public string Catalog_ProductLineVersion => JsonElement.GetProperty("catalog").GetProperty("productLineVersion").GetString();
+ public string Catalog_ProductSemanticVersion => JsonElement.GetProperty("catalog").GetProperty("productSemanticVersion").GetString();
+ //
+
+ }
+
+ public VSWhereOutput(System.Text.Json.JsonDocument vswhereJsonOutput) {
+ var cnt = vswhereJsonOutput.RootElement.GetArrayLength();
+ for (int i = 0; i < cnt; i++) {
+ Instance inst = new Instance();
+ inst.JsonElement = vswhereJsonOutput.RootElement[i];
+ Instances.Add(inst);
+ }
+ }
+ }
+
+ public static VSWhereOutput VSWhereQuery(bool latest, bool prerelease) {
+ var programFilesDir = System.Environment.GetEnvironmentVariable("ProgramFiles(x86)");
+ var vsInstalledDir = Path.Combine(programFilesDir, @"Microsoft Visual Studio\Installer\");
+ var vsWherePath = Path.Combine(vsInstalledDir, "vswhere.exe");
+ var vsWhereResult = SystemProcess.Run(vsWherePath, $"-format json -nologo {(latest ? "-latest" : "")} {(prerelease ? "-prerelease" : "")}");
+
+ var json = System.Text.Json.JsonDocument.Parse(string.Join("\n", vsWhereResult.StdOut));
+
+ VSWhereOutput result = new VSWhereOutput(json);
+ return result;
+ }
+
+ public static string FindVisualStudioPath() {
+ var programFilesDir = System.Environment.GetEnvironmentVariable("ProgramFiles(x86)");
+ var vsInstalledDir = Path.Combine(programFilesDir, @"Microsoft Visual Studio\Installer\");
+ var vsWherePath = Path.Combine(vsInstalledDir, "vswhere.exe");
+ var vsWhereResult = SystemProcess.Run(vsWherePath, "-latest -property installationPath");
+ Console.WriteLine("Detected VisualStudio installation path: " + vsWhereResult.StdOut[0]);
+ return vsWhereResult.StdOut[0];
+ }
+ public static string FindVCvarsallBatFile() {
+ var vsInstallPath = FindVisualStudioPath();
+ return Path.Combine(vsInstallPath, @"VC\Auxiliary\Build\vcvarsall.bat");
+ }
+
+ public static void SetupEnvironment(CpuArchitecture targetArch) {
+ var programFilesDir = System.Environment.GetEnvironmentVariable("ProgramFiles(x86)");
+ var vsInstalledDir = Path.Combine(programFilesDir, @"Microsoft Visual Studio\Installer\");
+ var vsWherePath = Path.Combine(vsInstalledDir, "vswhere.exe");
+ var vsWhereResult = SystemProcess.Run(vsWherePath, "-latest -property installationPath");
+ var vsInstallPath = vsWhereResult.StdOut[0];
+
+
+ Console.WriteLine("Setting up build environment");
+
+ var vsEnvBatchFile = FindVCvarsallBatFile();
+
+ var batchFileArgs = "";
+ if (targetArch == CpuArchitecture.x86) {
+ batchFileArgs = "x86";
+ } else if (targetArch == CpuArchitecture.x64) {
+ batchFileArgs = "amd64";
+ } else if (targetArch == CpuArchitecture.armeabi_v7a) {
+ batchFileArgs = "x86_arm";
+ } else if (targetArch == CpuArchitecture.arm64_v8a) {
+ batchFileArgs = "x86_arm64";
+ }
+
+
+ //batchFileArgs += $" -vcvars_ver={Config.VisualStudio.ToolsetVersion}";
+
+
+
+ var vsEnvResult = SystemProcess.Run("cmd", $"/C \"{vsEnvBatchFile}\" {batchFileArgs} > nul 2>&1 && set");
+ Regex r = new Regex("^([^=]+)=(.*)");
+ foreach (var s in vsEnvResult.StdOut) {
+ var m = r.Match(s);
+ if (m.Success) {
+ System.Environment.SetEnvironmentVariable(m.Groups[1].Value, m.Groups[2].Value);
+ }
+ }
+ }
+
+ public static void CleanEnvironment() {
+ var batchFileArgs = " /clean_env";
+ var vsEnvBatchFile = FindVCvarsallBatFile();
+ var vsEnvResult = SystemProcess.Run("cmd", $"/C \"{vsEnvBatchFile}\" {batchFileArgs} > nul 2>&1 && set");
+ Regex r = new Regex("^([^=]+)=(.*)");
+ foreach (var s in vsEnvResult.StdOut) {
+ var m = r.Match(s);
+ if (m.Success) {
+ System.Environment.SetEnvironmentVariable(m.Groups[1].Value, m.Groups[2].Value);
+ }
+ }
+ }
+ }
+}
diff --git a/FetchDependencies.ps1 b/FetchDependencies.ps1
new file mode 100644
index 0000000..8dd184b
--- /dev/null
+++ b/FetchDependencies.ps1
@@ -0,0 +1,155 @@
+
+$APR_VERSION="1.7.5"
+$APU_VERSION="1.6.3"
+$PY3C_VERSION="1.1"
+$SERF_VERSION="1.3.10"
+$ZLIB_VERSION="1.2.8"
+$SQLITE_VERSION="3.39.4"
+
+# Used to construct the SQLite download URL.
+$SQLITE_VERSION_REL_YEAR=2022
+$HTTPD_VERSION="2.4.10"
+$APR_ICONV_VERSION="1.2.1"
+
+$APR="apr-$APR_VERSION"
+$APR_UTIL="apr-util-$APU_VERSION"
+$PY3C="py3c-$PY3C_VERSION"
+$SERF="serf-$SERF_VERSION"
+$ZLIB="zlib-$ZLIB_VERSION"
+
+
+$SQLITE_VERSION_LIST= $SQLITE_VERSION.Split(".")
+$SQLITE=[string]::Format("sqlite-amalgamation-{0}{1}{2}00", $SQLITE_VERSION_LIST[0], $SQLITE_VERSION_LIST[1].PadLeft(2, '0'), $SQLITE_VERSION_LIST[2].PadLeft(2, '0'))
+
+
+$BASEDIR=$PSScriptRoot
+$TEMPDIR="$BASEDIR/temp"
+$APACHE_MIRROR="https://archive.apache.org/dist"
+
+New-Item -ItemType Directory -Force -Path "$TEMPDIR"
+
+function DownloadFile {
+ param ( $Src, $Dst )
+ if(-Not (Test-Path "$Dst" -PathType Leaf)){
+ Invoke-WebRequest "$Src" -OutFile "$Dst"
+ }
+}
+
+function extractTarBz2{
+ param ( $Src )
+ 7z x -y "$Src"
+
+ $srcFile = Get-ChildItem "$Src"
+ $tarFile = $srcFile.BaseName
+ Write-Host "TAR file name: $tarFile"
+ 7z x -y "$tarFile"
+}
+
+
+function extractTarGzip{
+ param ( $Src )
+ 7z x -tgzip -y "$Src"
+
+ $srcFile = Get-ChildItem "$Src"
+ $tarFile = $srcFile.BaseName
+ Write-Host "TAR file name: $tarFile"
+ 7z x -y "$tarFile"
+}
+
+
+function moveDir{
+ param ( $Src, $Dst )
+ if (Test-Path -LiteralPath $Dst) {
+ Remove-Item -LiteralPath $Dst -Recurse
+ }
+ Move-Item -Path $Src -Destination "$Dst" -force
+}
+
+function getApr {
+ Set-Location $TEMPDIR
+
+ DownloadFile -Src "$APACHE_MIRROR/apr/$APR.tar.bz2" -Dst "$APR.tar.bz2"
+ extractTarBz2 -Src "$APR.tar.bz2"
+ moveDir -Src $APR -Dst "$BASEDIR/apr"
+
+ DownloadFile -Src "$APACHE_MIRROR/apr/$APR_UTIL.tar.bz2" -Dst "$APR_UTIL.tar.bz2"
+ extractTarBz2 -Src "$APR_UTIL.tar.bz2"
+ moveDir -Src $APR_UTIL -Dst "$BASEDIR/apr-util"
+
+ Set-Location $BASEDIR
+}
+
+function getZlib() {
+ Set-Location $TEMPDIR
+ DownloadFile -Src "https://github.com/madler/zlib/archive/refs/tags/v$ZLIB_VERSION.tar.gz" -Dst "$ZLIB.tar.gz"
+ extractTarGzip -Src "$ZLIB.tar.gz"
+
+ moveDir -Src $ZLIB -Dst "$BASEDIR/zlib"
+ Set-Location $BASEDIR
+}
+
+function getSqlite() {
+ Set-Location $TEMPDIR
+ Write-Host "!!!! https://www.sqlite.org/$SQLITE_VERSION_REL_YEAR/$SQLITE.zip"
+ DownloadFile -Src "https://www.sqlite.org/$SQLITE_VERSION_REL_YEAR/$SQLITE.zip" -Dst "$SQLITE.zip"
+ Expand-Archive "$SQLITE.zip" -Force -DestinationPath "./"
+ moveDir -Src $SQLITE -Dst "$BASEDIR/sqlite-amalgamation"
+ Set-Location $BASEDIR
+}
+
+function getSerf() {
+ Set-Location $TEMPDIR
+ DownloadFile -Src "https://archive.apache.org/dist/serf/$SERF.tar.bz2" -Dst "$SERF.tar.bz2"
+ extractTarBz2 -Src "$SERF.tar.bz2"
+ moveDir -Src $SERF -Dst "$BASEDIR/serf"
+ Set-Location $BASEDIR
+}
+
+
+function getExpat() {
+ Set-Location $TEMPDIR
+ DownloadFile -Src "https://github.com/libexpat/libexpat/releases/download/R_2_2_9/expat-2.2.9.tar.bz2" -Dst "expat-2.2.9.tar.bz2"
+ extractTarBz2 -Src "expat-2.2.9.tar.bz2"
+ moveDir -Src "expat-2.2.9" -Dst "$BASEDIR/expat"
+ Set-Location $BASEDIR
+}
+
+
+function getOpenssl() {
+ Set-Location $TEMPDIR
+ DownloadFile -Src "https://github.com/openssl/openssl/releases/download/openssl-3.2.3/openssl-3.2.3.tar.gz" -Dst "openssl-3.2.3.tar.gz"
+ extractTarGzip -Src "openssl-3.2.3.tar.gz"
+ moveDir -Src "openssl-3.2.3" -Dst "$BASEDIR/openssl"
+ Set-Location $BASEDIR
+}
+
+
+
+
+# function getPy3C
+# {
+# $py3cdist="v${PY3C_VERSION}.tar.gz"
+# Set-Location $TEMPDIR
+# DownloadFile -Src "https://github.com/encukou/py3c/archive/$py3cdist" -Dst "$py3cdist"
+
+# extractTarBz2 -Src "$py3cdist"
+# moveDir -Src $PY3C -Dst "$BASEDIR/py3c"
+
+# Set-Location $BASEDIR
+# }
+
+#getOpenssl
+#getExpat
+#getSqlite
+#getZlib
+getApr
+getSerf
+
+
+
+
+#getPy3C
+
+
+Remove-Item -LiteralPath $TEMPDIR -Recurse
+Write-Host "Done!"
\ No newline at end of file
diff --git a/README.md b/README.md
index 521a4e5..8b53fc0 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,69 @@
-# BuildSubversion
+# Linux build
+```sh
+apt update -y
+apt install -y autoconf libtool gcc libsqlite3-dev libarchive-dev libz-dev libutf8proc-dev \
+ libserf-dev libapr1-dev libaprutil1-dev libssl-dev libmagic-dev liblz4-dev
+wget https://mirrors.gigenet.com/apache/subversion/subversion-1.14.1.tar.gz
+cd subversion-1.14.1
+./configure ; make
+sudo make install
+```
+# Windows build
+
+## Download expat
+```
+https://sourceforge.net/projects/expat/files/expat_win64/2.6.4/expat-win64bin-2.6.4.exe/download
+Install to E:\SvnDeps\expat
+```
+
+## Build APR
+```bat
+cmake -DCMAKE_INSTALL_PREFIX=e:/SvnDeps/apr -G "Ninja" -DAPR_INSTALL_PRIVATE_H=ON -DCMAKE_BUILD_TYPE=RELEASE -DAPR_BUILD_STATIC=ON ../apr
+ninja
+ninja install
+```
+
+## Build APR-UTIL
+```bat
+cmake -DCMAKE_INSTALL_PREFIX=e:/SvnDeps/apr -G "Ninja" -DAPR_INSTALL_PRIVATE_H=ON -DCMAKE_BUILD_TYPE=RELEASE -DEXPAT_LIBRARY=e:/SvnDeps/expat/Bin/libexpat.lib -DEXPAT_INCLUDE_DIR=e:/SvnDeps/expat/Source/lib -DAPU_HAVE_CRYPTO=ON -DOPENSSL_ROOT_DIR=e:/SvnDeps/openssl ../apr-util
+ninja
+ninja install
+```
+
+## Build ZLib
+```bat
+cmake -G "Ninja" -DCMAKE_INSTALL_PREFIX=e:/SvnDeps/zlib -DCMAKE_BUILD_TYPE=RELEASE ..
+```
+
+## Build Openssl
+```
+Install https://strawberryperl.com/
+Install https://www.nasm.us/ https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/win64/nasm-2.16.03-installer-x64.exe
+perl Configure VC-WIN64A --prefix=e:/SvnDeps/openssl --openssldir=e:/SvnDeps/openssl
+nmake
+nmake install
+```
+
+## Build serf
+```
+scons APR=e:/SvnDeps/apr APU=e:/SvnDeps/apr-util ZLIB=e:/SvnDeps/zlib OPENSSL=e:/SvnDeps/openssl SOURCE_LAYOUT=0 TARGET_ARCH=X64 MSVC_VERSION=2022 PREFIX=e:/SvnDeps/serf
+ -and patch file SConstruct
+```
+
+ ## Build subversion
+```bat
+cmake -G "Ninja" ^
+-DCMAKE_LIBRARY_PATH=e:/SvnDeps/apr;e:/SvnDeps/serf;e:/SvnDeps/zlib -DCMAKE_PREFIX_PATH=e:/SvnDeps/apr;e:/SvnDeps/serf;e:/SvnDeps/zlib ^
+-DPC_EXPAT_LIBRARY_DIRS=e:/SvnDeps/expat/Bin -DPC_EXPAT_INCLUDE_DIRS=e:/SvnDeps/expat/Source/lib ^
+-DSVN_SQLITE_USE_AMALGAMATION=ON ^
+-DSQLITE_AMALGAMATION_DIR=e:/SvnDeps/sqlite-amalgamation ^
+-DCMAKE_BUILD_TYPE=RELEASE ^
+-DSVN_ENABLE_RA_SERF=ON ^
+-DOPENSSL_ROOT_DIR=e:/SvnDeps/openssl ^
+-DSVN_ENABLE_SVNXX=ON ^
+-DSVN_ENABLE_NLS=OFF ^
+-DZLIB_USE_STATIC_LIBS=ON ^
+-DCMAKE_INSTALL_PREFIX=e:/CustomSvnBuild ^
+../subversion
+```