Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@ on:

jobs:
build:
# Disable the MSBuild build server and node reuse for every dotnet invocation in CI. The
# solution-reference tests spawn `dotnet build` and an out-of-process MSBuildWorkspace BuildHost;
# sharing persistent MSBuild nodes across these intermittently deadlocks and hangs the test run.
env:
DOTNET_CLI_USE_MSBUILD_SERVER: 0
MSBUILDDISABLENODEREUSE: 1

strategy:
matrix:
platform: [ubuntu-latest, windows-latest]
Expand Down
74 changes: 39 additions & 35 deletions CSharpRepl.Services/CSharpRepl.Services.csproj
Original file line number Diff line number Diff line change
@@ -1,29 +1,37 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Ben.Demystifier" Version="0.4.1" />
<PackageReference Include="ICSharpCode.Decompiler" Version="9.1.0.7988" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0">
<PackageReference Include="ICSharpCode.Decompiler" Version="10.1.0.8386" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="5.3.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="5.0.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Features" Version="5.0.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="5.0.0" />
<PackageReference Include="Microsoft.Build.Locator" Version="1.10.12" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.2" />
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="10.0.2" />
<PackageReference Include="Microsoft.SymbolStore" Version="1.0.706201" />
<PackageReference Include="OpenAI" Version="2.8.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="5.3.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Features" Version="5.3.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="5.3.0" />
<PackageReference Include="Microsoft.Build.Locator" Version="1.11.2" />
<!--
Microsoft.Build.Framework arrives transitively via Microsoft.CodeAnalysis.Workspaces.MSBuild.
We use MSBuildLocator (RegisterDefaults) to load MSBuild from the installed .NET SDK at
runtime, so the MSBuild assemblies must NOT be copied to our output directory (otherwise they
shadow the SDK's and cause version-skew failures). ExcludeAssets="runtime" keeps the
compile-time reference but stops the runtime copy. This is the fix the MSBL001 check requires.
See https://aka.ms/msbuild/locator/diagnostics/MSBL001
-->
<PackageReference Include="Microsoft.Build.Framework" Version="17.11.48" ExcludeAssets="runtime" PrivateAssets="all" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="10.0.8" />
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="10.0.8" />
<PackageReference Include="Microsoft.SymbolStore" Version="1.0.727501" />
<PackageReference Include="OpenAI" Version="2.10.0" />
<PackageReference Include="PrettyPrompt" Version="4.1.1" />
<PackageReference Include="Spectre.Console.Cli" Version="0.53.1" />
<PackageReference Include="System.IO.Abstractions" Version="22.1.0" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.2" />
<PackageReference Include="Spectre.Console.Cli" Version="0.55.0" />
<PackageReference Include="System.IO.Abstractions" Version="22.1.1" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="10.0.8" />
</ItemGroup>

<!--
Expand All @@ -33,35 +41,31 @@
https://github.com/OmniSharp/omnisharp-roslyn/commit/efeafeca33abe1d19659ed8c7ebab1d7c3481188
-->
<ItemGroup>
<PackageReference Include="NuGet.PackageManagement" Version="7.0.1" />
<PackageReference Include="NuGet.Common" Version="7.0.1" PrivateAssets="all" />
<PackageReference Include="NuGet.Commands" Version="7.0.1" PrivateAssets="all" />
<PackageReference Include="NuGet.Credentials" Version="7.0.1" PrivateAssets="all" />
<PackageReference Include="NuGet.Configuration" Version="7.0.1" PrivateAssets="all" />
<PackageReference Include="NuGet.DependencyResolver.Core" Version="7.0.1" PrivateAssets="all" />
<PackageReference Include="NuGet.Frameworks" Version="7.0.1" PrivateAssets="all" ExcludeAssets="runtime" />
<PackageReference Include="NuGet.LibraryModel" Version="7.0.1" PrivateAssets="all" />
<PackageReference Include="NuGet.Packaging.Core" Version="6.9.1" PrivateAssets="all" />
<PackageReference Include="NuGet.Packaging" Version="7.0.1" PrivateAssets="all" />
<PackageReference Include="NuGet.ProjectModel" Version="7.0.1" PrivateAssets="all" />
<PackageReference Include="NuGet.Protocol" Version="7.0.1" PrivateAssets="all" />
<PackageReference Include="NuGet.Versioning" Version="7.0.1" PrivateAssets="all" />
</ItemGroup>

<PackageReference Include="NuGet.PackageManagement" Version="7.6.0" />
<PackageReference Include="NuGet.Common" Version="7.6.0" PrivateAssets="all" />
<PackageReference Include="NuGet.Commands" Version="7.6.0" PrivateAssets="all" />
<PackageReference Include="NuGet.Credentials" Version="7.6.0" PrivateAssets="all" />
<PackageReference Include="NuGet.Configuration" Version="7.6.0" PrivateAssets="all" />
<PackageReference Include="NuGet.DependencyResolver.Core" Version="7.6.0" PrivateAssets="all" />
<PackageReference Include="NuGet.Frameworks" Version="7.6.0" PrivateAssets="all" ExcludeAssets="runtime" />
<PackageReference Include="NuGet.LibraryModel" Version="7.6.0" PrivateAssets="all" />
<PackageReference Include="NuGet.Packaging" Version="7.6.0" PrivateAssets="all" />
<PackageReference Include="NuGet.ProjectModel" Version="7.6.0" PrivateAssets="all" />
<PackageReference Include="NuGet.Protocol" Version="7.6.0" PrivateAssets="all" />
<PackageReference Include="NuGet.Versioning" Version="7.6.0" PrivateAssets="all" />
</ItemGroup>

<ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="CSharpRepl.Tests" />
</ItemGroup>


<ItemGroup>
<EmbeddedResource Include="RuntimeHelper.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="RuntimeHelper.cs" />
</ItemGroup>

<ItemGroup>
<None Update="runtime.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
27 changes: 26 additions & 1 deletion CSharpRepl.Services/Nuget/NugetPackageInstaller.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public async Task<ImmutableArray<PortableExecutableReference>> InstallAsync(
new GatherCache(),
sourceCacheContext);

var primarySourceRepositories = sourceRepositoryProvider.GetRepositories();
var primarySourceRepositories = GetSourceRepositoriesForPackage(sourceRepositoryProvider, settings, packageId);
var packageIdentity = string.IsNullOrEmpty(version)
? await QueryLatestPackageVersion(packageId, nuGetProject, resolutionContext, primarySourceRepositories, cancellationToken)
: new PackageIdentity(packageId, new NuGetVersion(version));
Expand Down Expand Up @@ -264,6 +264,31 @@ private static NuGetPackageManager CreatePackageManager(
return packageManager;
}

/// <summary>
/// Returns the source repositories that should be queried for <paramref name="packageId"/>,
/// honoring any packageSourceMapping configured in NuGet.config.
/// </summary>
private static IReadOnlyList<SourceRepository> GetSourceRepositoriesForPackage(
SourceRepositoryProvider sourceRepositoryProvider,
ISettings settings,
string packageId)
{
var allRepositories = sourceRepositoryProvider.GetRepositories().ToList();

var sourceMapping = PackageSourceMapping.GetPackageSourceMapping(settings);
if (!sourceMapping.IsEnabled)
{
return allRepositories;
}

var mappedSourceNames = sourceMapping.GetConfiguredPackageSources(packageId);
var mappedRepositories = allRepositories
.Where(repo => mappedSourceNames.Contains(repo.PackageSource.Name, StringComparer.OrdinalIgnoreCase))
.ToList();

return mappedRepositories.Count > 0 ? mappedRepositories : allRepositories;
}

private static FolderNuGetProject CreateFolderProject(NuGetFramework targetFramework, string directory)
{
string projectRoot = Path.GetFullPath(directory);
Expand Down
2 changes: 1 addition & 1 deletion CSharpRepl.Services/Roslyn/Scripting/ScriptRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public ScriptRunner(
);
this.scriptOptions = ScriptOptions.Default
.WithMetadataResolver(metadataResolver)
.WithSourceResolver(compilationOptions.SourceReferenceResolver)
.WithSourceResolver(compilationOptions.SourceReferenceResolver ?? SourceFileResolver.Default)
.WithReferences(referenceAssemblyService.LoadedImplementationAssemblies)
.WithAllowUnsafe(compilationOptions.AllowUnsafe)
.WithLanguageVersion(LanguageVersion.Preview)
Expand Down
2 changes: 2 additions & 0 deletions CSharpRepl.Services/SystemConsoleEx.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,7 @@ public sealed class SystemConsoleEx : IConsoleEx

public void Write(IRenderable renderable) => ansiConsole.Write(renderable);

public void WriteAnsi(Action<AnsiWriter> action) => ansiConsole.WriteAnsi(action);

public string? ReadLine() => Console.ReadLine();
}
17 changes: 12 additions & 5 deletions CSharpRepl.Tests/CSharpRepl.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<IsPackable>false</IsPackable>
<!-- Applies test.runsettings automatically to `dotnet test` (disables MSBuild build server /
node reuse to avoid intermittent hangs in the solution-reference tests). -->
<RunSettingsFilePath>$(MSBuildThisFileDirectory)test.runsettings</RunSettingsFilePath>
</PropertyGroup>

<ItemGroup>
Expand All @@ -14,24 +17,28 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.6.0" />
<PackageReference Include="NSubstitute" Version="5.3.0" />
<PackageReference Include="PrettyPrompt" Version="4.1.1" />
<PackageReference Include="Spectre.Console.Testing" Version="0.54.0" />
<PackageReference Include="System.IO.Abstractions.TestingHelpers" Version="22.1.0" />
<PackageReference Include="Spectre.Console.Testing" Version="0.55.2" />
<PackageReference Include="System.IO.Abstractions.TestingHelpers" Version="22.1.1" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.4">
<PackageReference Include="coverlet.collector" Version="10.0.1">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.msbuild" Version="6.0.4">
<PackageReference Include="coverlet.msbuild" Version="10.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<!-- Keep MSBuild assemblies out of the output dir (loaded from the SDK via MSBuildLocator);
arrives transitively through the CSharpRepl.Services project reference.
See https://aka.ms/msbuild/locator/diagnostics/MSBL001 -->
<PackageReference Include="Microsoft.Build.Framework" Version="17.11.48" ExcludeAssets="runtime" PrivateAssets="all" />
</ItemGroup>

<ItemGroup>
Expand Down
2 changes: 2 additions & 0 deletions CSharpRepl.Tests/FakeConsole.cs
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,8 @@ public abstract class FakeConsoleAbstract : IConsoleEx
public void Clear(bool home) => AnsiConsole.Clear(home);
public void Write(IRenderable renderable) => AnsiConsole.Write(renderable);

public void WriteAnsi(Action<AnsiWriter> action) => AnsiConsole.WriteAnsi(action);

public virtual string? ReadLine() => string.Empty;
}

Expand Down
2 changes: 1 addition & 1 deletion CSharpRepl.Tests/StyledStringTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class StyledStringTests
public void SubstringSimple()
{
var redStyle = new Style(foreground: Color.Red);
foreach (var style in new[] { null, redStyle })
foreach (var style in new Style?[] { null, redStyle })
{
var text = new StyledString("abcd", style);

Expand Down
16 changes: 16 additions & 0 deletions CSharpRepl.Tests/test.runsettings
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<RunConfiguration>
<!--
Disable the MSBuild build server and node reuse for the test host. These env vars are
inherited by the child processes the solution-reference tests spawn (the `dotnet build`
subprocess and the out-of-process MSBuildWorkspace BuildHost). Sharing persistent MSBuild
nodes across those processes intermittently deadlocks and hangs the test run.
Keep in sync with the job-level env in .github/workflows/main.yml.
-->
<EnvironmentVariables>
<DOTNET_CLI_USE_MSBUILD_SERVER>0</DOTNET_CLI_USE_MSBUILD_SERVER>
<MSBUILDDISABLENODEREUSE>1</MSBUILDDISABLENODEREUSE>
</EnvironmentVariables>
</RunConfiguration>
</RunSettings>
8 changes: 6 additions & 2 deletions CSharpRepl/CSharpRepl.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,12 @@

<ItemGroup>
<PackageReference Include="PrettyPrompt" Version="4.1.1" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageReference Include="System.Reflection.MetadataLoadContext" Version="10.0.2" />
<PackageReference Include="System.CommandLine" Version="3.0.0-preview.4.26230.115" />
<PackageReference Include="System.Reflection.MetadataLoadContext" Version="10.0.8" />
<!-- Keep MSBuild assemblies out of the output dir; they're loaded from the SDK via
MSBuildLocator at runtime. Required transitively through CSharpRepl.Services.
See https://aka.ms/msbuild/locator/diagnostics/MSBL001 -->
<PackageReference Include="Microsoft.Build.Framework" Version="17.11.48" ExcludeAssets="runtime" PrivateAssets="all" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading
Loading