void CheckPackageStatus(Context context, string packageCacheDir, AndroidPackage pkg, List <AndroidPackage> toDownload)
        {
            Log.StatusLine($"  {context.Characters.Bullet} Installing ", pkg.Component.Name, tailColor: ConsoleColor.White);

            if (File.Exists(pkg.LocalPackagePath))
            {
                if ((RefreshSdk && !IsNdk(pkg.Component)) || (RefreshNdk && IsNdk(pkg.Component)))
                {
                    LogStatus("Reinstall requested, deleting cache", 4, ConsoleColor.Magenta);
                    Utilities.DeleteFile(pkg.LocalPackagePath);
                    toDownload.Add(pkg);
                }
                else
                {
                    Log.DebugLine($"Component '{pkg.Component.Name}' package exists: {pkg.LocalPackagePath}");
                    LogStatus("already downloaded", 4, Log.InfoColor);
                }
            }
            else
            {
                Log.DebugLine($"Component '{pkg.Component.Name}' package not downloaded yet: {pkg.LocalPackagePath}");
                LogStatus("not downloaded yet", 4, ConsoleColor.Magenta);
                toDownload.Add(pkg);
            }
        }
Example #2
0
        async Task <bool> InstallDotNetAsync(Context context, string dotnetPath, string version, bool runtimeOnly = false)
        {
            if (Directory.Exists(Path.Combine(dotnetPath, "sdk", version)) && !runtimeOnly)
            {
                Log.Status($"dotnet SDK version ");
                Log.Status(version, ConsoleColor.Yellow);
                Log.StatusLine(" already installed in: ", Path.Combine(dotnetPath, "sdk", version), tailColor: ConsoleColor.Cyan);
                return(true);
            }

            if (Directory.Exists(Path.Combine(dotnetPath, "shared", "Microsoft.NETCore.App", version)) && runtimeOnly)
            {
                Log.Status($"dotnet runtime version ");
                Log.Status(version, ConsoleColor.Yellow);
                Log.StatusLine(" already installed in: ", Path.Combine(dotnetPath, "shared", "Microsoft.NETCore.App", version), tailColor: ConsoleColor.Cyan);
                return(true);
            }

            Uri    dotnetScriptUrl  = Configurables.Urls.DotNetInstallScript;
            string dotnetScriptPath = Path.Combine(dotnetPath, Path.GetFileName(dotnetScriptUrl.LocalPath));

            if (File.Exists(dotnetScriptPath))
            {
                Utilities.DeleteFile(dotnetScriptPath);
            }

            Log.StatusLine("Downloading dotnet-install...");

            (bool success, ulong size, HttpStatusCode status) = await Utilities.GetDownloadSizeWithStatus(dotnetScriptUrl);

            if (!success)
            {
                if (status == HttpStatusCode.NotFound)
                {
                    Log.ErrorLine("dotnet-install URL not found");
                }
                else
                {
                    Log.ErrorLine("Failed to obtain dotnet-install size. HTTP status code: {status} ({(int)status})");
                }
                return(false);
            }

            DownloadStatus downloadStatus = Utilities.SetupDownloadStatus(context, size, context.InteractiveSession);

            Log.StatusLine($"  {context.Characters.Link} {dotnetScriptUrl}", ConsoleColor.White);
            await Download(context, dotnetScriptUrl, dotnetScriptPath, "dotnet-install", Path.GetFileName(dotnetScriptUrl.LocalPath), downloadStatus);

            if (!File.Exists(dotnetScriptPath))
            {
                Log.ErrorLine($"Download of dotnet-install from {dotnetScriptUrl} failed");
                return(false);
            }

            Log.StatusLine($"Installing dotnet SDK/runtime '{version}'...");

            if (Context.IsWindows)
            {
                var args = new List <string> {
                    "-NoProfile", "-ExecutionPolicy", "unrestricted", "-file", dotnetScriptPath,
                    "-Version", version, "-InstallDir", dotnetPath, "-Verbose"
                };
                if (runtimeOnly)
                {
                    args.AddRange(new string [] { "-Runtime", "dotnet" });
                }

                return(Utilities.RunCommand("powershell.exe", args.ToArray()));
            }
            else
            {
                var args = new List <string> {
                    dotnetScriptPath, "--version", version, "--install-dir", dotnetPath, "--verbose"
                };
                if (runtimeOnly)
                {
                    args.AddRange(new string [] { "-Runtime", "dotnet" });
                }

                return(Utilities.RunCommand("bash", args.ToArray()));
            }
        }
Example #3
0
        protected override async Task <bool> Execute(Context context)
        {
            var dotnetPath = context.Properties.GetRequiredValue(KnownProperties.DotNetPreviewPath);

            dotnetPath = dotnetPath.TrimEnd(new char [] { Path.DirectorySeparatorChar });
            var dotnetTool               = Path.Combine(dotnetPath, "dotnet");
            var dotnetPreviewVersion     = context.Properties.GetRequiredValue(KnownProperties.MicrosoftDotnetSdkInternalPackageVersion);
            var dotnetTestRuntimeVersion = Configurables.Defaults.DotNetTestRuntimeVersion;

            // Delete any custom Microsoft.Android packs that may have been installed by test runs. Other ref/runtime packs will be ignored.
            var packsPath = Path.Combine(dotnetPath, "packs");

            if (Directory.Exists(packsPath))
            {
                foreach (var packToRemove in Directory.EnumerateDirectories(packsPath))
                {
                    var info = new DirectoryInfo(packToRemove);
                    if (info.Name.IndexOf("Android", StringComparison.OrdinalIgnoreCase) != -1)
                    {
                        Log.StatusLine($"Removing Android pack: {packToRemove}");
                        Utilities.DeleteDirectory(packToRemove);
                    }
                }
            }

            // Delete Workload manifests, such as sdk-manifests/6.0.100/Microsoft.NET.Sdk.Android
            var sdkManifestsPath = Path.Combine(dotnetPath, "sdk-manifests");

            if (Directory.Exists(sdkManifestsPath))
            {
                foreach (var versionBand in Directory.EnumerateDirectories(sdkManifestsPath))
                {
                    foreach (var workloadManifestDirectory in Directory.EnumerateDirectories(versionBand))
                    {
                        var info = new DirectoryInfo(workloadManifestDirectory);
                        if (info.Name.IndexOf("Android", StringComparison.OrdinalIgnoreCase) != -1)
                        {
                            Log.StatusLine($"Removing Android manifest directory: {workloadManifestDirectory}");
                            Utilities.DeleteDirectory(workloadManifestDirectory);
                        }
                    }
                }
            }

            // Delete any unnecessary SDKs if they exist.
            var sdkPath = Path.Combine(dotnetPath, "sdk");

            if (Directory.Exists(sdkPath))
            {
                foreach (var sdkToRemove in Directory.EnumerateDirectories(sdkPath).Where(s => new DirectoryInfo(s).Name != dotnetPreviewVersion))
                {
                    Log.StatusLine($"Removing out of date SDK: {sdkToRemove}");
                    Utilities.DeleteDirectory(sdkToRemove);
                }
            }

            // Delete Android template-packs
            var templatePacksPath = Path.Combine(dotnetPath, "template-packs");

            if (Directory.Exists(templatePacksPath))
            {
                foreach (var templateToRemove in Directory.EnumerateFiles(templatePacksPath))
                {
                    var name = Path.GetFileName(templateToRemove);
                    if (name.IndexOf("Android", StringComparison.OrdinalIgnoreCase) != -1)
                    {
                        Log.StatusLine($"Removing Android template: {templateToRemove}");
                        Utilities.DeleteFile(templateToRemove);
                    }
                }
            }

            if (File.Exists(dotnetTool))
            {
                if (!TestDotNetSdk(dotnetTool))
                {
                    Log.WarningLine($"Attempt to run `dotnet --version` failed, reinstalling the SDK.");
                    Utilities.DeleteDirectory(dotnetPath);
                }
            }

            if (!await InstallDotNetAsync(context, dotnetPath, dotnetPreviewVersion))
            {
                Log.ErrorLine($"Installation of dotnet SDK {dotnetPreviewVersion} failed.");
                return(false);
            }

            if (!await InstallDotNetAsync(context, dotnetPath, dotnetTestRuntimeVersion, runtimeOnly: true))
            {
                Log.ErrorLine($"Installation of dotnet runtime {dotnetTestRuntimeVersion} failed.");
                return(false);
            }

            // Install runtime packs associated with the SDK previously installed.
            var packageDownloadProj = Path.Combine(BuildPaths.XamarinAndroidSourceRoot, "build-tools", "xaprepare", "xaprepare", "package-download.proj");
            var logPath             = Path.Combine(Configurables.Paths.BuildBinDir, $"msbuild-{context.BuildTimeStamp}-download-runtime-packs.binlog");

            if (!Utilities.RunCommand(dotnetTool, new string [] { "restore", ProcessRunner.QuoteArgument(packageDownloadProj), ProcessRunner.QuoteArgument($"-bl:{logPath}") }))
            {
                Log.ErrorLine($"dotnet restore {packageDownloadProj} failed.");
                return(false);
            }

            // Copy the WorkloadManifest.* files from the latest Microsoft.NET.Workload.Mono.ToolChain listed in package-download.proj
            var destination = Path.Combine(dotnetPath, "sdk-manifests",
                                           context.Properties.GetRequiredValue(KnownProperties.DotNetPreviewVersionBand),
                                           "microsoft.net.workload.mono.toolchain"
                                           );

            foreach (var file in Directory.GetFiles(Configurables.Paths.MicrosoftNETWorkloadMonoToolChainDir, "WorkloadManifest.*"))
            {
                Utilities.CopyFileToDir(file, destination);
            }

            // Install the microsoft-net-runtime-android workload
            if (!Utilities.RunCommand(dotnetTool, BuildPaths.XamarinAndroidSourceRoot, ignoreEmptyArguments: false, new [] { "workload", "install", "microsoft-net-runtime-android", "--skip-manifest-update", "--verbosity", "diag" }))
            {
                Log.ErrorLine($"dotnet workload install failed.");
                return(false);
            }

            return(true);
        }