diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 00000000000..e6e7f272b6d
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,14 @@
+# Users referenced in this file will automatically be requested as reviewers for PRs that modify the given paths.
+# See https://help.github.com/articles/about-code-owners/
+
+/eng/SourceBuild* @dotnet/source-build-internal
+/eng/ @dotnet/kitten
+/.github/ @dotnet/kitten
+/global.json @dotnet/kitten
+/.exp-insertions.yml @dotnet/kitten
+/.opt-prof.yml @dotnet/kitten
+/.vsts-dotnet-ci.yml @dotnet/kitten
+/.vsts-dotnet.yml @dotnet/kitten
+/NuGet.config @dotnet/kitten
+/Directory.Build* @dotnet/kitten
+/.git* @dotnet/kitten
\ No newline at end of file
diff --git a/.vsts-dotnet.yml b/.vsts-dotnet.yml
index ea163193844..1c28b3bf2ca 100644
--- a/.vsts-dotnet.yml
+++ b/.vsts-dotnet.yml
@@ -94,8 +94,6 @@ stages:
value: 'int.main'
- name: VisualStudio.DropName
value: Products/$(System.TeamProject)/$(Build.Repository.Name)/$(Build.SourceBranchName)/$(Build.BuildNumber)
- - name: NUGET_PACKAGES
- value:
steps:
- task: NuGetToolInstaller@0
diff --git a/documentation/wiki/ChangeWaves.md b/documentation/wiki/ChangeWaves.md
index 6282a09e7b1..ec84d18521a 100644
--- a/documentation/wiki/ChangeWaves.md
+++ b/documentation/wiki/ChangeWaves.md
@@ -29,6 +29,7 @@ A wave of features is set to "rotate out" (i.e. become standard functionality) t
- [Cache SDK resolver data process-wide](https://github.com/dotnet/msbuild/pull/9335)
- [Target parameters will be unquoted](https://github.com/dotnet/msbuild/pull/9452), meaning the ';' symbol in the parameter target name will always be treated as separator
- [Change Version switch output to finish with a newline](https://github.com/dotnet/msbuild/pull/9485)
+- [Load Microsoft.DotNet.MSBuildSdkResolver into default load context (MSBuild.exe only)](https://github.com/dotnet/msbuild/pull/9439)
### 17.8
- [[RAR] Don't do I/O on SDK-provided references](https://github.com/dotnet/msbuild/pull/8688)
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 0ef9e3d1005..dcc55327fcf 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -58,14 +58,14 @@
-
+
https://github.com/dotnet/arcade
- 1d451c32dda2314c721adbf8829e1c0cd4e681ff
+ efc3da96e5ac110513e92ebd9ef87c73f44d8540
-
+
https://github.com/dotnet/xliff-tasks
- 194f32828726c3f1f63f79f3dc09b9e99c157b11
+ 73f0850939d96131c28cf6ea6ee5aacb4da0083a
@@ -77,9 +77,9 @@
8e4ab418a8f9703f7dfe3a66adc9b3876ef9382f
-
+
https://github.com/dotnet/arcade
- 1d451c32dda2314c721adbf8829e1c0cd4e681ff
+ efc3da96e5ac110513e92ebd9ef87c73f44d8540
diff --git a/eng/Versions.props b/eng/Versions.props
index 0db7cec0a12..74bcb7f9d65 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -47,7 +47,7 @@
Otherwise, this version of dotnet will not be installed and the build will error out. -->
$([System.Text.RegularExpressions.Regex]::Match($([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)..\global.json')), '"dotnet": "([^"]*)"').Groups.get_Item(1))
4.2.0-1.22102.8
- 8.0.0-beta.23463.1
+ 8.0.0-beta.23580.1
7.0.0
6.0.0
4.9.0-3.23608.9
diff --git a/eng/common/darc-init.ps1 b/eng/common/darc-init.ps1
index 435e7641341..8fda30bdce2 100644
--- a/eng/common/darc-init.ps1
+++ b/eng/common/darc-init.ps1
@@ -1,6 +1,6 @@
param (
$darcVersion = $null,
- $versionEndpoint = 'https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc-version?api-version=2019-01-16',
+ $versionEndpoint = 'https://maestro.dot.net/api/assets/darc-version?api-version=2019-01-16',
$verbosity = 'minimal',
$toolpath = $null
)
diff --git a/eng/common/darc-init.sh b/eng/common/darc-init.sh
index 84c1d0cc2e7..c305ae6bd77 100755
--- a/eng/common/darc-init.sh
+++ b/eng/common/darc-init.sh
@@ -2,7 +2,7 @@
source="${BASH_SOURCE[0]}"
darcVersion=''
-versionEndpoint='https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc-version?api-version=2019-01-16'
+versionEndpoint='https://maestro.dot.net/api/assets/darc-version?api-version=2019-01-16'
verbosity='minimal'
while [[ $# > 0 ]]; do
diff --git a/eng/common/post-build/add-build-to-channel.ps1 b/eng/common/post-build/add-build-to-channel.ps1
index de2d957922a..49938f0c89f 100644
--- a/eng/common/post-build/add-build-to-channel.ps1
+++ b/eng/common/post-build/add-build-to-channel.ps1
@@ -2,7 +2,7 @@ param(
[Parameter(Mandatory=$true)][int] $BuildId,
[Parameter(Mandatory=$true)][int] $ChannelId,
[Parameter(Mandatory=$true)][string] $MaestroApiAccessToken,
- [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com',
+ [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro.dot.net',
[Parameter(Mandatory=$false)][string] $MaestroApiVersion = '2019-01-16'
)
diff --git a/eng/common/post-build/publish-using-darc.ps1 b/eng/common/post-build/publish-using-darc.ps1
index 8508397d776..1e779fec4dd 100644
--- a/eng/common/post-build/publish-using-darc.ps1
+++ b/eng/common/post-build/publish-using-darc.ps1
@@ -3,7 +3,7 @@ param(
[Parameter(Mandatory=$true)][int] $PublishingInfraVersion,
[Parameter(Mandatory=$true)][string] $AzdoToken,
[Parameter(Mandatory=$true)][string] $MaestroToken,
- [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com',
+ [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro.dot.net',
[Parameter(Mandatory=$true)][string] $WaitPublishingFinish,
[Parameter(Mandatory=$false)][string] $ArtifactsPublishingAdditionalParameters,
[Parameter(Mandatory=$false)][string] $SymbolPublishingAdditionalParameters
diff --git a/eng/common/post-build/trigger-subscriptions.ps1 b/eng/common/post-build/trigger-subscriptions.ps1
index 55dea518ac5..ac9a95778fc 100644
--- a/eng/common/post-build/trigger-subscriptions.ps1
+++ b/eng/common/post-build/trigger-subscriptions.ps1
@@ -2,7 +2,7 @@ param(
[Parameter(Mandatory=$true)][string] $SourceRepo,
[Parameter(Mandatory=$true)][int] $ChannelId,
[Parameter(Mandatory=$true)][string] $MaestroApiAccessToken,
- [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com',
+ [Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro.dot.net',
[Parameter(Mandatory=$false)][string] $MaestroApiVersion = '2019-01-16'
)
diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1
index 6c4ac6fec1a..73828dd30d3 100644
--- a/eng/common/sdk-task.ps1
+++ b/eng/common/sdk-task.ps1
@@ -64,7 +64,7 @@ try {
$GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty
}
if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) {
- $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "17.6.0-2" -MemberType NoteProperty
+ $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "17.8.1-2" -MemberType NoteProperty
}
if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") {
$xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true
diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml
index 42017109f37..bb0d9f8b0f1 100644
--- a/eng/common/templates/job/publish-build-assets.yml
+++ b/eng/common/templates/job/publish-build-assets.yml
@@ -81,7 +81,7 @@ jobs:
arguments: -task PublishBuildAssets -restore -msbuildEngine dotnet
/p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests'
/p:BuildAssetRegistryToken=$(MaestroAccessToken)
- /p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com
+ /p:MaestroApiEndpoint=https://maestro.dot.net
/p:PublishUsingPipelines=${{ parameters.publishUsingPipelines }}
/p:OfficialBuildId=$(Build.BuildNumber)
condition: ${{ parameters.condition }}
diff --git a/eng/common/templates/post-build/common-variables.yml b/eng/common/templates/post-build/common-variables.yml
index c24193acfc9..173914f2364 100644
--- a/eng/common/templates/post-build/common-variables.yml
+++ b/eng/common/templates/post-build/common-variables.yml
@@ -7,7 +7,7 @@ variables:
# Default Maestro++ API Endpoint and API Version
- name: MaestroApiEndPoint
- value: "https://maestro-prod.westus2.cloudapp.azure.com"
+ value: "https://maestro.dot.net"
- name: MaestroApiAccessToken
value: $(MaestroAccessToken)
- name: MaestroApiVersion
diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1
index aa74ab4a81e..fdd0cbb91f8 100644
--- a/eng/common/tools.ps1
+++ b/eng/common/tools.ps1
@@ -379,13 +379,13 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements =
}
# Minimum VS version to require.
- $vsMinVersionReqdStr = '17.6'
+ $vsMinVersionReqdStr = '17.7'
$vsMinVersionReqd = [Version]::new($vsMinVersionReqdStr)
# If the version of msbuild is going to be xcopied,
# use this version. Version matches a package here:
- # https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet-eng/NuGet/RoslynTools.MSBuild/versions/17.6.0-2
- $defaultXCopyMSBuildVersion = '17.6.0-2'
+ # https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet-eng/NuGet/RoslynTools.MSBuild/versions/17.8.1-2
+ $defaultXCopyMSBuildVersion = '17.8.1-2'
if (!$vsRequirements) {
if (Get-Member -InputObject $GlobalJson.tools -Name 'vs') {
diff --git a/global.json b/global.json
index fc9267598cd..c4a5905f89c 100644
--- a/global.json
+++ b/global.json
@@ -3,13 +3,13 @@
"allowPrerelease": true
},
"tools": {
- "dotnet": "8.0.100-rc.1.23463.5",
+ "dotnet": "8.0.100",
"vs": {
- "version": "17.7.0"
+ "version": "17.8.0"
},
- "xcopy-msbuild": "17.7.4"
+ "xcopy-msbuild": "17.8.1-2"
},
"msbuild-sdks": {
- "Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.23463.1"
+ "Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.23580.1"
}
}
diff --git a/src/Build/BackEnd/Components/SdkResolution/SdkResolverLoader.cs b/src/Build/BackEnd/Components/SdkResolution/SdkResolverLoader.cs
index 3c5349611c1..25039ccd712 100644
--- a/src/Build/BackEnd/Components/SdkResolution/SdkResolverLoader.cs
+++ b/src/Build/BackEnd/Components/SdkResolution/SdkResolverLoader.cs
@@ -226,6 +226,20 @@ protected virtual IEnumerable GetResolverTypes(Assembly assembly)
protected virtual Assembly LoadResolverAssembly(string resolverPath)
{
#if !FEATURE_ASSEMBLYLOADCONTEXT
+ if (ChangeWaves.AreFeaturesEnabled(ChangeWaves.Wave17_10))
+ {
+ string resolverFileName = Path.GetFileNameWithoutExtension(resolverPath);
+ if (resolverFileName.Equals("Microsoft.DotNet.MSBuildSdkResolver", StringComparison.OrdinalIgnoreCase))
+ {
+ // This will load the resolver assembly into the default load context if possible, and fall back to LoadFrom context.
+ // We very much prefer the default load context because it allows native images to be used by the CLR, improving startup perf.
+ AssemblyName assemblyName = new AssemblyName(resolverFileName)
+ {
+ CodeBase = resolverPath,
+ };
+ return Assembly.Load(assemblyName);
+ }
+ }
return Assembly.LoadFrom(resolverPath);
#else
return s_loader.LoadFromPath(resolverPath);
diff --git a/src/Build/Logging/BinaryLogger/BuildEventArgsReader.cs b/src/Build/Logging/BinaryLogger/BuildEventArgsReader.cs
index 3c3e2a2faee..38e391565de 100644
--- a/src/Build/Logging/BinaryLogger/BuildEventArgsReader.cs
+++ b/src/Build/Logging/BinaryLogger/BuildEventArgsReader.cs
@@ -642,7 +642,7 @@ private BuildEventArgs ReadBuildErrorEventArgs()
fields.Arguments)
{
ProjectFile = fields.ProjectFile,
- ExtendedMetadata = fields.Extended.ExtendedMetadata,
+ ExtendedMetadata = fields.Extended.ExtendedMetadataAsDictionary,
ExtendedData = fields.Extended.ExtendedData,
};
}
@@ -694,7 +694,7 @@ private BuildEventArgs ReadBuildWarningEventArgs()
fields.Arguments)
{
ProjectFile = fields.ProjectFile,
- ExtendedMetadata = fields.Extended.ExtendedMetadata,
+ ExtendedMetadata = fields.Extended.ExtendedMetadataAsDictionary,
ExtendedData = fields.Extended.ExtendedData,
};
}
@@ -747,7 +747,7 @@ private BuildEventArgs ReadBuildMessageEventArgs()
fields.Arguments)
{
ProjectFile = fields.ProjectFile,
- ExtendedMetadata = fields.Extended?.ExtendedMetadata,
+ ExtendedMetadata = fields.Extended?.ExtendedMetadataAsDictionary,
ExtendedData = fields.Extended?.ExtendedData,
};
}
@@ -836,7 +836,7 @@ private BuildEventArgs ReadCriticalBuildMessageEventArgs()
fields.Arguments)
{
ProjectFile = fields.ProjectFile,
- ExtendedMetadata = fields.Extended?.ExtendedMetadata,
+ ExtendedMetadata = fields.Extended?.ExtendedMetadataAsDictionary,
ExtendedData = fields.Extended?.ExtendedData,
};
}
diff --git a/src/Build/Logging/BinaryLogger/ExtendedDataFields.cs b/src/Build/Logging/BinaryLogger/ExtendedDataFields.cs
index 2a227e9d69c..12912cc3e70 100644
--- a/src/Build/Logging/BinaryLogger/ExtendedDataFields.cs
+++ b/src/Build/Logging/BinaryLogger/ExtendedDataFields.cs
@@ -17,4 +17,14 @@ public ExtendedDataFields(string extendedType, IDictionary? ext
public string ExtendedType { get; }
public IDictionary? ExtendedMetadata { get; }
public string? ExtendedData { get; }
+
+ ///
+ /// We need to this for Extended event args have Dictionary as ExtendedMetadata.
+ ///
+ public Dictionary? ExtendedMetadataAsDictionary =>
+ ExtendedMetadata == null ?
+ null :
+ ExtendedMetadata is Dictionary asDictionary ?
+ asDictionary :
+ new Dictionary(ExtendedMetadata);
}
diff --git a/src/Framework/ExtendedBuildErrorEventArgs.cs b/src/Framework/ExtendedBuildErrorEventArgs.cs
index e5830592b6c..85d10939236 100644
--- a/src/Framework/ExtendedBuildErrorEventArgs.cs
+++ b/src/Framework/ExtendedBuildErrorEventArgs.cs
@@ -18,7 +18,7 @@ public sealed class ExtendedBuildErrorEventArgs : BuildErrorEventArgs, IExtended
public string ExtendedType { get; set; }
///
- public IDictionary? ExtendedMetadata { get; set; }
+ public Dictionary? ExtendedMetadata { get; set; }
///
public string? ExtendedData { get; set; }
diff --git a/src/Framework/ExtendedBuildMessageEventArgs.cs b/src/Framework/ExtendedBuildMessageEventArgs.cs
index 6330a502050..53ec510c8da 100644
--- a/src/Framework/ExtendedBuildMessageEventArgs.cs
+++ b/src/Framework/ExtendedBuildMessageEventArgs.cs
@@ -18,7 +18,7 @@ public sealed class ExtendedBuildMessageEventArgs : BuildMessageEventArgs, IExte
public string ExtendedType { get; set; }
///
- public IDictionary? ExtendedMetadata { get; set; }
+ public Dictionary? ExtendedMetadata { get; set; }
///
public string? ExtendedData { get; set; }
diff --git a/src/Framework/ExtendedBuildWarningEventArgs.cs b/src/Framework/ExtendedBuildWarningEventArgs.cs
index 88eaf08af0d..9481d2bfbdc 100644
--- a/src/Framework/ExtendedBuildWarningEventArgs.cs
+++ b/src/Framework/ExtendedBuildWarningEventArgs.cs
@@ -18,7 +18,7 @@ public sealed class ExtendedBuildWarningEventArgs : BuildWarningEventArgs, IExte
public string ExtendedType { get; set; }
///
- public IDictionary? ExtendedMetadata { get; set; }
+ public Dictionary? ExtendedMetadata { get; set; }
///
public string? ExtendedData { get; set; }
diff --git a/src/Framework/ExtendedCriticalBuildMessageEventArgs.cs b/src/Framework/ExtendedCriticalBuildMessageEventArgs.cs
index 8b16acdb3be..3897a1de6e6 100644
--- a/src/Framework/ExtendedCriticalBuildMessageEventArgs.cs
+++ b/src/Framework/ExtendedCriticalBuildMessageEventArgs.cs
@@ -18,7 +18,7 @@ public sealed class ExtendedCriticalBuildMessageEventArgs : CriticalBuildMessage
public string ExtendedType { get; set; }
///
- public IDictionary? ExtendedMetadata { get; set; }
+ public Dictionary? ExtendedMetadata { get; set; }
///
public string? ExtendedData { get; set; }
diff --git a/src/Framework/ExtendedCustomBuildEventArgs.cs b/src/Framework/ExtendedCustomBuildEventArgs.cs
index 8a20c512923..0669c025843 100644
--- a/src/Framework/ExtendedCustomBuildEventArgs.cs
+++ b/src/Framework/ExtendedCustomBuildEventArgs.cs
@@ -18,7 +18,7 @@ public sealed class ExtendedCustomBuildEventArgs : CustomBuildEventArgs, IExtend
public string ExtendedType { get; set; }
///
- public IDictionary? ExtendedMetadata { get; set; }
+ public Dictionary? ExtendedMetadata { get; set; }
///
public string? ExtendedData { get; set; }
diff --git a/src/Framework/IExtendedBuildEventArgs.cs b/src/Framework/IExtendedBuildEventArgs.cs
index 83b4c3ba555..0c73ddb914f 100644
--- a/src/Framework/IExtendedBuildEventArgs.cs
+++ b/src/Framework/IExtendedBuildEventArgs.cs
@@ -22,7 +22,7 @@ public interface IExtendedBuildEventArgs
/// - data which needed in custom code to properly routing this message without interpreting/deserializing .
/// - simple extended data can be transferred in form of dictionary key-value per one extended property.
///
- IDictionary? ExtendedMetadata { get; set; }
+ Dictionary? ExtendedMetadata { get; set; }
///
/// Transparent data as string.
diff --git a/src/Framework/Logging/AnsiCodes.cs b/src/Framework/Logging/AnsiCodes.cs
index 016260d55f8..8466220026b 100644
--- a/src/Framework/Logging/AnsiCodes.cs
+++ b/src/Framework/Logging/AnsiCodes.cs
@@ -141,4 +141,13 @@ public static string MakeBold(string? s)
return $"{CSI}{SetBold}{s}{SetDefaultColor}";
}
+
+ public static string MoveCursorBackward(int count) => $"{CSI}{count}{MoveBackward}";
+
+ ///
+ /// Moves cursor to the specified column, or the rightmost column if is greater than the width of the terminal.
+ ///
+ /// Column index.
+ /// Control codes to set the desired position.
+ public static string SetCursorHorizontal(int column) => $"{CSI}{column}G";
}
diff --git a/src/MSBuild.UnitTests/NodeStatus_Tests.cs b/src/MSBuild.UnitTests/NodeStatus_Tests.cs
new file mode 100644
index 00000000000..50ae7b38a51
--- /dev/null
+++ b/src/MSBuild.UnitTests/NodeStatus_Tests.cs
@@ -0,0 +1,62 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Microsoft.Build.Logging.TerminalLogger;
+
+using VerifyTests;
+using VerifyXunit;
+using Xunit;
+
+using static VerifyXunit.Verifier;
+
+
+namespace Microsoft.Build.CommandLine.UnitTests;
+
+[UsesVerify]
+public class NodeStatus_Tests
+{
+ private readonly NodeStatus _status = new("Namespace.Project", "TargetFramework", "Target", new());
+
+ public NodeStatus_Tests()
+ {
+ UseProjectRelativeDirectory("Snapshots");
+ }
+
+ [Fact]
+ public async Task EverythingFits()
+ {
+ NodesFrame frame = new(new[] { _status }, width: 80, height: 5);
+
+ await Verify(frame.RenderNodeStatus(_status).ToString());
+ }
+
+ [Fact]
+ public async Task TargetIsTruncatedFirst()
+ {
+ NodesFrame frame = new(new[] { _status }, width: 45, height: 5);
+
+ await Verify(frame.RenderNodeStatus(_status).ToString());
+ }
+
+ [Fact]
+ public async Task NamespaceIsTruncatedNext()
+ {
+ NodesFrame frame = new(new[] { _status }, width: 40, height: 5);
+
+ await Verify(frame.RenderNodeStatus(_status).ToString());
+ }
+
+ [Fact]
+ public async Task GoesToProject()
+ {
+ NodesFrame frame = new(new[] { _status }, width: 10, height: 5);
+
+ await Verify(frame.RenderNodeStatus(_status).ToString());
+ }
+}
diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.EverythingFits.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.EverythingFits.verified.txt
new file mode 100644
index 00000000000..a889f734e14
--- /dev/null
+++ b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.EverythingFits.verified.txt
@@ -0,0 +1 @@
+ Namespace.Project [36;1mTargetFramework[m [120G[13DTarget (0.0s)
\ No newline at end of file
diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.GoesToProject.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.GoesToProject.verified.txt
new file mode 100644
index 00000000000..74eb4993b40
--- /dev/null
+++ b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.GoesToProject.verified.txt
@@ -0,0 +1 @@
+Project
\ No newline at end of file
diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.NamespaceIsTruncatedNext.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.NamespaceIsTruncatedNext.verified.txt
new file mode 100644
index 00000000000..a06cd82177c
--- /dev/null
+++ b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.NamespaceIsTruncatedNext.verified.txt
@@ -0,0 +1 @@
+ Project [36;1mTargetFramework[m [120G[7D (0.0s)
\ No newline at end of file
diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.TargetIsTruncatedFirst.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.TargetIsTruncatedFirst.verified.txt
new file mode 100644
index 00000000000..014bb0cb3be
--- /dev/null
+++ b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.TargetIsTruncatedFirst.verified.txt
@@ -0,0 +1 @@
+ Namespace.Project [36;1mTargetFramework[m [120G[7D (0.0s)
\ No newline at end of file
diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.Linux.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.Linux.verified.txt
index 0777ef5cc91..fe12f4e9dec 100644
--- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.Linux.verified.txt
+++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.Linux.verified.txt
@@ -1,5 +1,5 @@
]9;4;3;\[?25l[1F
- project [36;1mtfName[m Build (0.0s)
+ project [36;1mtfName[m [120G[12DBuild (0.0s)
[?25h[?25l[2F
- project [36;1mtf2[m Build (0.0s)[K
+[K project [36;1mtf2[m [120G[12DBuild (0.0s)
[?25h
\ No newline at end of file
diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.OSX.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.OSX.verified.txt
index d860724e3ab..8d078e61f5c 100644
--- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.OSX.verified.txt
+++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.OSX.verified.txt
@@ -1,5 +1,5 @@
[?25l[1F
- project [36;1mtfName[m Build (0.0s)
+ project [36;1mtfName[m [120G[12DBuild (0.0s)
[?25h[?25l[2F
- project [36;1mtf2[m Build (0.0s)[K
+[K project [36;1mtf2[m [120G[12DBuild (0.0s)
[?25h
\ No newline at end of file
diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.Windows.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.Windows.verified.txt
index 0777ef5cc91..fe12f4e9dec 100644
--- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.Windows.verified.txt
+++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesOverwritesWithNewTargetFramework.Windows.verified.txt
@@ -1,5 +1,5 @@
]9;4;3;\[?25l[1F
- project [36;1mtfName[m Build (0.0s)
+ project [36;1mtfName[m [120G[12DBuild (0.0s)
[?25h[?25l[2F
- project [36;1mtf2[m Build (0.0s)[K
+[K project [36;1mtf2[m [120G[12DBuild (0.0s)
[?25h
\ No newline at end of file
diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.Linux.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.Linux.verified.txt
index d0cb5b914e0..1f7b782f2ef 100644
--- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.Linux.verified.txt
+++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.Linux.verified.txt
@@ -1,3 +1,3 @@
]9;4;3;\[?25l[1F
- project Build (0.0s)
+ project [120G[12DBuild (0.0s)
[?25h
\ No newline at end of file
diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.OSX.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.OSX.verified.txt
index edce93c06c4..143745dea40 100644
--- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.OSX.verified.txt
+++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.OSX.verified.txt
@@ -1,3 +1,3 @@
[?25l[1F
- project Build (0.0s)
+ project [120G[12DBuild (0.0s)
[?25h
\ No newline at end of file
diff --git a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.Windows.verified.txt b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.Windows.verified.txt
index d0cb5b914e0..1f7b782f2ef 100644
--- a/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.Windows.verified.txt
+++ b/src/MSBuild.UnitTests/Snapshots/TerminalLogger_Tests.DisplayNodesShowsCurrent.Windows.verified.txt
@@ -1,3 +1,3 @@
]9;4;3;\[?25l[1F
- project Build (0.0s)
+ project [120G[12DBuild (0.0s)
[?25h
\ No newline at end of file
diff --git a/src/MSBuild/Resources/Strings.resx b/src/MSBuild/Resources/Strings.resx
index a753a09c5b6..98c41c4823c 100644
--- a/src/MSBuild/Resources/Strings.resx
+++ b/src/MSBuild/Resources/Strings.resx
@@ -1536,26 +1536,11 @@
{0}: VT100 coded hyperlink to project output directory
-
- {0}{1} {2} ({3}s)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
+
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
Build failed. Properties, Items, and Target results cannot be obtained. See details in stderr above.
diff --git a/src/MSBuild/Resources/xlf/Strings.cs.xlf b/src/MSBuild/Resources/xlf/Strings.cs.xlf
index 9a4dee64212..55929f8714c 100644
--- a/src/MSBuild/Resources/xlf/Strings.cs.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.cs.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: Přepínač -noAutoResponse nelze zadat v souboru automatických odpovědí MSBuild.rsp ani v žádném jiném souboru odpovědí, na který se v souboru automatických odpovědí odkazuje.
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1488,29 +1495,6 @@ Když se nastaví na MessageUponIsolationViolation (nebo jeho krátký
Proces = {0}
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3}s)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4}s)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3}s)
diff --git a/src/MSBuild/Resources/xlf/Strings.de.xlf b/src/MSBuild/Resources/xlf/Strings.de.xlf
index 0a93c2b4b6d..226e0960175 100644
--- a/src/MSBuild/Resources/xlf/Strings.de.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.de.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: Der Schalter "-noAutoResponse" kann weder in der automatischen Antwortdatei "MSBuild.rsp" noch in einer anderen Antwortdatei verwendet werden, auf die die automatische Antwortdatei verweist.
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1476,29 +1483,6 @@ Dieses Protokollierungsformat ist standardmäßig aktiviert.
Prozess = "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3}s)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4}s)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3}s)
diff --git a/src/MSBuild/Resources/xlf/Strings.es.xlf b/src/MSBuild/Resources/xlf/Strings.es.xlf
index cfa87dc7547..1846d8646a1 100644
--- a/src/MSBuild/Resources/xlf/Strings.es.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.es.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: El modificador -noAutoResponse no puede especificarse en el archivo de respuesta automática MSBuild.rsp ni en ningún archivo de respuesta al que el archivo de respuesta automática haga referencia.
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1482,29 +1489,6 @@ Esta marca es experimental y puede que no funcione según lo previsto.
Proceso: "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3}s)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4}s)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3}s)
diff --git a/src/MSBuild/Resources/xlf/Strings.fr.xlf b/src/MSBuild/Resources/xlf/Strings.fr.xlf
index b4b2ae8bfde..f4d88741a76 100644
--- a/src/MSBuild/Resources/xlf/Strings.fr.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.fr.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: Impossible de spécifier le commutateur -noAutoResponse dans le fichier réponse automatique MSBuild.rsp, ni dans aucun autre fichier réponse référencé par le fichier réponse automatique.
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1475,29 +1482,6 @@ Remarque : verbosité des enregistreurs d’événements de fichiers
Processus = "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3}s)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4}s)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3}s)
diff --git a/src/MSBuild/Resources/xlf/Strings.it.xlf b/src/MSBuild/Resources/xlf/Strings.it.xlf
index d5b83a7548a..12e7aa2ac94 100644
--- a/src/MSBuild/Resources/xlf/Strings.it.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.it.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: non è possibile specificare l'opzione -noAutoResponse nel file di risposta automatica MSBuild.rsp o in file di risposta a cui il file di risposta automatica fa riferimento.
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1486,29 +1493,6 @@ Nota: livello di dettaglio dei logger di file
Processo = "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3}s)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4}s)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3}s)
diff --git a/src/MSBuild/Resources/xlf/Strings.ja.xlf b/src/MSBuild/Resources/xlf/Strings.ja.xlf
index b10dcf784c2..cd05368111a 100644
--- a/src/MSBuild/Resources/xlf/Strings.ja.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.ja.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: MSBuild.rsp 自動応答ファイルや、自動応答ファイルによって参照される応答ファイルに -noAutoResponse スイッチを指定することはできません。
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1475,29 +1482,6 @@
プロセス = "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3} 秒)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4} 秒)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3} 秒)
diff --git a/src/MSBuild/Resources/xlf/Strings.ko.xlf b/src/MSBuild/Resources/xlf/Strings.ko.xlf
index d6d76449a65..dfa81b71e90 100644
--- a/src/MSBuild/Resources/xlf/Strings.ko.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.ko.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: MSBuild.rsp 자동 지시 파일과 자동 지시 파일에서 참조하는 모든 지시 파일에는 -noAutoResponse 스위치를 지정할 수 없습니다.
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1475,29 +1482,6 @@
프로세스 = "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3}초)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4}초)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3}초)
diff --git a/src/MSBuild/Resources/xlf/Strings.pl.xlf b/src/MSBuild/Resources/xlf/Strings.pl.xlf
index 2a48d1d5450..133760011df 100644
--- a/src/MSBuild/Resources/xlf/Strings.pl.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.pl.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: przełącznika -noAutoResponse nie można określić w pliku autoodpowiedzi MSBuild.rsp ani w żadnym pliku odpowiedzi, do którego odwołuje się plik autoodpowiedzi.
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1486,29 +1493,6 @@ Ta flaga jest eksperymentalna i może nie działać zgodnie z oczekiwaniami.
Proces = „{0}”
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3}s)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4}s)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3}s)
diff --git a/src/MSBuild/Resources/xlf/Strings.pt-BR.xlf b/src/MSBuild/Resources/xlf/Strings.pt-BR.xlf
index 15c9b624a84..247e14490ef 100644
--- a/src/MSBuild/Resources/xlf/Strings.pt-BR.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.pt-BR.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: A opção /noAutoResponse não pode ser especificada no arquivo de resposta automática MSBuild.rsp nem em qualquer arquivo de resposta usado como referência para o arquivo de resposta automática.
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1476,29 +1483,6 @@ arquivo de resposta.
Processo = "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3}s)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4}s)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3}s)
diff --git a/src/MSBuild/Resources/xlf/Strings.ru.xlf b/src/MSBuild/Resources/xlf/Strings.ru.xlf
index 6dca92a8e84..1d89ce20f45 100644
--- a/src/MSBuild/Resources/xlf/Strings.ru.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.ru.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: ключ noAutoResponse не может быть указан в файле автоответа MSBuild.rsp или в любом другом файле ответа, на который файл автоответа ссылается.
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1474,29 +1481,6 @@
Процесс = "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3} с)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4} с)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3} с)
diff --git a/src/MSBuild/Resources/xlf/Strings.tr.xlf b/src/MSBuild/Resources/xlf/Strings.tr.xlf
index ff6f95f2eae..d3fc5c7e9ed 100644
--- a/src/MSBuild/Resources/xlf/Strings.tr.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.tr.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: -noAutoResponse anahtarı, MSBuild.rsp otomatik yanıt dosyasında ve bu dosyanın başvuruda bulunduğu herhangi bir yanıt dosyasında belirtilemez.
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1479,29 +1486,6 @@
İşlem = "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3}sn)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3}({4}sn)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3}sn)
diff --git a/src/MSBuild/Resources/xlf/Strings.zh-Hans.xlf b/src/MSBuild/Resources/xlf/Strings.zh-Hans.xlf
index db252831300..12f6f98c04d 100644
--- a/src/MSBuild/Resources/xlf/Strings.zh-Hans.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.zh-Hans.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: 不能在 MSBuild.rsp 自动响应文件中或由该自动响应文件引用的任何响应文件中指定 -noAutoResponse 开关。
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1475,29 +1482,6 @@
进程 = "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3})
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4})
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3})
diff --git a/src/MSBuild/Resources/xlf/Strings.zh-Hant.xlf b/src/MSBuild/Resources/xlf/Strings.zh-Hant.xlf
index f5907cf51e5..b603ad790a6 100644
--- a/src/MSBuild/Resources/xlf/Strings.zh-Hant.xlf
+++ b/src/MSBuild/Resources/xlf/Strings.zh-Hant.xlf
@@ -77,6 +77,13 @@
MSBUILD : error MSB1027: -noAutoResponse 參數不能在 MSBuild.rsp 自動回應檔中指定,也不能在自動回應檔所參考的任何回應檔中指定。
{StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized.
+
+ ({0:F1}s)
+ ({0:F1}s)
+
+ {0}: duration in seconds with 1 decimal point
+
+
-question
(Experimental) Question whether there is any build work.
@@ -1475,29 +1482,6 @@
流程 = "{0}"
-
- {0}{1} {2} ({3}s)
- {0}{1} {2} ({3} 秒)
-
- Project building.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target
- {3}: duration in seconds with 1 decimal point
-
-
-
- {0}{1} {2} {3} ({4}s)
- {0}{1} {2} {3} ({4} 秒)
-
- Project building including target framework information.
- {0}: indentation - few spaces to visually indent row
- {1}: project name
- {2}: target framework
- {3}: target
- {4}: duration in seconds with 1 decimal point
-
-
{0}{1} {2} ({3}s)
{0}{1} {2} ({3} 秒)
diff --git a/src/MSBuild/TerminalLogger/NodeStatus.cs b/src/MSBuild/TerminalLogger/NodeStatus.cs
new file mode 100644
index 00000000000..c82a3d106d7
--- /dev/null
+++ b/src/MSBuild/TerminalLogger/NodeStatus.cs
@@ -0,0 +1,58 @@
+// 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;
+using Microsoft.Build.Shared;
+
+namespace Microsoft.Build.Logging.TerminalLogger;
+
+///
+/// Encapsulates the per-node data shown in live node output.
+///
+internal class NodeStatus
+{
+ public string Project { get; }
+ public string? TargetFramework { get; }
+ public string Target { get; }
+ public Stopwatch Stopwatch { get; }
+
+ public NodeStatus(string project, string? targetFramework, string target, Stopwatch stopwatch)
+ {
+ Project = project;
+ TargetFramework = targetFramework;
+ Target = target;
+ Stopwatch = stopwatch;
+ }
+
+ ///
+ /// Equality is based on the project, target framework, and target, but NOT the elapsed time.
+ ///
+ public override bool Equals(object? obj) =>
+ obj is NodeStatus status &&
+ Project == status.Project &&
+ TargetFramework == status.TargetFramework &&
+ Target == status.Target;
+
+ public override string ToString()
+ {
+ string duration = Stopwatch.Elapsed.TotalSeconds.ToString("F1");
+
+ return string.IsNullOrEmpty(TargetFramework)
+ ? string.Format("{0}{1} {2} ({3}s)",
+ TerminalLogger.Indentation,
+ Project,
+ Target,
+ duration)
+ : string.Format("{0}{1} {2} {3} ({4}s)",
+ TerminalLogger.Indentation,
+ Project,
+ AnsiCodes.Colorize(TargetFramework, TerminalLogger.TargetFrameworkColor),
+ Target,
+ duration);
+ }
+
+ public override int GetHashCode()
+ {
+ throw new System.NotImplementedException();
+ }
+}
diff --git a/src/MSBuild/TerminalLogger/NodesFrame.cs b/src/MSBuild/TerminalLogger/NodesFrame.cs
new file mode 100644
index 00000000000..144288950fa
--- /dev/null
+++ b/src/MSBuild/TerminalLogger/NodesFrame.cs
@@ -0,0 +1,135 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+
+using System.Text;
+using Microsoft.Build.Shared;
+
+namespace Microsoft.Build.Logging.TerminalLogger;
+
+///
+/// Capture states on nodes to be rendered on display.
+///
+internal sealed class NodesFrame
+{
+ private const int MaxColumn = 120;
+
+ private readonly NodeStatus[] _nodes;
+
+ private readonly StringBuilder _renderBuilder = new();
+
+ public int Width { get; }
+ public int Height { get; }
+ public int NodesCount { get; private set; }
+
+ public NodesFrame(NodeStatus?[] nodes, int width, int height)
+ {
+ Width = Math.Min(width, MaxColumn);
+ Height = height;
+
+ _nodes = new NodeStatus[nodes.Length];
+
+ foreach (NodeStatus? status in nodes)
+ {
+ if (status is not null)
+ {
+ _nodes[NodesCount++] = status;
+ }
+ }
+ }
+
+ internal ReadOnlySpan RenderNodeStatus(NodeStatus status)
+ {
+ string durationString = ResourceUtilities.FormatResourceStringIgnoreCodeAndKeyword(
+ "DurationDisplay",
+ status.Stopwatch.Elapsed.TotalSeconds);
+
+ string project = status.Project;
+ string? targetFramework = status.TargetFramework;
+ string target = status.Target;
+
+ int renderedWidth = Length(durationString, project, targetFramework, target);
+
+ if (renderedWidth > Width)
+ {
+ renderedWidth -= target.Length;
+ target = string.Empty;
+
+ if (renderedWidth > Width)
+ {
+ int lastDotInProject = project.LastIndexOf('.');
+ renderedWidth -= lastDotInProject;
+ project = project.Substring(lastDotInProject + 1);
+
+ if (renderedWidth > Width)
+ {
+ return project.AsSpan();
+ }
+ }
+ }
+
+ return $"{TerminalLogger.Indentation}{project}{(targetFramework is null ? string.Empty : " ")}{AnsiCodes.Colorize(targetFramework, TerminalLogger.TargetFrameworkColor)} {AnsiCodes.SetCursorHorizontal(MaxColumn)}{AnsiCodes.MoveCursorBackward(target.Length + durationString.Length + 1)}{target} {durationString}".AsSpan();
+
+ static int Length(string durationString, string project, string? targetFramework, string target) =>
+ TerminalLogger.Indentation.Length +
+ project.Length + 1 +
+ (targetFramework?.Length ?? -1) + 1 +
+ target.Length + 1 +
+ durationString.Length;
+ }
+
+ ///
+ /// Render VT100 string to update from current to next frame.
+ ///
+ public string Render(NodesFrame previousFrame)
+ {
+ StringBuilder sb = _renderBuilder;
+ sb.Clear();
+
+ int i = 0;
+ for (; i < NodesCount; i++)
+ {
+ ReadOnlySpan needed = RenderNodeStatus(_nodes[i]);
+
+ // Do we have previous node string to compare with?
+ if (previousFrame.NodesCount > i)
+ {
+ if (previousFrame._nodes[i] == _nodes[i])
+ {
+ // Same everything except time
+ string durationString = ResourceUtilities.FormatResourceStringIgnoreCodeAndKeyword("DurationDisplay", _nodes[i].Stopwatch.Elapsed.TotalSeconds);
+ sb.Append($"{AnsiCodes.SetCursorHorizontal(MaxColumn)}{AnsiCodes.MoveCursorBackward(durationString.Length)}{durationString}");
+ }
+ else
+ {
+ // TODO: check components to figure out skips and optimize this
+ sb.Append($"{AnsiCodes.CSI}{AnsiCodes.EraseInLine}");
+ sb.Append(needed);
+ }
+ }
+ else
+ {
+ // From now on we have to simply WriteLine
+ sb.Append(needed);
+ }
+
+ // Next line
+ sb.AppendLine();
+ }
+
+ // clear no longer used lines
+ if (i < previousFrame.NodesCount)
+ {
+ sb.Append($"{AnsiCodes.CSI}{AnsiCodes.EraseInDisplay}");
+ }
+
+ return sb.ToString();
+ }
+
+ public void Clear()
+ {
+ NodesCount = 0;
+ }
+}
diff --git a/src/MSBuild/TerminalLogger/TerminalLogger.cs b/src/MSBuild/TerminalLogger/TerminalLogger.cs
index ba0e8abf043..221d6e4e4fa 100644
--- a/src/MSBuild/TerminalLogger/TerminalLogger.cs
+++ b/src/MSBuild/TerminalLogger/TerminalLogger.cs
@@ -1,11 +1,9 @@
-// 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;
using System.Collections.Generic;
-using System.Diagnostics;
using System.Linq;
-using System.Text;
using System.Threading;
using Microsoft.Build.Framework;
using Microsoft.Build.Shared;
@@ -52,36 +50,12 @@ public ProjectContext(BuildEventContext context)
{ }
}
- ///
- /// Encapsulates the per-node data shown in live node output.
- ///
- internal record NodeStatus(string Project, string? TargetFramework, string Target, Stopwatch Stopwatch)
- {
- public override string ToString()
- {
- string duration = Stopwatch.Elapsed.TotalSeconds.ToString("F1");
-
- return string.IsNullOrEmpty(TargetFramework)
- ? ResourceUtilities.FormatResourceStringIgnoreCodeAndKeyword("ProjectBuilding_NoTF",
- Indentation,
- Project,
- Target,
- duration)
- : ResourceUtilities.FormatResourceStringIgnoreCodeAndKeyword("ProjectBuilding_WithTF",
- Indentation,
- Project,
- AnsiCodes.Colorize(TargetFramework, TargetFrameworkColor),
- Target,
- duration);
- }
- }
-
///
/// The indentation to use for all build output.
///
- private const string Indentation = " ";
+ internal const string Indentation = " ";
- private const TerminalColor TargetFrameworkColor = TerminalColor.Cyan;
+ internal const TerminalColor TargetFrameworkColor = TerminalColor.Cyan;
///
/// Protects access to state shared between the logger callbacks and the rendering thread.
@@ -221,7 +195,7 @@ public string Parameters
///
public void Initialize(IEventSource eventSource, int nodeCount)
{
- // When MSBUILDNOINPROCNODE enabled, NodeId's reported by build start with 2. We need to reserve an extra spot for this case.
+ // When MSBUILDNOINPROCNODE enabled, NodeId's reported by build start with 2. We need to reserve an extra spot for this case.
_nodes = new NodeStatus[nodeCount + 1];
Initialize(eventSource);
@@ -745,137 +719,6 @@ private void EraseNodes()
_currentFrame.Clear();
}
- ///
- /// Capture states on nodes to be rendered on display.
- ///
- private sealed class NodesFrame
- {
- private readonly List _nodeStrings = new();
- private readonly StringBuilder _renderBuilder = new();
-
- public int Width { get; }
- public int Height { get; }
- public int NodesCount { get; private set; }
-
- public NodesFrame(NodeStatus?[] nodes, int width, int height)
- {
- Width = width;
- Height = height;
- Init(nodes);
- }
-
- public string NodeString(int index)
- {
- if (index >= NodesCount)
- {
- throw new ArgumentOutOfRangeException(nameof(index));
- }
-
- return _nodeStrings[index];
- }
-
- private void Init(NodeStatus?[] nodes)
- {
- int i = 0;
- foreach (NodeStatus? n in nodes)
- {
- if (n is null)
- {
- continue;
- }
- string str = n.ToString();
-
- if (i < _nodeStrings.Count)
- {
- _nodeStrings[i] = str;
- }
- else
- {
- _nodeStrings.Add(str);
- }
- i++;
-
- // We cant output more than what fits on screen
- // -2 because cursor command F cant reach, in Windows Terminal, very 1st line, and last line is empty caused by very last WriteLine
- if (i >= Height - 2)
- {
- break;
- }
- }
-
- NodesCount = i;
- }
-
- private ReadOnlySpan FitToWidth(ReadOnlySpan input)
- {
- return input.Slice(0, Math.Min(input.Length, Width - 1));
- }
-
- ///
- /// Render VT100 string to update from current to next frame.
- ///
- public string Render(NodesFrame previousFrame)
- {
- StringBuilder sb = _renderBuilder;
- sb.Clear();
-
- int i = 0;
- for (; i < NodesCount; i++)
- {
- var needed = FitToWidth(NodeString(i).AsSpan());
-
- // Do we have previous node string to compare with?
- if (previousFrame.NodesCount > i)
- {
- var previous = FitToWidth(previousFrame.NodeString(i).AsSpan());
-
- if (!previous.SequenceEqual(needed))
- {
- int commonPrefixLen = previous.CommonPrefixLength(needed);
-
- if (commonPrefixLen != 0 && needed.Slice(0, commonPrefixLen).IndexOf('\x1b') == -1)
- {
- // no escape codes, so can trivially skip substrings
- sb.Append($"{AnsiCodes.CSI}{commonPrefixLen}{AnsiCodes.MoveForward}");
- sb.Append(needed.Slice(commonPrefixLen));
- }
- else
- {
- sb.Append(needed);
- }
-
- // Shall we clear rest of line
- if (needed.Length < previous.Length)
- {
- sb.Append($"{AnsiCodes.CSI}{AnsiCodes.EraseInLine}");
- }
- }
- }
- else
- {
- // From now on we have to simply WriteLine
- sb.Append(needed);
- }
-
- // Next line
- sb.AppendLine();
- }
-
- // clear no longer used lines
- if (i < previousFrame.NodesCount)
- {
- sb.Append($"{AnsiCodes.CSI}{AnsiCodes.EraseInDisplay}");
- }
-
- return sb.ToString();
- }
-
- public void Clear()
- {
- NodesCount = 0;
- }
- }
-
#endregion
#region Helpers
diff --git a/src/MSBuild/app.amd64.config b/src/MSBuild/app.amd64.config
index 1feab29307d..34c409fa079 100644
--- a/src/MSBuild/app.amd64.config
+++ b/src/MSBuild/app.amd64.config
@@ -184,6 +184,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/MSBuild/app.config b/src/MSBuild/app.config
index 51d2a26861e..cb3e75d2510 100644
--- a/src/MSBuild/app.config
+++ b/src/MSBuild/app.config
@@ -133,6 +133,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Tasks/Microsoft.Common.CurrentVersion.targets b/src/Tasks/Microsoft.Common.CurrentVersion.targets
index 001a624209b..1ed602b0251 100644
--- a/src/Tasks/Microsoft.Common.CurrentVersion.targets
+++ b/src/Tasks/Microsoft.Common.CurrentVersion.targets
@@ -388,9 +388,7 @@ Copyright (C) Microsoft Corporation. All rights reserved.
$(MSBuildProjectFile)
-
- $(MSBuildProjectFile.Substring(0,8)).$(ProjectGuid.Substring(1,8))
-
+
$(MSBuildProjectFile.Substring(0,8)).$([MSBuild]::StableStringHash($(MSBuildProjectFile)).ToString("X8"))
$(MSBuildCopyMarkerName).Up2Date