Skip to content

Commit

Permalink
Add alias for dotnet workload install command
Browse files Browse the repository at this point in the history
  • Loading branch information
Marusyk authored and devlead committed Aug 23, 2022
1 parent 255feb4 commit cbe7adb
Show file tree
Hide file tree
Showing 5 changed files with 440 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Collections.Generic;
using Cake.Common.Tools.DotNet.Workload.Install;

namespace Cake.Common.Tests.Fixtures.Tools.DotNet.Workload.Install
{
internal sealed class DotNetWorkloadInstallerFixture : DotNetFixture<DotNetWorkloadInstallSettings>
{
public IEnumerable<string> WorkloadIds { get; set; }

protected override void RunTool()
{
var tool = new DotNetWorkloadInstaller(FileSystem, Environment, ProcessRunner, Tools);
tool.Install(WorkloadIds, Settings);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using Cake.Common.Tests.Fixtures.Tools.DotNet.Workload.Install;
using Cake.Testing;
using Xunit;

namespace Cake.Common.Tests.Unit.Tools.DotNet.Workload.Install
{
public sealed class DotNetWorkloadInstallTests
{
public sealed class TheWorkloadInstallMethod
{
[Fact]
public void Should_Throw_If_Process_Was_Not_Started()
{
// Given
var fixture = new DotNetWorkloadInstallerFixture();
fixture.WorkloadIds = new string[] { "maui" };
fixture.GivenProcessCannotStart();

// When
var result = Record.Exception(() => fixture.Run());

// Then
AssertEx.IsCakeException(result, ".NET CLI: Process was not started.");
}

[Fact]
public void Should_Throw_If_Process_Has_A_Non_Zero_Exit_Code()
{
// Given
var fixture = new DotNetWorkloadInstallerFixture();
fixture.WorkloadIds = new string[] { "maui" };
fixture.GivenProcessExitsWithCode(1);

// When
var result = Record.Exception(() => fixture.Run());

// Then
AssertEx.IsCakeException(result, ".NET CLI: Process returned an error (exit code 1).");
}

[Fact]
public void Should_Add_WorkloadIds_Argument()
{
// Given
var fixture = new DotNetWorkloadInstallerFixture();
fixture.WorkloadIds = new string[] { "maui-android", "maui-ios" };

// When
var result = fixture.Run();

// Then
Assert.Equal("workload install maui-android maui-ios", result.Args);
}

[Fact]
public void Should_Throw_If_WorkloadIds_Is_Empty()
{
// Given
var fixture = new DotNetWorkloadInstallerFixture();
fixture.WorkloadIds = new string[] { };

// When
var result = Record.Exception(() => fixture.Run());

// Then
AssertEx.IsArgumentNullException(result, "workloadIds");
}

[Fact]
public void Should_Throw_If_WorkloadIds_Is_Null()
{
// Given
var fixture = new DotNetWorkloadInstallerFixture();
fixture.WorkloadIds = null;

// When
var result = Record.Exception(() => fixture.Run());

// Then
AssertEx.IsArgumentNullException(result, "workloadIds");
}

[Fact]
public void Should_Throw_If_Settings_Are_Null()
{
// Given
var fixture = new DotNetWorkloadInstallerFixture();
fixture.WorkloadIds = new string[] { "maui" };
fixture.Settings = null;
fixture.GivenDefaultToolDoNotExist();

// When
var result = Record.Exception(() => fixture.Run());

// Then
AssertEx.IsArgumentNullException(result, "settings");
}

[Fact]
public void Should_Add_Additional_Arguments()
{
// Given
var fixture = new DotNetWorkloadInstallerFixture();
fixture.WorkloadIds = new string[] { "maui" };
fixture.Settings.ConfigFile = "./nuget.config";
fixture.Settings.DisableParallel = true;
fixture.Settings.IgnoreFailedSources = true;
fixture.Settings.IncludePreviews = true;
fixture.Settings.Interactive = true;
fixture.Settings.NoCache = true;
fixture.Settings.SkipManifestUpdate = true;
fixture.Settings.Source.Add("http://www.nuget.org/api/v2/package");
fixture.Settings.Source.Add("http://www.symbolserver.org/");
fixture.Settings.TempDir = "./src/project";
fixture.Settings.Verbosity = Common.Tools.DotNet.DotNetVerbosity.Diagnostic;

// When
var result = fixture.Run();

// Then
var expected = "workload install maui --configfile \"/Working/nuget.config\" --disable-parallel --ignore-failed-sources --include-previews --interactive --no-cache --skip-manifest-update";
expected += " --source \"http://www.nuget.org/api/v2/package\" --source \"http://www.symbolserver.org/\" --temp-dir \"/Working/src/project\" --verbosity diagnostic";
Assert.Equal(expected, result.Args);
}
}
}
}
98 changes: 98 additions & 0 deletions src/Cake.Common/Tools/DotNet/DotNetAliases.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
using Cake.Common.Tools.DotNet.Test;
using Cake.Common.Tools.DotNet.Tool;
using Cake.Common.Tools.DotNet.VSTest;
using Cake.Common.Tools.DotNet.Workload.Install;
using Cake.Common.Tools.DotNet.Workload.Search;
using Cake.Common.Tools.DotNet.Workload.Uninstall;
using Cake.Common.Tools.DotNetCore.Build;
Expand Down Expand Up @@ -1977,5 +1978,102 @@ public static void DotNetWorkloadUninstall(this ICakeContext context, IEnumerabl
var uninstaller = new DotNetWorkloadUninstaller(context.FileSystem, context.Environment, context.ProcessRunner, context.Tools);
uninstaller.Uninstall(workloadIds);
}

/// <summary>
/// Installs a specified optional workload.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="workloadId">The workload ID to install.</param>
/// <example>
/// <code>
/// DotNetWorkloadInstall("maui");
/// </code>
/// </example>
[CakeMethodAlias]
[CakeAliasCategory("Workload")]
[CakeNamespaceImport("Cake.Common.Tools.DotNet.Workload.Install")]
public static void DotNetWorkloadInstall(this ICakeContext context, string workloadId)
{
context.DotNetWorkloadInstall(workloadId, null);
}

/// <summary>
/// Installs a specified optional workload.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="workloadId">The workload ID to install.</param>
/// <param name="settings">The settings.</param>
/// <example>
/// <code>
/// var settings = new DotNetWorkloadInstallSettings
/// {
/// IncludePreviews = true,
/// NoCache = true
/// };
///
/// DotNetWorkloadInstall("maui", settings);
/// </code>
/// </example>
[CakeMethodAlias]
[CakeAliasCategory("Workload")]
[CakeNamespaceImport("Cake.Common.Tools.DotNet.Workload.Install")]
public static void DotNetWorkloadInstall(this ICakeContext context, string workloadId, DotNetWorkloadInstallSettings settings)
{
context.DotNetWorkloadInstall(new string[] { workloadId }, settings);
}

/// <summary>
/// Installs one or more optional workloads.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="workloadIds">The workload ID or multiple IDs to install.</param>
/// <example>
/// <code>
/// DotNetWorkloadInstall(new string[] { "maui", "maui-desktop", "maui-mobile" });
/// </code>
/// </example>
[CakeMethodAlias]
[CakeAliasCategory("Workload")]
[CakeNamespaceImport("Cake.Common.Tools.DotNet.Workload.Install")]
public static void DotNetWorkloadInstall(this ICakeContext context, IEnumerable<string> workloadIds)
{
context.DotNetWorkloadInstall(workloadIds, null);
}

/// <summary>
/// Installs one or more optional workloads.
/// </summary>
/// <param name="context">The context.</param>
/// <param name="workloadIds">The workload ID or multiple IDs to install.</param>
/// <param name="settings">The settings.</param>
/// <example>
/// <code>
/// var settings = new DotNetWorkloadInstallSettings
/// {
/// IncludePreviews = true,
/// NoCache = true
/// };
///
/// DotNetWorkloadInstall(new string[] { "maui", "maui-desktop", "maui-mobile" }, settings);
/// </code>
/// </example>
[CakeMethodAlias]
[CakeAliasCategory("Workload")]
[CakeNamespaceImport("Cake.Common.Tools.DotNet.Workload.Install")]
public static void DotNetWorkloadInstall(this ICakeContext context, IEnumerable<string> workloadIds, DotNetWorkloadInstallSettings settings)
{
if (context is null)
{
throw new ArgumentNullException(nameof(context));
}

if (settings == null)
{
settings = new DotNetWorkloadInstallSettings();
}

var installer = new DotNetWorkloadInstaller(context.FileSystem, context.Environment, context.ProcessRunner, context.Tools);
installer.Install(workloadIds, settings);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Collections.Generic;
using Cake.Core.IO;

namespace Cake.Common.Tools.DotNet.Workload.Install
{
/// <summary>
/// Contains settings used by <see cref="DotNetWorkloadInstaller" />.
/// </summary>
public sealed class DotNetWorkloadInstallSettings : DotNetSettings
{
/// <summary>
/// Gets or sets the NuGet configuration file (nuget.config) to use.
/// </summary>
public FilePath ConfigFile { get; set; }

/// <summary>
/// Gets or sets a value indicating whether to prevent restoring multiple projects in parallel.
/// </summary>
public bool DisableParallel { get; set; }

/// <summary>
/// Gets or sets a value indicating whether to treat package source failures as warnings.
/// </summary>
public bool IgnoreFailedSources { get; set; }

/// <summary>
/// Gets or sets a value indicating whether to allow prerelease workload manifests.
/// </summary>
public bool IncludePreviews { get; set; }

/// <summary>
/// Gets or sets a value indicating whether to allow the command to stop and wait for user input or action.
/// For example, to complete authentication.
/// </summary>
public bool Interactive { get; set; }

/// <summary>
/// Gets or sets a value indicating whether to do not cache packages and http requests.
/// </summary>
public bool NoCache { get; set; }

/// <summary>
/// Gets or sets a value indicating whether to skip updating the workload manifests.
/// The workload manifests define what assets and versions need to be installed for each workload.
/// </summary>
public bool SkipManifestUpdate { get; set; }

/// <summary>
/// Gets or sets the URI of the NuGet package source to use.
/// This setting overrides all of the sources specified in the nuget.config files.
/// </summary>
public ICollection<string> Source { get; set; } = new List<string>();

/// <summary>
/// Gets or sets the temporary directory used to download and extract NuGet packages (must be secure).
/// </summary>
public DirectoryPath TempDir { get; set; }
}
}
Loading

0 comments on commit cbe7adb

Please sign in to comment.