Added builder dependency for repos.

This commit is contained in:
José Pedro 2018-05-14 20:51:23 +01:00
parent 4d1ace8f0a
commit 5dfb772d5d
No known key found for this signature in database
GPG key ID: B8247B9301707B83
5 changed files with 127 additions and 19 deletions

View file

@ -16,6 +16,8 @@ namespace Cosmos.Build.Builder
private IMSBuildService _msBuildService;
private ISetupInstance2 _visualStudioInstance;
private readonly string _cosmosDir;
public CosmosBuildDefinition(
IInnoSetupService innoSetupService,
IMSBuildService msBuildService,
@ -24,10 +26,18 @@ namespace Cosmos.Build.Builder
_innoSetupService = innoSetupService;
_msBuildService = msBuildService;
_visualStudioInstance = visualStudioInstance;
_cosmosDir = Path.GetFullPath(Directory.GetCurrentDirectory());
if (!Directory.Exists(Path.Combine(_cosmosDir, "source", "Cosmos.Build.Builder")))
{
_cosmosDir = Path.GetFullPath(Path.Combine(_cosmosDir, "..", "..", "..", "..", ".."));
}
}
public IEnumerable<IDependency> GetDependencies()
{
yield return new ReposDependency(_cosmosDir);
yield return new VisualStudioDependency(_visualStudioInstance);
yield return new VisualStudioWorkloadsDependency(_visualStudioInstance);
yield return new InnoSetupDependency(_innoSetupService);
@ -59,24 +69,17 @@ namespace Cosmos.Build.Builder
}
}
var cosmosDir = Path.GetFullPath(Directory.GetCurrentDirectory());
var il2cpuDir = Path.GetFullPath(Path.Combine(_cosmosDir, "..", "IL2CPU"));
var xsharpDir = Path.GetFullPath(Path.Combine(_cosmosDir, "..", "XSharp"));
if (!Directory.Exists(Path.Combine(cosmosDir, "source", "Cosmos.Build.Builder")))
{
cosmosDir = Path.GetFullPath(Path.Combine(cosmosDir, "..", "..", "..", "..", ".."));
}
var il2cpuDir = Path.GetFullPath(Path.Combine(cosmosDir, "..", "IL2CPU"));
var xsharpDir = Path.GetFullPath(Path.Combine(cosmosDir, "..", "XSharp"));
var cosmosSourceDir = Path.Combine(cosmosDir, "source");
var cosmosSourceDir = Path.Combine(_cosmosDir, "source");
var il2cpuSourceDir = Path.Combine(il2cpuDir, "source");
var buildSlnPath = Path.Combine(cosmosDir, "Build.sln");
var buildSlnPath = Path.Combine(_cosmosDir, "Build.sln");
var il2cpuSlnPath = Path.Combine(il2cpuDir, "IL2CPU.sln");
var xsharpSlnPath = Path.Combine(xsharpDir, "XSharp.sln");
var vsipDir = Path.Combine(cosmosDir, "Build", "VSIP");
var vsipDir = Path.Combine(_cosmosDir, "Build", "VSIP");
if (Directory.Exists(vsipDir))
{
@ -136,7 +139,7 @@ namespace Cosmos.Build.Builder
yield return new PackTask(_msBuildService, projectPath, packagesDir);
}
var cosmosSetupDir = Path.Combine(cosmosDir, "setup");
var cosmosSetupDir = Path.Combine(_cosmosDir, "setup");
// Create Setup
@ -159,7 +162,7 @@ namespace Cosmos.Build.Builder
using (var xKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Cosmos"))
{
xKey.SetValue("DevKit", cosmosDir);
xKey.SetValue("DevKit", _cosmosDir);
}
// Launch VS
@ -169,7 +172,7 @@ namespace Cosmos.Build.Builder
var vsInstance = _visualStudioInstance;
var vsPath = Path.Combine(vsInstance.GetInstallationPath(), "Common7", "IDE", "devenv.exe");
var kernelSlnPath = Path.Combine(cosmosDir, "Kernel.sln");
var kernelSlnPath = Path.Combine(_cosmosDir, "Kernel.sln");
yield return new StartProcessTask(vsPath, kernelSlnPath, "Visual Studio (Kernel.sln)");
}

View file

@ -47,6 +47,11 @@ namespace Cosmos.Build.Builder.Dependencies
var process = Process.Start(setupFilePath);
await Task.Run((Action)process.WaitForExit, cancellationToken).ConfigureAwait(false);
if (process.ExitCode != 0)
{
throw new Exception("The process failed to execute!");
}
}
}
}

View file

@ -0,0 +1,90 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace Cosmos.Build.Builder.Dependencies
{
internal class ReposDependency : IDependency
{
public string Name => "Repos: IL2CPU and XSharp";
private readonly string _cosmosDir;
private readonly IEnumerable<Repo> _repos;
public ReposDependency(string cosmosDir)
{
_cosmosDir = cosmosDir;
_repos = new List<Repo>()
{
new Repo(
Path.GetFullPath(Path.Combine(cosmosDir, "..", "IL2CPU")),
"https://github.com/CosmosOS/IL2CPU"),
new Repo(
Path.GetFullPath(Path.Combine(cosmosDir, "..", "XSharp")),
"https://github.com/CosmosOS/XSharp")
};
}
public Task<bool> IsInstalledAsync(CancellationToken cancellationToken)
{
return Task.FromResult(_repos.All(r => Directory.Exists(r.LocalPath)));
}
public Task InstallAsync(CancellationToken cancellationToken)
{
var usesGit = Directory.Exists(Path.Combine(_cosmosDir, ".git"));
return Task.WhenAll(_repos
.Where(r => !Directory.Exists(r.LocalPath))
.Select(r => DownloadRepoAsync(r, usesGit, cancellationToken)));
}
private async Task DownloadRepoAsync(Repo repo, bool useGit, CancellationToken cancellationToken)
{
if (useGit)
{
var process = Process.Start("git", $"clone \"{repo.Url}.git\" \"{repo.LocalPath}\"");
await Task.Run((Action)process.WaitForExit).ConfigureAwait(false);
if (process.ExitCode != 0)
{
throw new Exception("The process failed to execute!");
}
}
else
{
using (var httpClient = new HttpClient())
{
var uri = new Uri(new Uri($"{repo.Url}/"), "archive/master.zip");
var httpMessage = await httpClient.GetAsync(uri, cancellationToken).ConfigureAwait(false);
var zipStream = await httpMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);
var zipArchive = new ZipArchive(zipStream);
var tempPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
zipArchive.ExtractToDirectory(tempPath);
Directory.Move(Directory.GetFileSystemEntries(tempPath).Single(), repo.LocalPath);
}
}
}
private class Repo
{
public string LocalPath { get; }
public string Url { get; }
public Repo(string localPath, string url)
{
LocalPath = localPath;
Url = url;
}
}
}
}

View file

@ -32,7 +32,7 @@ namespace Cosmos.Build.Builder.Dependencies
return Task.FromResult(false);
}
public Task InstallAsync(CancellationToken cancellationToken)
public async Task InstallAsync(CancellationToken cancellationToken)
{
var vsInstallerPath = Environment.ExpandEnvironmentVariables(
@"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vs_installershell.exe");
@ -41,7 +41,12 @@ namespace Cosmos.Build.Builder.Dependencies
var args = $"update --passive --norestart --wait --installPath \"{vsInstancePath}\"";
var process = Process.Start(vsInstallerPath, args);
return Task.Run((Action)process.WaitForExit, cancellationToken);
await Task.Run((Action)process.WaitForExit, cancellationToken).ConfigureAwait(false);
if (process.ExitCode != 0)
{
throw new Exception("The process failed to execute!");
}
}
}
}

View file

@ -33,7 +33,7 @@ namespace Cosmos.Build.Builder.Dependencies
return Task.FromResult(RequiredPackages.All(p => IsPackageInstalled(p)));
}
public Task InstallAsync(CancellationToken cancellationToken)
public async Task InstallAsync(CancellationToken cancellationToken)
{
var vsInstallerPath = Environment.ExpandEnvironmentVariables(
@"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vs_installershell.exe");
@ -52,7 +52,12 @@ namespace Cosmos.Build.Builder.Dependencies
}
var process = Process.Start(vsInstallerPath, args);
return Task.Run((Action)process.WaitForExit, cancellationToken);
await Task.Run((Action)process.WaitForExit, cancellationToken).ConfigureAwait(false);
if (process.ExitCode != 0)
{
throw new Exception("The process failed to execute!");
}
}
private bool IsPackageInstalled(string packageId) =>