diff --git a/TestAssets/TestProjects/LibraryWithUnresolvablePackageReference/LibraryWithUnresolvablePackageReference.csproj b/TestAssets/TestProjects/LibraryWithUnresolvablePackageReference/LibraryWithUnresolvablePackageReference.csproj new file mode 100755 index 000000000..66c164859 --- /dev/null +++ b/TestAssets/TestProjects/LibraryWithUnresolvablePackageReference/LibraryWithUnresolvablePackageReference.csproj @@ -0,0 +1,11 @@ + + + + netstandard1.5 + + + + + + + diff --git a/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingApp.cs b/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingApp.cs index 5b5e68232..6b2b0f47f 100644 --- a/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingApp.cs +++ b/src/dotnet/commands/dotnet-msbuild/MSBuildForwardingApp.cs @@ -41,10 +41,11 @@ namespace Microsoft.DotNet.Tools.MSBuild { Type loggerType = typeof(MSBuildLogger); - argsToForward = argsToForward.Concat(new[] - { - $"/Logger:{loggerType.FullName},{loggerType.GetTypeInfo().Assembly.Location}" - }); + argsToForward = argsToForward + .Concat(new[] + { + $"/Logger:{loggerType.FullName},{loggerType.GetTypeInfo().Assembly.Location}" + }); } catch (Exception) { @@ -54,7 +55,7 @@ namespace Microsoft.DotNet.Tools.MSBuild _forwardingApp = new ForwardingApp( GetMSBuildExePath(), - _msbuildRequiredParameters.Concat(argsToForward), + _msbuildRequiredParameters.Concat(argsToForward.Select(Escape)), environmentVariables: _msbuildRequiredEnvironmentVariables); } @@ -77,6 +78,13 @@ namespace Microsoft.DotNet.Tools.MSBuild return app.Option("-v|--verbosity", LocalizableStrings.VerbosityOptionDescription, CommandOptionType.SingleValue); } + private static string Escape(string arg) => + // this is a workaround for https://github.com/Microsoft/msbuild/issues/1622 + (arg.StartsWith("/p:RestoreSources=", StringComparison.OrdinalIgnoreCase)) ? + arg.Replace(";", "%3B") + .Replace("://", ":%2F%2F") : + arg; + private static string GetMSBuildExePath() { return Path.Combine( diff --git a/test/dotnet-msbuild.Tests/GivenDotnetMSBuildBuildsProjects.cs b/test/dotnet-msbuild.Tests/GivenDotnetMSBuildBuildsProjects.cs index dde27668c..117f34bae 100644 --- a/test/dotnet-msbuild.Tests/GivenDotnetMSBuildBuildsProjects.cs +++ b/test/dotnet-msbuild.Tests/GivenDotnetMSBuildBuildsProjects.cs @@ -5,18 +5,27 @@ using System; using System.Linq; using System.Linq.Expressions; using System.Reflection; +using System.Runtime.InteropServices; using FluentAssertions; using Microsoft.DotNet.Configurer; using Microsoft.DotNet.Tools.MSBuild; using Microsoft.DotNet.Tools.Test.Utilities; using NuGet.Protocol; using Xunit; +using Xunit.Abstractions; using MSBuildCommand = Microsoft.DotNet.Tools.Test.Utilities.MSBuildCommand; namespace Microsoft.DotNet.Cli.MSBuild.Tests { public class GivenDotnetMSBuildBuildsProjects : TestBase { + private readonly ITestOutputHelper _output; + + public GivenDotnetMSBuildBuildsProjects(ITestOutputHelper output) + { + _output = output; + } + [Fact] public void ItRunsSpecifiedTargetsWithPropertiesCorrectly() { @@ -76,6 +85,37 @@ namespace Microsoft.DotNet.Cli.MSBuild.Tests } } + [Fact] + public void WhenRestoreSourcesStartsWithUnixPathThenHttpsSourceIsParsedCorrectly() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return; + } + + // this is a workaround for https://github.com/Microsoft/msbuild/issues/1622 + var testInstance = TestAssets.Get("LibraryWithUnresolvablePackageReference") + .CreateInstance() + .WithSourceFiles(); + + var root = testInstance.Root; + var somePathThatExists = "/usr/local/bin"; + + var result = new DotnetCommand() + .WithWorkingDirectory(root) + .Execute($"msbuild /p:RestoreSources={somePathThatExists};https://api.nuget.org/v3/index.json /t:restore LibraryWithUnresolvablePackageReference.csproj"); + + _output.WriteLine($"[STDOUT]\n{result.StdOut}\n[STDERR]\n{result.StdErr}"); + + result.Should().Fail(); + + result.StdOut.Should() + .ContainVisuallySameFragment( +@"Feeds used: + /usr/local/bin + https://api.nuget.org/v3/index.json"); + } + [Fact] public void WhenDotnetRunHelpIsInvokedAppArgumentsTextIsIncludedInOutput() { @@ -85,7 +125,7 @@ namespace Microsoft.DotNet.Cli.MSBuild.Tests var result = new TestCommand("dotnet") .WithWorkingDirectory(projectDirectory.Path) .ExecuteWithCapturedOutput("run --help"); - + result.ExitCode.Should().Be(0); result.StdOut.Should().Contain(AppArgumentsText); } diff --git a/test/dotnet.Tests/PackagedCommandTests.cs b/test/dotnet.Tests/PackagedCommandTests.cs index d1f8b0c93..52d58a9e7 100644 --- a/test/dotnet.Tests/PackagedCommandTests.cs +++ b/test/dotnet.Tests/PackagedCommandTests.cs @@ -41,7 +41,6 @@ namespace Microsoft.DotNet.Tests }; } } - public static IEnumerable LibraryDependencyToolArguments { get