// Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; using System.Collections.Generic; using System.Linq; using Microsoft.DotNet.Tools.MSBuild; using Microsoft.DotNet.Tools.Restore; namespace Microsoft.DotNet.Tools { public class RestoringCommand : MSBuildForwardingApp { public RestoreCommand SeparateRestoreCommand { get; } public RestoringCommand( IEnumerable msbuildArgs, IEnumerable parsedArguments, IEnumerable trailingArguments, bool noRestore, string msbuildPath = null) : base(GetCommandArguments(msbuildArgs, parsedArguments, noRestore), msbuildPath) { SeparateRestoreCommand = GetSeparateRestoreCommand(parsedArguments, trailingArguments, noRestore, msbuildPath); } private static IEnumerable GetCommandArguments( IEnumerable msbuildArgs, IEnumerable parsedArguments, bool noRestore) { if (noRestore) { return msbuildArgs; } if (HasArgumentToExcludeFromRestore(parsedArguments)) { return Prepend("/nologo", msbuildArgs); } return Prepend("/restore", msbuildArgs); } private static RestoreCommand GetSeparateRestoreCommand( IEnumerable parsedArguments, IEnumerable trailingArguments, bool noRestore, string msbuildPath) { if (noRestore || !HasArgumentToExcludeFromRestore(parsedArguments)) { return null; } var restoreArguments = parsedArguments .Where(a => !IsExcludedFromRestore(a)) .Concat(trailingArguments); return RestoreCommand.FromArgs( restoreArguments.ToArray(), msbuildPath, noLogo: false); } private static IEnumerable Prepend(string argument, IEnumerable arguments) => new[] { argument }.Concat(arguments); private static bool HasArgumentToExcludeFromRestore(IEnumerable arguments) => arguments.Any(a => IsExcludedFromRestore(a)); private static bool IsExcludedFromRestore(string argument) => argument.StartsWith("/p:TargetFramework=", StringComparison.Ordinal); public override int Execute() { if (SeparateRestoreCommand != null) { int exitCode = SeparateRestoreCommand.Execute(); if (exitCode != 0) { return exitCode; } } return base.Execute(); } } }