in src/BuildScriptGeneratorCli/Commands/PrepareEnvironmentCommand.cs [149:260]
internal override int Execute(IServiceProvider serviceProvider, IConsole console)
{
var logger = serviceProvider.GetRequiredService<ILogger<PrepareEnvironmentCommand>>();
var options = serviceProvider.GetRequiredService<IOptions<BuildScriptGeneratorOptions>>().Value;
var beginningOutputLog = GetBeginningCommandOutputLog();
console.WriteLine(beginningOutputLog);
int exitCode;
using (var timedEvent = logger.LogTimedEvent("EnvSetupCommand"))
{
var context = BuildScriptGenerator.CreateContext(serviceProvider, operationId: null);
IEnumerable<PlatformDetectorResult> detectedPlatforms = null;
if (SkipDetection)
{
console.WriteLine(
$"Skipping platform detection since '{SkipDetectionTemplate}' switch was used...");
var platforms = serviceProvider.GetRequiredService<IEnumerable<IProgrammingPlatform>>();
if (TryValidateSuppliedPlatformsAndVersions(
platforms,
PlatformsAndVersions,
PlatformsAndVersionsFile,
console,
context,
out var results))
{
detectedPlatforms = results;
}
else
{
console.WriteErrorLine(
$"Invalid value for switch '{PlatformsAndVersionsTemplate}'.");
return ProcessConstants.ExitFailure;
}
}
else
{
var detector = serviceProvider.GetRequiredService<DefaultPlatformsInformationProvider>();
var platformInfos = detector.GetPlatformsInfo(context);
if (!platformInfos.Any())
{
return ProcessConstants.ExitFailure;
}
detectedPlatforms = platformInfos.Select(pi => pi.DetectorResult);
}
var environmentScriptProvider = serviceProvider.GetRequiredService<PlatformsInstallationScriptProvider>();
var snippet = environmentScriptProvider.GetBashScriptSnippet(context, detectedPlatforms);
var scriptBuilder = new StringBuilder()
.AppendLine($"#!{FilePaths.Bash}")
.AppendLine("set -e")
.AppendLine();
if (!string.IsNullOrEmpty(snippet))
{
scriptBuilder
.AppendLine("echo")
.AppendLine("echo Setting up environment...")
.AppendLine("echo")
.AppendLine(snippet)
.AppendLine("echo")
.AppendLine("echo Done setting up environment.")
.AppendLine("echo");
}
// Create temporary file to store script
// Get the path where the generated script should be written into.
var tempDirectoryProvider = serviceProvider.GetRequiredService<ITempDirectoryProvider>();
var tempScriptPath = Path.Combine(tempDirectoryProvider.GetTempDirectory(), "setupEnvironment.sh");
var script = scriptBuilder.ToString();
File.WriteAllText(tempScriptPath, script);
timedEvent.AddProperty(nameof(tempScriptPath), tempScriptPath);
if (DebugMode)
{
console.WriteLine($"Temporary script @ {tempScriptPath}:");
console.WriteLine("---");
console.WriteLine(scriptBuilder);
console.WriteLine("---");
}
var environment = serviceProvider.GetRequiredService<IEnvironment>();
var shellPath = environment.GetEnvironmentVariable("BASH") ?? FilePaths.Bash;
exitCode = ProcessHelper.RunProcess(
shellPath,
new[] { tempScriptPath },
options.SourceDir,
(sender, args) =>
{
if (args.Data != null)
{
console.WriteLine(args.Data);
}
},
(sender, args) =>
{
if (args.Data != null)
{
console.Error.WriteLine(args.Data);
}
},
waitTimeForExit: null);
timedEvent.AddProperty("exitCode", exitCode.ToString());
}
return exitCode;
}