From 3729251409f06163245524b53127362111643919 Mon Sep 17 00:00:00 2001 From: Daniel Plaisted Date: Mon, 15 Jun 2026 07:16:43 -0700 Subject: [PATCH 1/8] Avoid possible test timeout due to very verbose output (#54642) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../TruncatingTestOutputHelper.cs | 147 ++++++++++++++++++ ...enDotnetTestBuildsAndRunsTestfromCsproj.cs | 11 +- 2 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.NET.TestFramework/TruncatingTestOutputHelper.cs diff --git a/test/Microsoft.NET.TestFramework/TruncatingTestOutputHelper.cs b/test/Microsoft.NET.TestFramework/TruncatingTestOutputHelper.cs new file mode 100644 index 000000000000..cb8f240d66db --- /dev/null +++ b/test/Microsoft.NET.TestFramework/TruncatingTestOutputHelper.cs @@ -0,0 +1,147 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.NET.TestFramework +{ + /// + /// An wrapper that forwards only a bounded amount of output to an + /// inner helper. The first maxHeadCharacters characters are forwarded as they are written, + /// the most recent maxTailCharacters characters are buffered and emitted by + /// , and everything in between is dropped (replaced with a short note + /// describing how much was omitted). A character budget is used rather than a line count because + /// individual lines can be arbitrarily long. + /// + /// + /// This is useful for commands that intentionally produce an enormous amount of output (for example + /// dotnet test -v diag). Echoing every line to xUnit's output buffer can flush hundreds of + /// megabytes over the test host's single IPC channel when the test completes, which is enough to + /// starve the blame hang-dump collector's inactivity timer and trigger a spurious timeout. + /// + public sealed class TruncatingTestOutputHelper : ITestOutputHelper, IDisposable + { + private const int DefaultHeadCharacters = 50_000; + private const int DefaultTailCharacters = 50_000; + + private readonly ITestOutputHelper _inner; + private readonly int _maxHeadCharacters; + private readonly int _maxTailCharacters; + private readonly object _lock = new(); + private readonly Queue _tail = new(); + + private int _headCharactersWritten; + private bool _headFull; + private int _tailCharacters; + private long _omittedCharacters; + private int _omittedLines; + private bool _flushed; + + public TruncatingTestOutputHelper(ITestOutputHelper inner, int maxHeadCharacters = DefaultHeadCharacters, int maxTailCharacters = DefaultTailCharacters) + { + _inner = inner; + _maxHeadCharacters = maxHeadCharacters; + _maxTailCharacters = maxTailCharacters; + } + + public void WriteLine(string message) + { + message ??= string.Empty; + + lock (_lock) + { + if (!_headFull) + { + int remainingHead = _maxHeadCharacters - _headCharactersWritten; + if (message.Length <= remainingHead) + { + // Still within the head budget: forward immediately so the start of the output + // is preserved even if the test later throws before the tail is flushed. + _inner.WriteLine(message); + _headCharactersWritten += message.Length; + if (_headCharactersWritten >= _maxHeadCharacters) + { + _headFull = true; + } + + return; + } + + // This single message crosses the head budget. Forward only the part that fits in + // the head so one very large WriteLine (e.g. an entire captured StdOut written at + // once) cannot push the whole payload through immediately, then buffer the rest as + // tail below. + if (remainingHead > 0) + { + _inner.WriteLine(message.Substring(0, remainingHead)); + message = message.Substring(remainingHead); + } + + _headFull = true; + } + + // Past the head budget: keep only the most recent characters within the tail budget. + EnqueueTail(message); + } + } + + private void EnqueueTail(string message) + { + // If a single message is on its own larger than the entire tail budget, keep only its + // final portion so the buffered tail can never exceed the bound. + if (_maxTailCharacters > 0 && message.Length > _maxTailCharacters) + { + _omittedCharacters += message.Length - _maxTailCharacters; + message = message.Substring(message.Length - _maxTailCharacters); + } + + _tail.Enqueue(message); + _tailCharacters += message.Length; + + while (_tailCharacters > _maxTailCharacters && _tail.Count > 1) + { + string dropped = _tail.Dequeue(); + _tailCharacters -= dropped.Length; + _omittedCharacters += dropped.Length; + _omittedLines++; + } + } + + public void WriteLine(string format, params object[] args) => WriteLine(string.Format(format, args)); + + /// + /// Emits the buffered tail (see ). Disposing in a using + /// block guarantees the tail is flushed even if the logged command (or a later assertion) + /// throws, without needing an explicit try/finally. + /// + public void Dispose() => WriteBufferedTail(); + + /// + /// Emits the buffered tail (preceded by a note describing any omitted output) to the inner + /// helper. Call this once the command being logged has finished. Safe to call more than once. + /// + public void WriteBufferedTail() + { + lock (_lock) + { + if (_flushed) + { + return; + } + + _flushed = true; + + if (_omittedLines > 0) + { + _inner.WriteLine($"... [{_omittedLines} lines / {_omittedCharacters} characters of output omitted by {nameof(TruncatingTestOutputHelper)}] ..."); + } + + foreach (string line in _tail) + { + _inner.WriteLine(line); + } + + _tail.Clear(); + _tailCharacters = 0; + } + } + } +} diff --git a/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs b/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs index 55288262aea6..9abf21a83397 100644 --- a/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs +++ b/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs @@ -344,8 +344,17 @@ public void ItUsesVerbosityPassedToDefineVerbosityOfConsoleLoggerOfTheTests(stri // Copy and restore VSTestCore project in output directory of project dotnet-vstest.Tests var testProjectDirectory = CopyAndRestoreVSTestDotNetCoreTestApp($"9_{verbosity}"); + // At diagnostic verbosity 'dotnet test -v diag' emits a huge volume of MSBuild output. + // Echoing every line to the xUnit ITestOutputHelper makes the test host flush hundreds of + // megabytes over its single IPC channel when the test completes, which can starve the blame + // hang-dump collector's inactivity timer and trigger a spurious 15-minute timeout. The + // assertions below only inspect the captured StdOut, so for the diag case forward just a + // bounded head and tail of the output to the log instead of the whole firehose. + using var diagOutputLimiter = verbosity == "diag" ? new TruncatingTestOutputHelper(Log) : null; + ITestOutputHelper commandLog = diagOutputLimiter ?? Log; + // Call test - CommandResult result = new DotnetTestCommand(Log, disableNewOutput: true) + CommandResult result = new DotnetTestCommand(commandLog, disableNewOutput: true) .WithWorkingDirectory(testProjectDirectory) .Execute("-v", verbosity); From d1ed80a895f3a425334c2b12be1e7b7b163bc10f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 20:17:56 +0000 Subject: [PATCH 2/8] [release/9.0.1xx] Update dependencies from dotnet/source-build-assets (#54674) [release/9.0.1xx] Update dependencies from dotnet/source-build-assets - Merge branch 'release/9.0.1xx' into darc-release/9.0.1xx-600f1db5-5e69-40f8-ab1b-ddb483a9858e - Merge branch 'release/9.0.1xx' into darc-release/9.0.1xx-600f1db5-5e69-40f8-ab1b-ddb483a9858e --- eng/Version.Details.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 59bc48a81eb5..2c379ec4f3be 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -451,9 +451,9 @@ - + https://github.com/dotnet/source-build-assets - a6ab61fb8be05488dcd26c94dd4ecf3e71d560e2 + 8af4d7484999046095bf7670641b25f2dbb158f0 From f72c3b8c40c8957b62be5a0723bf121e2ec9fc76 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 15:43:59 -0700 Subject: [PATCH 3/8] [automated] Merge branch 'release/8.0.4xx' => 'release/9.0.1xx' (#54671) Co-authored-by: Mirroring Co-authored-by: Noah Gilson Co-authored-by: Marc Paine Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: ProductConstructionServiceProd Co-authored-by: dotnet-maestro[bot] Co-authored-by: Sean Reeser Co-authored-by: DonnaChen888 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Daniel Plaisted Co-authored-by: SimonZhao888 <133954995+SimonZhao888@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Simon Zhao (BEYONDSOFT CONSULTING INC) From d32f471ee6930ccb5da7d4cd510ab10b83c4b384 Mon Sep 17 00:00:00 2001 From: Daniel Plaisted Date: Tue, 16 Jun 2026 17:32:30 -0700 Subject: [PATCH 4/8] Use truncating logger by default for all tests (#54795) --- .../Commands/TestCommand.cs | 34 +++++- .../TruncatingTestOutputHelper.cs | 48 +++++++-- ...enDotnetTestBuildsAndRunsTestfromCsproj.cs | 11 +- .../TruncatingTestOutputHelperTests.cs | 100 ++++++++++++++++++ 4 files changed, 174 insertions(+), 19 deletions(-) create mode 100644 test/dotnet-test.Tests/TruncatingTestOutputHelperTests.cs diff --git a/test/Microsoft.NET.TestFramework/Commands/TestCommand.cs b/test/Microsoft.NET.TestFramework/Commands/TestCommand.cs index 55b8c0181e83..ca0c4cabe7b3 100644 --- a/test/Microsoft.NET.TestFramework/Commands/TestCommand.cs +++ b/test/Microsoft.NET.TestFramework/Commands/TestCommand.cs @@ -20,6 +20,15 @@ public abstract class TestCommand public List EnvironmentToRemove { get; } = new List(); + /// + /// When true, the full command output is echoed to instead of being capped by a + /// . Leave false (the default) so a single very verbose + /// command (e.g. dotnet test -v diag) can't flood xUnit's IPC channel and trigger a + /// spurious hang-dump timeout. Set it (or call ) for + /// tests that need the complete output in the test log. + /// + public bool DisableTruncatedOutputLogging { get; set; } + // These only work via Execute(), not when using GetProcessStartInfo() public Action CommandOutputHandler { get; set; } public Action ProcessStartedHandler { get; set; } @@ -61,6 +70,16 @@ public TestCommand WithTraceOutput() return this; } + /// + /// Opts this command out of bounded output logging so the complete command output is echoed to + /// . See . + /// + public TestCommand WithoutTruncatedOutputLogging() + { + DisableTruncatedOutputLogging = true; + return this; + } + private SdkCommandSpec CreateCommandSpec(IEnumerable args) { var commandSpec = CreateCommand(args); @@ -132,7 +151,20 @@ public virtual CommandResult Execute(IEnumerable args) var result = ((Command)command).Execute(ProcessStartedHandler); - LogCommandResult(Log, result); + // By default, cap how much of the (potentially enormous) command output is echoed to the test + // log so a single very verbose command (e.g. `dotnet test -v diag`) can't flush hundreds of + // megabytes over the test host's IPC channel and trigger a spurious hang-dump timeout. The full + // StdOut/StdErr remain on the returned CommandResult; only the log echo is bounded. Tests that + // need the complete output in the log can opt out with WithoutTruncatedOutputLogging(). + if (DisableTruncatedOutputLogging) + { + LogCommandResult(Log, result); + } + else + { + using var truncatingLog = new TruncatingTestOutputHelper(Log); + LogCommandResult(truncatingLog, result); + } return result; } diff --git a/test/Microsoft.NET.TestFramework/TruncatingTestOutputHelper.cs b/test/Microsoft.NET.TestFramework/TruncatingTestOutputHelper.cs index cb8f240d66db..9745ab0de9d1 100644 --- a/test/Microsoft.NET.TestFramework/TruncatingTestOutputHelper.cs +++ b/test/Microsoft.NET.TestFramework/TruncatingTestOutputHelper.cs @@ -12,10 +12,22 @@ namespace Microsoft.NET.TestFramework /// individual lines can be arbitrarily long. /// /// + /// /// This is useful for commands that intentionally produce an enormous amount of output (for example /// dotnet test -v diag). Echoing every line to xUnit's output buffer can flush hundreds of /// megabytes over the test host's single IPC channel when the test completes, which is enough to /// starve the blame hang-dump collector's inactivity timer and trigger a spurious timeout. + /// + /// + /// Tail eviction is line-oriented: whole buffered lines (oldest first) are dropped to stay within + /// maxTailCharacters, so the retained tail is rounded to line boundaries rather than an exact + /// character count. To avoid the degenerate case where a short final line would otherwise evict a + /// much larger immediately-preceding line (collapsing the tail to almost nothing), the single oldest + /// line that straddles the budget boundary is trimmed from its front instead of dropped — its + /// trailing (most recent) portion is kept. A single larger than the + /// tail budget likewise keeps only its final maxTailCharacters characters. The net effect is + /// that the tail always retains close to maxTailCharacters of the most recent output. + /// /// public sealed class TruncatingTestOutputHelper : ITestOutputHelper, IDisposable { @@ -26,7 +38,7 @@ public sealed class TruncatingTestOutputHelper : ITestOutputHelper, IDisposable private readonly int _maxHeadCharacters; private readonly int _maxTailCharacters; private readonly object _lock = new(); - private readonly Queue _tail = new(); + private readonly LinkedList _tail = new(); private int _headCharactersWritten; private bool _headFull; @@ -93,15 +105,35 @@ private void EnqueueTail(string message) message = message.Substring(message.Length - _maxTailCharacters); } - _tail.Enqueue(message); + _tail.AddLast(message); _tailCharacters += message.Length; - while (_tailCharacters > _maxTailCharacters && _tail.Count > 1) + // Evict the oldest content to stay within the tail budget. Whole lines are dropped while a + // whole line can be removed without going under budget. The single oldest line that straddles + // the boundary is trimmed from its front (keeping its most recent, trailing portion) rather + // than dropped, so a short final line can never discard a much larger recent line and leave + // the tail nearly empty. + while (_tailCharacters > _maxTailCharacters && _tail.Count > 0) { - string dropped = _tail.Dequeue(); - _tailCharacters -= dropped.Length; - _omittedCharacters += dropped.Length; - _omittedLines++; + string oldest = _tail.First!.Value; + int overBy = _tailCharacters - _maxTailCharacters; + + if (oldest.Length <= overBy) + { + _tail.RemoveFirst(); + _tailCharacters -= oldest.Length; + _omittedCharacters += oldest.Length; + _omittedLines++; + } + else + { + // Dropping this whole line would remove more than necessary, discarding recent + // output. Trim just its leading (oldest) characters instead. + _tail.First.Value = oldest.Substring(overBy); + _tailCharacters -= overBy; + _omittedCharacters += overBy; + break; + } } } @@ -129,7 +161,7 @@ public void WriteBufferedTail() _flushed = true; - if (_omittedLines > 0) + if (_omittedCharacters > 0) { _inner.WriteLine($"... [{_omittedLines} lines / {_omittedCharacters} characters of output omitted by {nameof(TruncatingTestOutputHelper)}] ..."); } diff --git a/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs b/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs index 9abf21a83397..55288262aea6 100644 --- a/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs +++ b/test/dotnet-test.Tests/GivenDotnetTestBuildsAndRunsTestfromCsproj.cs @@ -344,17 +344,8 @@ public void ItUsesVerbosityPassedToDefineVerbosityOfConsoleLoggerOfTheTests(stri // Copy and restore VSTestCore project in output directory of project dotnet-vstest.Tests var testProjectDirectory = CopyAndRestoreVSTestDotNetCoreTestApp($"9_{verbosity}"); - // At diagnostic verbosity 'dotnet test -v diag' emits a huge volume of MSBuild output. - // Echoing every line to the xUnit ITestOutputHelper makes the test host flush hundreds of - // megabytes over its single IPC channel when the test completes, which can starve the blame - // hang-dump collector's inactivity timer and trigger a spurious 15-minute timeout. The - // assertions below only inspect the captured StdOut, so for the diag case forward just a - // bounded head and tail of the output to the log instead of the whole firehose. - using var diagOutputLimiter = verbosity == "diag" ? new TruncatingTestOutputHelper(Log) : null; - ITestOutputHelper commandLog = diagOutputLimiter ?? Log; - // Call test - CommandResult result = new DotnetTestCommand(commandLog, disableNewOutput: true) + CommandResult result = new DotnetTestCommand(Log, disableNewOutput: true) .WithWorkingDirectory(testProjectDirectory) .Execute("-v", verbosity); diff --git a/test/dotnet-test.Tests/TruncatingTestOutputHelperTests.cs b/test/dotnet-test.Tests/TruncatingTestOutputHelperTests.cs new file mode 100644 index 000000000000..53963895a331 --- /dev/null +++ b/test/dotnet-test.Tests/TruncatingTestOutputHelperTests.cs @@ -0,0 +1,100 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.DotNet.Cli.Test.Tests +{ + public class TruncatingTestOutputHelperTests + { + private sealed class RecordingOutputHelper : ITestOutputHelper + { + public List Lines { get; } = new(); + + public void WriteLine(string message) => Lines.Add(message); + + public void WriteLine(string format, params object[] args) => Lines.Add(string.Format(format, args)); + } + + private static bool IsOmissionNote(string line) => line.Contains(nameof(TruncatingTestOutputHelper)); + + [Fact] + public void OutputWithinBudgetIsForwardedUnchanged() + { + var inner = new RecordingOutputHelper(); + using (var helper = new TruncatingTestOutputHelper(inner)) + { + helper.WriteLine("first"); + helper.WriteLine("second"); + } + + inner.Lines.Should().Equal("first", "second"); + } + + [Fact] + public void MiddleIsDroppedButHeadAndTailArePreserved() + { + var inner = new RecordingOutputHelper(); + using (var helper = new TruncatingTestOutputHelper(inner, maxHeadCharacters: 5, maxTailCharacters: 5)) + { + helper.WriteLine("aaaaa"); // fills the head + helper.WriteLine("bbbbb"); // middle, should be dropped + helper.WriteLine("ccccc"); // most recent, should be kept as tail + } + + inner.Lines.First().Should().Be("aaaaa"); + inner.Lines.Last().Should().Be("ccccc"); + inner.Lines.Should().ContainSingle(l => IsOmissionNote(l)); + inner.Lines.Should().NotContain("bbbbb"); + } + + [Fact] + public void TailKeepsRecentContentWhenFinalLineIsTiny() + { + // Michael Simons' review edge case: a short final line must not evict a much larger + // immediately-preceding line and leave the tail with essentially nothing. + var inner = new RecordingOutputHelper(); + using (var helper = new TruncatingTestOutputHelper(inner, maxHeadCharacters: 0, maxTailCharacters: 10)) + { + helper.WriteLine(new string('A', 9)); + helper.WriteLine("BBB"); + } + + string tail = string.Concat(inner.Lines.Where(l => !IsOmissionNote(l))); + // The retained tail holds the most recent ~10 characters (the trailing 'A's plus "BBB"), + // not just the tiny final "BBB" (which is what whole-line eviction would have left). + tail.Should().Be(new string('A', 7) + "BBB"); + tail.Length.Should().Be(10); + } + + [Fact] + public void SingleMessageLargerThanBudgetForwardsOnlyHeadAndTailPortions() + { + var inner = new RecordingOutputHelper(); + using (var helper = new TruncatingTestOutputHelper(inner, maxHeadCharacters: 5, maxTailCharacters: 5)) + { + helper.WriteLine(new string('x', 100)); + } + + int forwardedCharacters = inner.Lines.Where(l => !IsOmissionNote(l)).Sum(l => l.Length); + forwardedCharacters.Should().Be(10); // 5 head + 5 tail, not the whole 100 + inner.Lines.Should().ContainSingle(l => IsOmissionNote(l)); + } + + [Fact] + public void WriteBufferedTailIsIdempotent() + { + var inner = new RecordingOutputHelper(); + var helper = new TruncatingTestOutputHelper(inner, maxHeadCharacters: 0, maxTailCharacters: 5); + helper.WriteLine("abcdef"); // 6 chars, trimmed to last 5 + + helper.WriteBufferedTail(); + int countAfterFirstFlush = inner.Lines.Count; + helper.WriteBufferedTail(); + + inner.Lines.Count.Should().Be(countAfterFirstFlush); + inner.Lines.Last().Should().Be("bcdef"); + } + } +} From 3793703c2eece17a679261f4d90ff5fc8e69d070 Mon Sep 17 00:00:00 2001 From: dotnet bot Date: Mon, 6 Jul 2026 13:23:37 -0700 Subject: [PATCH 5/8] Update branding on release/9.0.1xx --- eng/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index 6c72777e64ca..4389ac8b22f1 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -6,7 +6,7 @@ 9 0 1 - 19 + 20 From 379ba8ee8fc774e0da41f5df1a8da5318aac84e0 Mon Sep 17 00:00:00 2001 From: Matt Thalman Date: Fri, 10 Jul 2026 08:54:11 -0500 Subject: [PATCH 6/8] Work around license scan timeout by scanning source-build-assets serially (#55219) --- .../eng/pipelines/vmr-license-scan.yml | 34 ++++++++++++++----- .../Config.cs | 2 ++ .../LicenseScanTests.cs | 8 ++++- ...osoft.DotNet.SourceBuild.SmokeTests.csproj | 4 +++ 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/SourceBuild/content/eng/pipelines/vmr-license-scan.yml b/src/SourceBuild/content/eng/pipelines/vmr-license-scan.yml index 2b1604fec65e..d1e80d232b30 100644 --- a/src/SourceBuild/content/eng/pipelines/vmr-license-scan.yml +++ b/src/SourceBuild/content/eng/pipelines/vmr-license-scan.yml @@ -51,7 +51,6 @@ extends: containers: licenseScanContainer: image: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net9.0-source-build-test-amd64 - options: '--memory=20g' pool: name: NetCore1ESPool-Svc-Internal image: build.azurelinux.3.amd64 @@ -79,20 +78,37 @@ extends: local name="$1" local repoPath="$2" local scanIgnorePatterns="${3:-}" + local scanProcessCount="${4:-}" if [ ! -z "$matrix" ]; then matrix="$matrix," fi - matrix="$matrix \"$name\": { \"repoPath\": \"$repoPath\", \"scanIgnorePatterns\": \"$scanIgnorePatterns\" }" + matrix="$matrix \"$name\": { \"repoPath\": \"$repoPath\", \"scanIgnorePatterns\": \"$scanIgnorePatterns\", \"scanProcessCount\": \"$scanProcessCount\" }" } # Repos whose src/ subdirectories should be scanned as separate jobs. # The repo root is also scanned with --ignore to skip subdirectories covered by sub-scans. splitRepos="source-build-assets" + # Repos that should scan with a reduced number of scancode processes. This is + # independent of splitRepos. Their large, text-heavy content deadlocks scancode's + # multiprocessing pool at the end of a scan, so they are scanned serially (0 disables + # multiprocessing). Other repos use the test's default. Flows through the matrix. + serialScanRepos="source-build-assets" + serialScanProcessCount=0 + + # Returns the scancode --processes value for a repo, or empty to use the test's default. + getScanProcessCount() { + local repoName="$1" + if echo "$serialScanRepos" | grep -qw "$repoName"; then + echo "$serialScanProcessCount" + fi + } + # If the repo name is provided, only scan that repo. if [ ! -z "$specificRepoName" ]; then repoName="$specificRepoName" dir="$vmrSrcDir/$specificRepoName" + scanProcessCount=$(getScanProcessCount "$repoName") if echo "$splitRepos" | grep -qw "$repoName"; then ignorePatterns="" @@ -104,17 +120,18 @@ extends: ignorePatterns="$ignorePatterns " fi ignorePatterns="$ignorePatterns$subdirName" - addMatrixEntry "${repoName}_${subdirName}" "$subdir" + addMatrixEntry "${repoName}_${subdirName}" "$subdir" "" "$scanProcessCount" fi done - addMatrixEntry "$repoName" "$dir" "$ignorePatterns" + addMatrixEntry "$repoName" "$dir" "$ignorePatterns" "$scanProcessCount" else - addMatrixEntry "$repoName" "$dir" + addMatrixEntry "$repoName" "$dir" "" "$scanProcessCount" fi else for dir in "$vmrSrcDir"/*/ do repoName=$(basename "$dir") + scanProcessCount=$(getScanProcessCount "$repoName") if echo "$splitRepos" | grep -qw "$repoName"; then # Root scan: skip subdirectories that are covered by sub-scans @@ -129,12 +146,12 @@ extends: ignorePatterns="$ignorePatterns " fi ignorePatterns="$ignorePatterns$subdirName" - addMatrixEntry "${repoName}_${subdirName}" "$subdir" + addMatrixEntry "${repoName}_${subdirName}" "$subdir" "" "$scanProcessCount" fi done - addMatrixEntry "$repoName" "$dir" "$ignorePatterns" + addMatrixEntry "$repoName" "$dir" "$ignorePatterns" "$scanProcessCount" else - addMatrixEntry "$repoName" "$dir" + addMatrixEntry "$repoName" "$dir" "" "$scanProcessCount" fi done fi @@ -176,6 +193,7 @@ extends: -clp:v=m /p:SmokeTestsLicenseScanPath=$(repoPath) "/p:SourceBuildTestsLicenseScanIgnorePatterns=$(scanIgnorePatterns)" + /p:SourceBuildTestsLicenseScanProcessCount=$(scanProcessCount) /p:SmokeTestsWarnOnLicenseScanDiffs=false /p:TargetRid=linux-x64 /p:PortableRid=linux-x64 diff --git a/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/Config.cs b/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/Config.cs index d1bb01f70783..827533fbba80 100644 --- a/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/Config.cs +++ b/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/Config.cs @@ -23,6 +23,8 @@ internal static class Config public static bool ExcludeOmniSharpTests => bool.TryParse((string)AppContext.GetData(ConfigSwitchPrefix + nameof(ExcludeOmniSharpTests))!, out bool excludeOmniSharpTests) && excludeOmniSharpTests; public static string? LicenseScanPath => (string)AppContext.GetData(ConfigSwitchPrefix + nameof(LicenseScanPath))!; public static string? LicenseScanIgnorePatterns => (string)AppContext.GetData(ConfigSwitchPrefix + nameof(LicenseScanIgnorePatterns))!; + public static int? LicenseScanProcessCount => + int.TryParse((string?)AppContext.GetData(ConfigSwitchPrefix + nameof(LicenseScanProcessCount)), out int processCount) ? processCount : null; public static string? MsftSdkTarballPath => (string)AppContext.GetData(ConfigSwitchPrefix + nameof(MsftSdkTarballPath))!; public static string? PoisonReportPath => (string)AppContext.GetData(ConfigSwitchPrefix + nameof(PoisonReportPath))!; public static string? PrereqsPath => (string)AppContext.GetData(ConfigSwitchPrefix + nameof(PrereqsPath))!; diff --git a/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/LicenseScanTests.cs b/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/LicenseScanTests.cs index 509194f23fce..0a7e65883d62 100644 --- a/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/LicenseScanTests.cs +++ b/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/LicenseScanTests.cs @@ -152,6 +152,12 @@ public void ScanForLicenses() // Indicates how long until a timeout occurs for scanning a given file const int FileScanTimeoutSeconds = 1800; + // Number of parallel processes scancode should use. Large, text-heavy repos can + // deadlock scancode's multiprocessing pool at the end of a scan, so the pipeline + // scans them serially by passing 0. Default to 4 when not specified by the pipeline. + const int DefaultProcessCount = 4; + int processCount = Config.LicenseScanProcessCount ?? DefaultProcessCount; + string scancodeResultsPath = Path.Combine(Config.LogsDirectory, "scancode-results.json"); // Combine default and additional ignore patterns @@ -167,7 +173,7 @@ public void ScanForLicenses() string ignoreOptions = string.Join(" ", allIgnorePatterns.Select(pattern => $"--ignore {pattern}")); ExecuteHelper.ExecuteProcessValidateExitCode( "scancode", - $"--license --processes 4 --timeout {FileScanTimeoutSeconds} --strip-root --only-findings {ignoreOptions} --json-pp {scancodeResultsPath} {Config.LicenseScanPath}", + $"--license --processes {processCount} --timeout {FileScanTimeoutSeconds} --strip-root --only-findings {ignoreOptions} --json-pp {scancodeResultsPath} {Config.LicenseScanPath}", OutputHelper); JsonDocument doc = JsonDocument.Parse(File.ReadAllText(scancodeResultsPath)); diff --git a/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/Microsoft.DotNet.SourceBuild.SmokeTests.csproj b/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/Microsoft.DotNet.SourceBuild.SmokeTests.csproj index 41d7e5dde177..feea579afae5 100644 --- a/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/Microsoft.DotNet.SourceBuild.SmokeTests.csproj +++ b/src/SourceBuild/content/test/Microsoft.DotNet.SourceBuild.SmokeTests/Microsoft.DotNet.SourceBuild.SmokeTests.csproj @@ -75,6 +75,10 @@ Condition="'$(SourceBuildTestsLicenseScanIgnorePatterns)' != ''"> $(SourceBuildTestsLicenseScanIgnorePatterns) + + $(SourceBuildTestsLicenseScanProcessCount) + $(MsftSdkTarballPath) From d8328995da28b8a95c33aabb171c28e5c7682403 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Jul 2026 13:55:22 +0000 Subject: [PATCH 7/8] Reset files to release/9.0.3xx Reset patterns: - global.json - NuGet.config - eng/Version.Details.xml - eng/Versions.props - eng/common/* --- NuGet.config | 11 +- eng/Version.Details.xml | 370 ++++++++++++++++++---------------------- eng/Versions.props | 129 +++++++------- global.json | 6 +- 4 files changed, 242 insertions(+), 274 deletions(-) diff --git a/NuGet.config b/NuGet.config index acac334dd576..680903c31d7e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -26,17 +26,18 @@ - + + - + - + @@ -62,11 +63,11 @@ + + - - diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 2c379ec4f3be..1dde3cc070eb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,18 +1,18 @@ - + https://github.com/dotnet/templating - f5f6eb5420398b365107b9be9e5cb6290626e39f + 2bd479cb5468578fff053d61c5e2a874c8ba6a0a - + https://github.com/dotnet/templating - f5f6eb5420398b365107b9be9e5cb6290626e39f + 2bd479cb5468578fff053d61c5e2a874c8ba6a0a - + https://github.com/dotnet/templating - f5f6eb5420398b365107b9be9e5cb6290626e39f + b73682307aa0128c5edbec94c2e6a070d13ae6bb @@ -59,10 +59,6 @@ https://github.com/dotnet/core-setup 7d57652f33493fa022125b7f63aad0d70c52d810 - - https://github.com/dotnet/emsdk - b634e009d59f72e9254f984a6b89e685955e0eb8 - https://github.com/dotnet/emsdk b634e009d59f72e9254f984a6b89e685955e0eb8 @@ -73,161 +69,161 @@ b634e009d59f72e9254f984a6b89e685955e0eb8 - + https://github.com/dotnet/msbuild - 07da1b9a89da6d00c5a5a6a385cdcebfdfed7110 + 2a0eb78b31025538b6e749ecd80dfabfcfa43a42 - + https://github.com/dotnet/msbuild - 07da1b9a89da6d00c5a5a6a385cdcebfdfed7110 + 2a0eb78b31025538b6e749ecd80dfabfcfa43a42 - + https://github.com/dotnet/msbuild - 07da1b9a89da6d00c5a5a6a385cdcebfdfed7110 + 2a0eb78b31025538b6e749ecd80dfabfcfa43a42 - + https://github.com/dotnet/fsharp - 47d4e3f91e4e5414b6dafbf14288b9c5a798ef99 + 14987c804f33917bf15f4c25e0cd16ecd01807f4 - + https://github.com/dotnet/fsharp - 47d4e3f91e4e5414b6dafbf14288b9c5a798ef99 + 14987c804f33917bf15f4c25e0cd16ecd01807f4 - + https://github.com/dotnet/roslyn - fc52718eccdb37693a40a518b1178b1e23114e68 + 450493a9b4ec6337bced0120e97cb76f4ed783db - + https://github.com/dotnet/roslyn - fc52718eccdb37693a40a518b1178b1e23114e68 + 450493a9b4ec6337bced0120e97cb76f4ed783db - + https://github.com/dotnet/roslyn - fc52718eccdb37693a40a518b1178b1e23114e68 + 450493a9b4ec6337bced0120e97cb76f4ed783db - + https://github.com/dotnet/roslyn - fc52718eccdb37693a40a518b1178b1e23114e68 + 450493a9b4ec6337bced0120e97cb76f4ed783db - + https://github.com/dotnet/roslyn - fc52718eccdb37693a40a518b1178b1e23114e68 + 450493a9b4ec6337bced0120e97cb76f4ed783db - + https://github.com/dotnet/roslyn - fc52718eccdb37693a40a518b1178b1e23114e68 + 450493a9b4ec6337bced0120e97cb76f4ed783db - + https://github.com/dotnet/roslyn - fc52718eccdb37693a40a518b1178b1e23114e68 + 450493a9b4ec6337bced0120e97cb76f4ed783db - + https://github.com/dotnet/roslyn - fc52718eccdb37693a40a518b1178b1e23114e68 + 450493a9b4ec6337bced0120e97cb76f4ed783db - + https://github.com/dotnet/roslyn - fc52718eccdb37693a40a518b1178b1e23114e68 + 450493a9b4ec6337bced0120e97cb76f4ed783db - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://dev.azure.com/devdiv/DevDiv/_git/NuGet-NuGet.Client-Trusted - c92125011405028c945371a89e1a1eb0e735456d + 13eeb32d62833984c9367f8f4e22a120ebc03b47 - + https://github.com/microsoft/vstest - bc9161306b23641b0364b8f93d546da4d48da1eb + 51441adcd6c424ae7315d66ce7e96baf34d70369 - + https://github.com/microsoft/vstest - bc9161306b23641b0364b8f93d546da4d48da1eb + 51441adcd6c424ae7315d66ce7e96baf34d70369 - + https://github.com/microsoft/vstest - bc9161306b23641b0364b8f93d546da4d48da1eb + 51441adcd6c424ae7315d66ce7e96baf34d70369 - + https://github.com/microsoft/vstest - bc9161306b23641b0364b8f93d546da4d48da1eb + 51441adcd6c424ae7315d66ce7e96baf34d70369 @@ -275,119 +271,89 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-wpf a865df6e83bf8b34bbd6802fdcf25c5cdfb05191 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - + https://github.com/dotnet/razor - cff92f3cc3f19a607ddbb7a0cddfbccf87a1c061 + 41f3afd466695ac2460260431537fe4d779ff446 - + https://github.com/dotnet/razor - cff92f3cc3f19a607ddbb7a0cddfbccf87a1c061 + 41f3afd466695ac2460260431537fe4d779ff446 - + https://github.com/dotnet/razor - cff92f3cc3f19a607ddbb7a0cddfbccf87a1c061 + 41f3afd466695ac2460260431537fe4d779ff446 - + https://github.com/dotnet/razor - cff92f3cc3f19a607ddbb7a0cddfbccf87a1c061 + 41f3afd466695ac2460260431537fe4d779ff446 - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b - - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b - - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b - - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b - - - https://github.com/dotnet/test-templates - 0385265f4d0b6413d64aea0223172366a9b9858c + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/test-templates - 307b8f538d83a955d8f6dd909eee41a5555f2f4d + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/test-templates - becc4bd157cd6608b51a5ffe414a5d2de6330272 + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 - - https://github.com/dotnet/test-templates - becc4bd157cd6608b51a5ffe414a5d2de6330272 - - - https://github.com/dotnet/test-templates - 49c9ad01f057b3c6352bbec12b117acc2224493c - - - https://github.com/dotnet/test-templates - 47c90e140b027225b799ca8413af10ee3d5f1126 - - - - https://github.com/dotnet/test-templates - 47c90e140b027225b799ca8413af10ee3d5f1126 - + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 @@ -408,18 +374,18 @@ 63ae81154c50a1cf9287cc47d8351d55b4289e6d - + https://github.com/dotnet/roslyn-analyzers - b9b54526b7908ea519b503196100a34dd2e52374 + 94e92044351f9eb9e75b22f6000647393e36f5b9 - - https://github.com/dotnet/roslyn-analyzers - b9b54526b7908ea519b503196100a34dd2e52374 + + https://github.com/dotnet/roslyn + 450493a9b4ec6337bced0120e97cb76f4ed783db - + https://github.com/dotnet/roslyn-analyzers - b9b54526b7908ea519b503196100a34dd2e52374 + 94e92044351f9eb9e75b22f6000647393e36f5b9 @@ -445,16 +411,16 @@ - + https://github.com/dotnet/source-build-externals - 16c380d1ce5fa0b24e232251c31cb013bbf3365f + 71dbdccd13f28cfd1a35649263b55ebbeab26ee7 - - https://github.com/dotnet/source-build-assets - 8af4d7484999046095bf7670641b25f2dbb158f0 - + + https://github.com/dotnet/source-build-reference-packages + 6092b62b7f35fddbd6bf31e19b2ab64bbe2443ae + https://github.com/dotnet/deployment-tools @@ -539,9 +505,9 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime f2c8152eed158e72950025393fde498c90a57a6b - - https://github.com/dotnet/aspnetcore - 3c5c32a79a7269c8ee7649d0ea1630f115d8400b + + https://dev.azure.com/dnceng/internal/_git/dotnet-aspnetcore + 5edf41b9c09952f18e404ad38e25670991c1b513 https://dev.azure.com/dnceng/internal/_git/dotnet-runtime @@ -589,34 +555,34 @@ - + https://github.com/dotnet/arcade - f843e65cdfc9e9af05d987f2f7f2e6f6a6106eb5 + efce34e9f9f25af27e2b471fbbf8c21f1ac2e318 - + https://github.com/dotnet/arcade - f843e65cdfc9e9af05d987f2f7f2e6f6a6106eb5 + efce34e9f9f25af27e2b471fbbf8c21f1ac2e318 - + https://github.com/dotnet/arcade - f843e65cdfc9e9af05d987f2f7f2e6f6a6106eb5 + efce34e9f9f25af27e2b471fbbf8c21f1ac2e318 - + https://github.com/dotnet/arcade - f843e65cdfc9e9af05d987f2f7f2e6f6a6106eb5 + efce34e9f9f25af27e2b471fbbf8c21f1ac2e318 - + https://github.com/dotnet/arcade - f843e65cdfc9e9af05d987f2f7f2e6f6a6106eb5 + efce34e9f9f25af27e2b471fbbf8c21f1ac2e318 - + https://github.com/dotnet/arcade - f843e65cdfc9e9af05d987f2f7f2e6f6a6106eb5 + efce34e9f9f25af27e2b471fbbf8c21f1ac2e318 - + https://github.com/dotnet/arcade - f843e65cdfc9e9af05d987f2f7f2e6f6a6106eb5 + efce34e9f9f25af27e2b471fbbf8c21f1ac2e318 diff --git a/eng/Versions.props b/eng/Versions.props index 4389ac8b22f1..01e04e02af6e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -5,8 +5,8 @@ 9 0 - 1 - 20 + 3 + 17 @@ -18,15 +18,15 @@ true release - rtm + preview rtm servicing - - + 0 true + true 6.0.1 @@ -35,7 +35,7 @@ 17 36 20 - $([MSBuild]::Add($(VersionFeature), 10)) + $([MSBuild]::Add($(VersionFeature), 13)) <_NET70ILLinkPackVersion>7.0.100-1.23211.1 @@ -76,13 +76,12 @@ 1.1.0-beta.25317.4 - - 9.0.17-servicing.26265.1 + + 9.1.0-preview.1.24555.3 - - - 1.1.0-rtm.25262.1 + + 9.0.17-servicing.26265.1 @@ -124,7 +123,10 @@ 9.0.17 + 4.5.1 + 4.5.5 8.0.5 + 4.5.4 9.0.17 9.0.17 @@ -137,29 +139,29 @@ - 6.12.5-rc.1 - 6.12.5-rc.1 - 6.12.5-rc.1 - 6.12.5-rc.1 - 6.12.5-rc.1 - 6.12.5-rc.1 - 6.12.5-rc.1 - 6.12.5-rc.1 - 6.12.5-rc.1 - 6.12.5-rc.1 - 6.12.5-rc.1 - 6.12.5-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 + 6.14.3-rc.1 - 17.12.0-release-24508-01 - 17.12.0-release-24508-01 - 17.12.0-release-24508-01 + 17.14.1-release-25428-01 + 17.14.1-release-25428-01 + 17.14.1-release-25428-01 - 9.0.0-preview.26226.5 - 3.11.0-beta1.26226.5 + 9.0.0-preview.26255.2 + 3.12.0-beta1.26064.1 @@ -170,8 +172,8 @@ Some .NET Framework tasks and the resolver will need to run in a VS/MSBuild that is older than the very latest, based on what we want the SDK to support. So use a version that matches the version - in minimumMSBuildVersion. Note that MSBuild has started versioning before release so the version we use as the Minimum should be .0 - to ensure we load in VS but the version we build against should be the version of MSBuild that ships in the .0 VS release. + in minimumMSBuildVersion. Note that MSBuild has started versioning before release so the version we use as the Minimum should be .0 + to ensure we load in VS but the version we build against should be the version of MSBuild that ships in the .0 VS release. In these cases, we don't want to use MicrosoftBuildVersion and other associated properties that are updated by the VMR infrastructure. So, we read this version from the 'minimumMSBuildVersion' file in non-source-only cases into MicrosoftBuildMinimumVersion, @@ -180,60 +182,60 @@ At usage sites, either we use MicrosoftBuildMinimumVersion, or MicrosoftBuildVersion in source-only modes. Additionally, set the MinimumVSVersion for the installer UI that's required for targeting NetCurrent --> - 17.12.57 - 17.12.57-preview-26069-01 + 17.14.43 + 17.14.43-servicing-26070-01 17.11.48 17.12 - 9.0.119 + 9.0.317 $(MicrosoftTemplateEngineAbstractionsPackageVersion) $(MicrosoftTemplateEngineAbstractionsPackageVersion) $(MicrosoftTemplateEngineAbstractionsPackageVersion) $(MicrosoftTemplateEngineAbstractionsPackageVersion) - 9.0.119-servicing.26302.8 + 9.0.317-servicing.26358.3 $(MicrosoftTemplateEngineMocksPackageVersion) $(MicrosoftTemplateEngineAbstractionsPackageVersion) $(MicrosoftTemplateEngineMocksPackageVersion) - 12.9.101-beta.25070.7 + 13.9.303-beta.25361.1 - 4.12.0-3.25609.5 - 4.12.0-3.25609.5 - 4.12.0-3.25609.5 - 4.12.0-3.25609.5 - 4.12.0-3.25609.5 - 4.12.0-3.25609.5 - 4.12.0-3.25609.5 - 4.12.0-3.25609.5 + 4.14.0-3.26064.1 + 4.14.0-3.26064.1 + 4.14.0-3.26064.1 + 4.14.0-3.26064.1 + 4.14.0-3.26064.1 + 4.14.0-3.26064.1 + 4.14.0-3.26064.1 + 4.14.0-3.26064.1 - 9.0.18 - 9.0.18-servicing.26310.12 - 9.0.18-servicing.26310.12 - 9.0.18-servicing.26310.12 - 9.0.18-servicing.26310.12 - 9.0.18-servicing.26310.12 - 9.0.18 - 9.0.18 - 9.0.18-servicing.26310.12 - 9.0.18-servicing.26310.12 - 9.0.18-servicing.26310.12 - 9.0.18-servicing.26310.12 - 9.0.18-servicing.26310.12 + 9.0.17 + 9.0.17-servicing.26269.7 + 9.0.17-servicing.26269.7 + 9.0.17-servicing.26269.7 + 9.0.17-servicing.26269.7 + 9.0.17-servicing.26269.7 + 9.0.17 + 9.0.17 + 9.0.17-servicing.26269.7 + 9.0.17-servicing.26269.7 + 9.0.17-servicing.26269.7 + 9.0.17-servicing.26269.7 + 9.0.17-servicing.26269.7 - 9.0.0-preview.26069.1 - 9.0.0-preview.26069.1 - 9.0.0-preview.26069.1 + 9.0.0-preview.26064.2 + 9.0.0-preview.26064.2 + 9.0.0-preview.26064.2 @@ -270,10 +272,10 @@ - 9.0.0-beta.26220.3 - 9.0.0-beta.26220.3 - 9.0.0-beta.26220.3 - 9.0.0-beta.26220.3 + 9.0.0-beta.26301.4 + 9.0.0-beta.26301.4 + 9.0.0-beta.26301.4 + 9.0.0-beta.26301.4 @@ -317,7 +319,6 @@ 15.0.9617 18.0.9617 - 9.0.17-servicing.26258.3 9.0.17 $(MicrosoftNETWorkloadEmscriptenCurrentManifest90100PackageVersion) diff --git a/global.json b/global.json index 50548f9d41c0..1825b53e035e 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "tools": { - "dotnet": "9.0.115", + "dotnet": "9.0.116", "runtimes": { "dotnet": [ "$(VSRedistCommonNetCoreSharedFrameworkx6490PackageVersion)" @@ -17,8 +17,8 @@ "cmake": "latest" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.26220.3", - "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.26220.3", + "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.26301.4", + "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.26301.4", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.DotNet.CMake.Sdk": "9.0.0-beta.24217.1" } From 2840d566f250a3d6bea19ce63a81bf2245d04422 Mon Sep 17 00:00:00 2001 From: Daniel Plaisted Date: Thu, 16 Jul 2026 09:17:40 -0400 Subject: [PATCH 8/8] Use truncating logger (drop unbounded real-time echo) in TestCommand.Execute The 9.0.1xx to 9.0.3xx merge conflict in TestCommand.cs was resolved by keeping BOTH the truncating end-of-run logging (from 9.0.1xx, #54795) and the unbounded real-time per-line echo (Log.WriteLine for every output/error line, from 9.0.3xx). That double-logs command output and defeats the truncation: the real-time echo writes the full output to Log with no cap, re-flooding the test host IPC channel and reintroducing the spurious hang-dump timeouts #54795 was meant to prevent. Resolve to the truncation approach for 9.0.3xx: drop the real-time OnOutputLine/OnErrorLine echo (and the associated 'Executing/exited' display logging) and keep the bounded LogCommandResult via TruncatingTestOutputHelper. Note: main and 10.0.x intentionally keep the real-time echo (a different fix applies there), so the truncation should not flow past 9.0.3xx. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 59570d89-a7e3-4993-baa9-3fb1f442a617 --- .../Commands/TestCommand.cs | 22 +++++-------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/test/Microsoft.NET.TestFramework/Commands/TestCommand.cs b/test/Microsoft.NET.TestFramework/Commands/TestCommand.cs index 8ed65b920318..ca0c4cabe7b3 100644 --- a/test/Microsoft.NET.TestFramework/Commands/TestCommand.cs +++ b/test/Microsoft.NET.TestFramework/Commands/TestCommand.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; @@ -139,29 +139,17 @@ private static bool SuccessOrNotTransientRestoreError(CommandResult result) public virtual CommandResult Execute(IEnumerable args) { - var spec = CreateCommandSpec(args); - - var command = spec + var command = CreateCommandSpec(args) .ToCommand(_doNotEscapeArguments) .CaptureStdOut() .CaptureStdErr(); - command.OnOutputLine(line => - { - Log.WriteLine($"》{line}"); - CommandOutputHandler?.Invoke(line); - }); - - command.OnErrorLine(line => + if (CommandOutputHandler != null) { - Log.WriteLine($"❌{line}"); - }); - - var display = $"dotnet {string.Join(" ", spec.Arguments)}"; + command.OnOutputLine(CommandOutputHandler); + } - Log.WriteLine($"Executing '{display}':"); var result = ((Command)command).Execute(ProcessStartedHandler); - Log.WriteLine($"Command '{display}' exited with exit code {result.ExitCode}."); // By default, cap how much of the (potentially enormous) command output is echoed to the test // log so a single very verbose command (e.g. `dotnet test -v diag`) can't flush hundreds of