From 642eed516bbdc3888430a102aa0f6321b10becab Mon Sep 17 00:00:00 2001 From: Jenny Bai Date: Mon, 23 Sep 2024 13:52:05 +0800 Subject: [PATCH 01/22] Update native File.Exists (#9223) * Enable test ProjectItemSpecTooLong * Get full path * Get the rootlength from tempProject * Update the test exception * Update the test description * Update test description * Update WindowsFileSystem.FileExists * revert test description * Adds all assembly redirects to the config file --- src/Build.UnitTests/BackEnd/MSBuild_Tests.cs | 11 ++++------- src/MSBuild.UnitTests/XMake_Tests.cs | 6 ++++-- src/Shared/FileSystem/WindowsFileSystem.cs | 6 +++++- src/Tasks.UnitTests/MSBuild_Tests.cs | 9 +++------ 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Build.UnitTests/BackEnd/MSBuild_Tests.cs b/src/Build.UnitTests/BackEnd/MSBuild_Tests.cs index fd1ffbcae34..1922000b7c7 100644 --- a/src/Build.UnitTests/BackEnd/MSBuild_Tests.cs +++ b/src/Build.UnitTests/BackEnd/MSBuild_Tests.cs @@ -37,7 +37,6 @@ public void Dispose() /// throw a path too long exception /// [Fact] - [ActiveIssue("https://github.com/dotnet/msbuild/issues/4247")] public void ProjectItemSpecTooLong() { string currentDirectory = Directory.GetCurrentDirectory(); @@ -45,8 +44,6 @@ public void ProjectItemSpecTooLong() { Directory.SetCurrentDirectory(Path.GetTempPath()); - string tempPath = Path.GetTempPath(); - string tempProject = ObjectModelHelpers.CreateTempFileOnDisk(@" @@ -68,16 +65,16 @@ public void ProjectItemSpecTooLong() projectFile1 += "..\\"; } - int rootLength = Path.GetPathRoot(tempPath).Length; - string tempPathNoRoot = tempPath.Substring(rootLength); + int rootLength = Path.GetPathRoot(tempProject).Length; + string tempPathNoRoot = tempProject.Substring(rootLength); - projectFile1 += Path.Combine(tempPathNoRoot, fileName); + projectFile1 += tempPathNoRoot; string parentProjectContents = @" - + "; try diff --git a/src/MSBuild.UnitTests/XMake_Tests.cs b/src/MSBuild.UnitTests/XMake_Tests.cs index 0ef451ba979..ee6eb6219fb 100644 --- a/src/MSBuild.UnitTests/XMake_Tests.cs +++ b/src/MSBuild.UnitTests/XMake_Tests.cs @@ -11,6 +11,7 @@ using System.Reflection; using System.Runtime.InteropServices; using System.Threading; +using System.Xml.Linq; using Microsoft.Build.CommandLine; using Microsoft.Build.Evaluation; using Microsoft.Build.Framework; @@ -985,8 +986,8 @@ public void ConfigurationInvalid() var msbuildExeName = Path.GetFileName(RunnerUtilities.PathToCurrentlyRunningMsBuildExe); var newPathToMSBuildExe = Path.Combine(startDirectory, msbuildExeName); var pathToConfigFile = Path.Combine(startDirectory, msbuildExeName + ".config"); - - string configContent = @" + XElement configRuntimeElement = XDocument.Load(RunnerUtilities.PathToCurrentlyRunningMsBuildExe + ".config").Root.Element("runtime"); + string configContent = $@"
@@ -1006,6 +1007,7 @@ public void ConfigurationInvalid() + {configRuntimeElement} "; File.WriteAllText(pathToConfigFile, configContent); diff --git a/src/Shared/FileSystem/WindowsFileSystem.cs b/src/Shared/FileSystem/WindowsFileSystem.cs index aa350505a0d..1493d0f29a8 100644 --- a/src/Shared/FileSystem/WindowsFileSystem.cs +++ b/src/Shared/FileSystem/WindowsFileSystem.cs @@ -60,7 +60,11 @@ public override bool DirectoryExists(string path) public override bool FileExists(string path) { - return NativeMethodsShared.FileExistsWindows(path); +#if NETFRAMEWORK + return Microsoft.IO.File.Exists(path); +#else + return File.Exists(path); +#endif } public override bool FileOrDirectoryExists(string path) diff --git a/src/Tasks.UnitTests/MSBuild_Tests.cs b/src/Tasks.UnitTests/MSBuild_Tests.cs index ad1ab81787a..9a17e9b848f 100644 --- a/src/Tasks.UnitTests/MSBuild_Tests.cs +++ b/src/Tasks.UnitTests/MSBuild_Tests.cs @@ -39,7 +39,6 @@ public void Dispose() /// throw a path too long exception /// [Fact] - [ActiveIssue("https://github.com/dotnet/msbuild/issues/4247")] public void ProjectItemSpecTooLong() { string currentDirectory = Directory.GetCurrentDirectory(); @@ -47,8 +46,6 @@ public void ProjectItemSpecTooLong() { Directory.SetCurrentDirectory(Path.GetTempPath()); - string tempPath = Path.GetTempPath(); - string tempProject = ObjectModelHelpers.CreateTempFileOnDisk(@" @@ -70,10 +67,10 @@ public void ProjectItemSpecTooLong() projectFile1 += "..\\"; } - int rootLength = Path.GetPathRoot(tempPath).Length; - string tempPathNoRoot = tempPath.Substring(rootLength); + int rootLength = Path.GetPathRoot(tempProject).Length; + string tempPathNoRoot = tempProject.Substring(rootLength); - projectFile1 += Path.Combine(tempPathNoRoot, fileName); + projectFile1 += tempPathNoRoot; try { MSBuild msbuildTask = new MSBuild From e86e6dd2f4e45a433c444d732779d6e2e5f6c320 Mon Sep 17 00:00:00 2001 From: dotnet bot Date: Mon, 23 Sep 2024 02:18:14 -0700 Subject: [PATCH 02/22] Localized file check-in by OneLocBuild Task: Build definition ID 9434: Build ID 10262578 (#10685) * Localized file check-in by OneLocBuild Task: Build definition ID 9434: Build ID 10262578 * Localized file check-in by OneLocBuild Task: Build definition ID 9434: Build ID 10262578 --- src/MSBuild/Resources/xlf/Strings.cs.xlf | 8 ++++---- src/MSBuild/Resources/xlf/Strings.de.xlf | 8 ++++---- src/MSBuild/Resources/xlf/Strings.es.xlf | 8 ++++---- src/MSBuild/Resources/xlf/Strings.fr.xlf | 8 ++++---- src/MSBuild/Resources/xlf/Strings.it.xlf | 8 ++++---- src/MSBuild/Resources/xlf/Strings.ja.xlf | 9 +++++---- src/MSBuild/Resources/xlf/Strings.ko.xlf | 8 ++++---- src/MSBuild/Resources/xlf/Strings.pl.xlf | 8 ++++---- src/MSBuild/Resources/xlf/Strings.pt-BR.xlf | 8 ++++---- src/MSBuild/Resources/xlf/Strings.ru.xlf | 8 ++++---- src/MSBuild/Resources/xlf/Strings.tr.xlf | 9 +++++---- src/MSBuild/Resources/xlf/Strings.zh-Hans.xlf | 8 ++++---- src/MSBuild/Resources/xlf/Strings.zh-Hant.xlf | 8 ++++---- 13 files changed, 54 insertions(+), 52 deletions(-) diff --git a/src/MSBuild/Resources/xlf/Strings.cs.xlf b/src/MSBuild/Resources/xlf/Strings.cs.xlf index 0d9718eaf25..0ac4e5b2af1 100644 --- a/src/MSBuild/Resources/xlf/Strings.cs.xlf +++ b/src/MSBuild/Resources/xlf/Strings.cs.xlf @@ -319,10 +319,10 @@ BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + Povolí během sestavení BuildChecks. + BuildCheck umožňuje vyhodnocovat pravidla, aby se zajistily vlastnosti + sestavení. Další informace viz aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.de.xlf b/src/MSBuild/Resources/xlf/Strings.de.xlf index 4f971dc7a11..0bd566b08c0 100644 --- a/src/MSBuild/Resources/xlf/Strings.de.xlf +++ b/src/MSBuild/Resources/xlf/Strings.de.xlf @@ -319,10 +319,10 @@ BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + Aktiviert BuildChecks während des Builds. + BuildCheck ermöglicht die Regelauswertung, um Eigenschaften + des Builds sicherzustellen. Weitere Infos: aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.es.xlf b/src/MSBuild/Resources/xlf/Strings.es.xlf index 323cfc2d78f..0772f58c6ef 100644 --- a/src/MSBuild/Resources/xlf/Strings.es.xlf +++ b/src/MSBuild/Resources/xlf/Strings.es.xlf @@ -318,10 +318,10 @@ Esta marca es experimental y puede que no funcione según lo previsto. BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + Habilita BuildChecks durante la compilación. + BuildCheck permite evaluar reglas para garantizar que las propiedades + de la compilación. Para obtener más información, consulte aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.fr.xlf b/src/MSBuild/Resources/xlf/Strings.fr.xlf index ca5f39d196b..53e83e8352b 100644 --- a/src/MSBuild/Resources/xlf/Strings.fr.xlf +++ b/src/MSBuild/Resources/xlf/Strings.fr.xlf @@ -319,10 +319,10 @@ futures BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + Active BuildChecks pendant la construction. + BuildCheck permet d'évaluer les règles pour garantir les propriétés + de la construction. Pour plus d'informations, consultez aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.it.xlf b/src/MSBuild/Resources/xlf/Strings.it.xlf index 400f99d4116..39f96bd265d 100644 --- a/src/MSBuild/Resources/xlf/Strings.it.xlf +++ b/src/MSBuild/Resources/xlf/Strings.it.xlf @@ -319,10 +319,10 @@ Questo flag è sperimentale e potrebbe non funzionare come previsto. BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + Abilita BuildChecks durante la compilazione. + BuildCheck consente di valutare le regole per garantire le proprietà + della compilazione. Per altre informazioni, vedere aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.ja.xlf b/src/MSBuild/Resources/xlf/Strings.ja.xlf index 373a98e2fa1..b374332191a 100644 --- a/src/MSBuild/Resources/xlf/Strings.ja.xlf +++ b/src/MSBuild/Resources/xlf/Strings.ja.xlf @@ -319,10 +319,11 @@ BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + ビルド中に BuildChecks を有効にします。 + BuildCheck を使用すると、ビルドのプロパティ + を保証するための + ルールを評価できます。詳細については、aka.ms/buildcheck を参照してください {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.ko.xlf b/src/MSBuild/Resources/xlf/Strings.ko.xlf index 2688b9fd604..841e6e88e24 100644 --- a/src/MSBuild/Resources/xlf/Strings.ko.xlf +++ b/src/MSBuild/Resources/xlf/Strings.ko.xlf @@ -319,10 +319,10 @@ BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + 빌드하는 동안 BuildChecks를 사용하도록 설정합니다. + BuildCheck를 사용하면 규칙을 평가하여 빌드의 속성을 + 확인할 수 있습니다. 자세한 내용은 aka.ms/buildcheck를 참조하세요. {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.pl.xlf b/src/MSBuild/Resources/xlf/Strings.pl.xlf index 1f126cf575e..6698f75f31b 100644 --- a/src/MSBuild/Resources/xlf/Strings.pl.xlf +++ b/src/MSBuild/Resources/xlf/Strings.pl.xlf @@ -318,10 +318,10 @@ Ta flaga jest eksperymentalna i może nie działać zgodnie z oczekiwaniami. BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + Włącza funkcję BuildChecks podczas kompilacji. + Funkcja BuildCheck umożliwia ocenę reguł w celu zapewnienia właściwości + kompilacji. Aby uzyskać więcej informacji, zobacz aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.pt-BR.xlf b/src/MSBuild/Resources/xlf/Strings.pt-BR.xlf index 346503dd04c..79df937a677 100644 --- a/src/MSBuild/Resources/xlf/Strings.pt-BR.xlf +++ b/src/MSBuild/Resources/xlf/Strings.pt-BR.xlf @@ -318,10 +318,10 @@ BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + Habilita BuildChecks durante o build. + BuildCheck habilita a avaliação de regras para garantir que as propriedades + do build. Para obter mais informações, confira aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.ru.xlf b/src/MSBuild/Resources/xlf/Strings.ru.xlf index 921cee13c05..500a5e90517 100644 --- a/src/MSBuild/Resources/xlf/Strings.ru.xlf +++ b/src/MSBuild/Resources/xlf/Strings.ru.xlf @@ -318,10 +318,10 @@ BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + Включает BuildChecks во время сборки. + BuildCheck дает оценивать правила для проверки свойств + сборки. Дополнительные сведения см. на странице aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.tr.xlf b/src/MSBuild/Resources/xlf/Strings.tr.xlf index 535ff0a7672..bec01683446 100644 --- a/src/MSBuild/Resources/xlf/Strings.tr.xlf +++ b/src/MSBuild/Resources/xlf/Strings.tr.xlf @@ -318,10 +318,11 @@ BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + Derleme sırasında BuildChecks'i sağlar. + BuildCheck, derleme özelliklerinin + güvenliğini sağlamak için + kuralların değerlendirilmesini sağlar. Daha fazla bilgi için bkz. aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.zh-Hans.xlf b/src/MSBuild/Resources/xlf/Strings.zh-Hans.xlf index f3774effb90..c127b90e612 100644 --- a/src/MSBuild/Resources/xlf/Strings.zh-Hans.xlf +++ b/src/MSBuild/Resources/xlf/Strings.zh-Hans.xlf @@ -318,10 +318,10 @@ BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + 在生成中启用 BuildChecks。 + BuildCheck 允许评估规则以确保生成的 + 属性。有关详细信息,请参阅 aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} diff --git a/src/MSBuild/Resources/xlf/Strings.zh-Hant.xlf b/src/MSBuild/Resources/xlf/Strings.zh-Hant.xlf index 0164225f3ad..7f1b2be29b3 100644 --- a/src/MSBuild/Resources/xlf/Strings.zh-Hant.xlf +++ b/src/MSBuild/Resources/xlf/Strings.zh-Hant.xlf @@ -319,10 +319,10 @@ BuildCheck enables evaluating rules to ensure properties of the build. For more info see aka.ms/buildcheck - -check - Enables BuildChecks during the build. - BuildCheck enables evaluating rules to ensure properties - of the build. For more info see aka.ms/buildcheck + -check + 在建置期間啟用 BuildChecks。 + BuildCheck 啟用評估規則以確保組建的 + 屬性。如需詳細資訊,請參閱 aka.ms/buildcheck {Locked="-check"}{Locked="BuildChecks"}{Locked="BuildCheck"} From 9f26687a3bd660f2478f865203402f48a0337778 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 10:24:47 +0800 Subject: [PATCH 03/22] [main] Update dependencies from dotnet/roslyn, nuget/nuget.client (#10688) * Update dependencies from https://github.com/dotnet/roslyn build 20240920.11 Microsoft.SourceBuild.Intermediate.roslyn , Microsoft.Net.Compilers.Toolset From Version 4.12.0-3.24463.9 -> To Version 4.12.0-3.24470.11 * Update dependencies from https://github.com/nuget/nuget.client build 6.12.0.112 NuGet.Build.Tasks From Version 6.12.0-rc.106 -> To Version 6.12.0-rc.112 --------- Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 12 ++++++------ eng/Versions.props | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 428c37dce97..047444afd70 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -85,17 +85,17 @@ https://github.com/dotnet/arcade 04b9022eba9c184a8036328af513c22e6949e8b6 - + https://github.com/nuget/nuget.client - 2982dbfc1bac22d71234d8498af6ad43e129a49c + 502e691d67590946d0a4765a25f1da2b6d6c32fc - + https://github.com/dotnet/roslyn - df4ae6b81013ac45367372176b9c3135a35a7e3c + 54fd790788b03c256f736c917fc368daf0a643db - + https://github.com/dotnet/roslyn - df4ae6b81013ac45367372176b9c3135a35a7e3c + 54fd790788b03c256f736c917fc368daf0a643db diff --git a/eng/Versions.props b/eng/Versions.props index 2d0626911d3..5c903ad99e3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -52,8 +52,8 @@ 9.0.0-beta.24466.2 7.0.0 6.0.1 - 4.12.0-3.24463.9 - 6.12.0-rc.106 + 4.12.0-3.24470.11 + 6.12.0-rc.112 6.0.0 From 5ef4a3fbdc1e0590065a73589009bfc41ae8c673 Mon Sep 17 00:00:00 2001 From: Mariana Dematte Date: Tue, 24 Sep 2024 02:18:58 -0700 Subject: [PATCH 04/22] update localization comment (#10694) Part of: #10665 Updating the localization comment so changes do not get merged automatically. --- .vsts-dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vsts-dotnet.yml b/.vsts-dotnet.yml index 568f2af4ae9..f48e7b71850 100644 --- a/.vsts-dotnet.yml +++ b/.vsts-dotnet.yml @@ -34,7 +34,7 @@ variables: - name: SourceBranch value: '' - name: EnableReleaseOneLocBuild - value: true # Enable loc for vs17.12 + value: true # Enable loc for vs17.13 - name: Codeql.Enabled value: true - group: DotNet-MSBuild-SDLValidation-Params From 1b85ee434a86f32c045bd625add9ba3c6aa9141b Mon Sep 17 00:00:00 2001 From: YuliiaKovalova <95473390+YuliiaKovalova@users.noreply.github.com> Date: Wed, 25 Sep 2024 09:51:59 +0200 Subject: [PATCH 05/22] update msbuild logo (#10699) --- branding/MSBuild-Icon.png | Bin 976 -> 2158 bytes branding/MSBuild-Logo.png | Bin 61603 -> 34342 bytes branding/MSBuild-NuGet-Icon.png | Bin 9922 -> 4077 bytes branding/README.md | 4 ++-- src/Directory.Build.props | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/branding/MSBuild-Icon.png b/branding/MSBuild-Icon.png index cafd831d2addaedfcb88d4549359a98bd375d00f..d769a8aa1d4097790cf6b5f38c5b05a1f699f0c4 100644 GIT binary patch delta 2152 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 diff --git a/branding/MSBuild-Logo.png b/branding/MSBuild-Logo.png index 7309f7bcabf27174c6f8be025feaeb55414abd4b..db9a1a450033ac4332aaac9e4395bb46ce5ed4d7 100644 GIT binary patch literal 34342 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�o$yaLIsVQZFL`Ra}kf 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 diff --git a/branding/MSBuild-NuGet-Icon.png b/branding/MSBuild-NuGet-Icon.png index d51ddc13cd82b0509ae826242861d61962534b7d..b502fda8f5db425e2e8bf54d111a817fea58cc6c 100644 GIT binary patch delta 4059 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 N002ovPDHLkV1ihjr#t`v literal 9922 zcmV;zCOz4SP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}000}^Nkl(lX1|!JZi(t&ZKgXu6kTi>+(cvD&ffd?`~H5v@9%Ndt#^Ey zox3X-2eBr5Yyv(A{0{gqAQT=VLSJ8nN~J=x*`(EK6GhQ`fE~amj4=-{Teg&W^X9RC z|9)DnHcBaa9%I0rz!Sh<_I@ZLEL*mefq?-IA3n_F

one*`#HMD9X(eAVg|l*?rf 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 A4FCWD diff --git a/branding/README.md b/branding/README.md index 0758e104c37..0f63eb314e4 100644 --- a/branding/README.md +++ b/branding/README.md @@ -9,8 +9,8 @@ This image is the original graphic used for creating the MSBuild icon. It was p This image is an original graphic created by Immo Landwerth. It can be used for images where the size is required to be larger than the MSBuild-Icon.png. ## MSBuild-NuGet-Icon.png ![MSBuild-NuGet-Icon.png](MSBuild-NuGet-Icon.png?raw=true) -This image is used by the NuGet packages as the ````. Its raw location in this repo is used by the forwarding link [https://go.microsoft.com/fwlink/?linkid=825694](https://go.microsoft.com/fwlink/?linkid=825694). If it is moved, please update the link. +This image is used by the NuGet packages as the ````. Its raw location in this repo is used by the forwarding link [https://aka.ms/msbuildicon](https://aka.ms/msbuildicon). If it is moved, please update the link. If the below image loads, then the forwarding link is working. -![MSBuild-NuGet-Icon from the forwarding link](https://go.microsoft.com/fwlink/?linkid=825694) \ No newline at end of file +![MSBuild-NuGet-Icon from the forwarding link](https://aka.ms/msbuildicon) \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 2fa5a6e3c7d..2263f0eef57 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -59,7 +59,7 @@ http://go.microsoft.com/fwlink/?LinkId=329770 http://go.microsoft.com/fwlink/?LinkId=624683 - https://go.microsoft.com/fwlink/?linkid=825694 + https://aka.ms/msbuildicon $(VisualStudioSetupOutputPath)DevDivPackages\ From 45b1276ca3be08f6bcb17d61213d6d90f6afd042 Mon Sep 17 00:00:00 2001 From: Mariana Dematte Date: Wed, 25 Sep 2024 00:54:51 -0700 Subject: [PATCH 06/22] Update merge flow (#10692) Part of: #10665 Updating branch flow from 17.11 -> 17.12 -> main. --- .config/git-merge-flow-config.jsonc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.config/git-merge-flow-config.jsonc b/.config/git-merge-flow-config.jsonc index a58d3e867ea..a6c94f2ea83 100644 --- a/.config/git-merge-flow-config.jsonc +++ b/.config/git-merge-flow-config.jsonc @@ -26,8 +26,12 @@ "vs17.10": { "MergeToBranch": "vs17.11" }, - // MSBuild latest release to main + // Automate opening PRs to merge msbuild's vs17.11 (SDK 8.0.4xx) into vs17.12 (SDK 9.0.1xx) "vs17.11": { + "MergeToBranch": "vs17.12" + }, + // MSBuild latest release to main + "vs17.12": { "MergeToBranch": "main" } } From 87d662a198e74b2d9e7f503e6ca21231900b1031 Mon Sep 17 00:00:00 2001 From: YuliiaKovalova <95473390+YuliiaKovalova@users.noreply.github.com> Date: Wed, 25 Sep 2024 10:16:46 +0200 Subject: [PATCH 07/22] Add designtime target import (#10698) --- src/Tasks/Microsoft.CSharp.CurrentVersion.targets | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Tasks/Microsoft.CSharp.CurrentVersion.targets b/src/Tasks/Microsoft.CSharp.CurrentVersion.targets index 4e348de04aa..67b7264b0b2 100644 --- a/src/Tasks/Microsoft.CSharp.CurrentVersion.targets +++ b/src/Tasks/Microsoft.CSharp.CurrentVersion.targets @@ -384,6 +384,8 @@ using System.Reflection%3b <_ExplicitReference Include="$(FrameworkPathOverride)\mscorlib.dll" /> + + From 6bae205631c8baf42e9073d0a5d8fc8f0703e508 Mon Sep 17 00:00:00 2001 From: Jan Krivanek Date: Thu, 26 Sep 2024 13:13:31 +0200 Subject: [PATCH 08/22] Clarify the acquisition topic (#10636) --- documentation/specs/BuildCheck/BuildCheck-Architecture.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/specs/BuildCheck/BuildCheck-Architecture.md b/documentation/specs/BuildCheck/BuildCheck-Architecture.md index 87c6a30b30e..2d111ac77fa 100644 --- a/documentation/specs/BuildCheck/BuildCheck-Architecture.md +++ b/documentation/specs/BuildCheck/BuildCheck-Architecture.md @@ -106,7 +106,7 @@ How we'll internally handle the distributed model: Planned model: * Checks factories get registered with the BuildCheck infrastructure (`BuildCheckManager`) * For inbox checks - this happens on startup. - * For custom checks - this happens on connecting `ILogger` instance in scheduler node receives acquistion event (`BuildCheckAcquisitionEventArgs`). This event is being sent by worker node as soon as it hits a special marker (a magic property function call) during early evaluation. Loading is not processed by worker node as currently we want custom checks only in the main node (as they will be only given data proxied from BuildEventArgs). + * For custom checks - this happens on connecting `ILogger` instance in scheduler node receives acquistion event (`BuildCheckAcquisitionEventArgs`). This event is being sent by worker node as soon as it hits a special marker (a magic property function call) during early evaluation. Loading is not processed by worker node as currently we want custom checks only in the main node (as they will be only given data proxied from BuildEventArgs). Loading in worker node in Evaluation context would result in double work as the custom Check needs to be loaded in the main node anyways. The `BuildCheckAcquisitionEventArgs` should be sent prior `ProjectEvaluationStartedEventArgs` (buffering will need to take place), or main node will need to replay some initial data after custom check is registered. * `BuildCheckManager` receives info about new project starting to be build * On scheduler node the information is sourced from `ProjectEvaluationStartedEventArgs` @@ -136,6 +136,8 @@ Since we are unlikely to enable any checks by default in .NET 9, the focus in th # Acquisition +(For details on internals of processing acquisition by the infrastructure see [Check Lifecycle](#check-lifecycle)) + BuildCheck employs two distinct types of checks: inbox and custom. As a result, the acquisition and distribution processes vary. Inbox rules are integrated into the MSBuild repository, while custom checks can be packaged as NuGet packages and detected by MSBuild provided they adhere to a specific structure. From 2ef5c7b7fb40ea2774f158efe1b4826d04c41f04 Mon Sep 17 00:00:00 2001 From: Jan Krivanek Date: Thu, 26 Sep 2024 13:14:29 +0200 Subject: [PATCH 09/22] Move back accidentally moved specs (#10687) --- .../interactive-package-references.md | 0 .../packagessourcing-control-flow.jpg | Bin .../{BuildCheck => proposed}/security-metadata.md | 0 .../sourcing-vs-context.png | Bin 4 files changed, 0 insertions(+), 0 deletions(-) rename documentation/specs/{BuildCheck => proposed}/interactive-package-references.md (100%) rename documentation/specs/{BuildCheck => proposed}/packagessourcing-control-flow.jpg (100%) rename documentation/specs/{BuildCheck => proposed}/security-metadata.md (100%) rename documentation/specs/{BuildCheck => proposed}/sourcing-vs-context.png (100%) diff --git a/documentation/specs/BuildCheck/interactive-package-references.md b/documentation/specs/proposed/interactive-package-references.md similarity index 100% rename from documentation/specs/BuildCheck/interactive-package-references.md rename to documentation/specs/proposed/interactive-package-references.md diff --git a/documentation/specs/BuildCheck/packagessourcing-control-flow.jpg b/documentation/specs/proposed/packagessourcing-control-flow.jpg similarity index 100% rename from documentation/specs/BuildCheck/packagessourcing-control-flow.jpg rename to documentation/specs/proposed/packagessourcing-control-flow.jpg diff --git a/documentation/specs/BuildCheck/security-metadata.md b/documentation/specs/proposed/security-metadata.md similarity index 100% rename from documentation/specs/BuildCheck/security-metadata.md rename to documentation/specs/proposed/security-metadata.md diff --git a/documentation/specs/BuildCheck/sourcing-vs-context.png b/documentation/specs/proposed/sourcing-vs-context.png similarity index 100% rename from documentation/specs/BuildCheck/sourcing-vs-context.png rename to documentation/specs/proposed/sourcing-vs-context.png From ab7c28995f198f717aa5fb823e6fc36cadf42254 Mon Sep 17 00:00:00 2001 From: Jan Krivanek Date: Thu, 26 Sep 2024 13:14:42 +0200 Subject: [PATCH 10/22] Specify packages list to publish in release-checklist.md (#10686) --- documentation/release-checklist.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/documentation/release-checklist.md b/documentation/release-checklist.md index 9d86581f0b5..d73cf229d7e 100644 --- a/documentation/release-checklist.md +++ b/documentation/release-checklist.md @@ -60,6 +60,18 @@ _(This is for the case where we create the branch too early and want it to be ba Timing based on the [(Microsoft-internal) release schedule](https://dev.azure.com/devdiv/DevDiv/_wiki/wikis/DevDiv.wiki/10097/Dev17-Release). - [ ] Push packages to nuget.org (not currently automated, contact dnceng - search "Publish MSBuild 17.6 to NuGet.org" email subject for template). + + Following packages should be published (`THIS_RELEASE_EXACT_VERSION` is equal to `VersionPrefix` that comes form the eng\Version.props, that were part of the build we are trying to get published): + - Microsoft.Build.Utilities.Core.{{THIS_RELEASE_EXACT_VERSION}}.nupkg + - Microsoft.Build.{{THIS_RELEASE_EXACT_VERSION}}.nupkg + - Microsoft.Build.Framework.{{THIS_RELEASE_EXACT_VERSION}}.nupkg + - Microsoft.Build.Runtime.{{THIS_RELEASE_EXACT_VERSION}}.nupkg + - Microsoft.Build.Tasks.Core.{{THIS_RELEASE_EXACT_VERSION}}.nupkg + - Microsoft.NET.StringTools.{{THIS_RELEASE_EXACT_VERSION}}.nupkg + - Microsoft.Build.Templates.{{THIS_RELEASE_EXACT_VERSION}}.nupkg + + **Note:** Microsoft.Build.Conversion.Core and Microsoft.Build.Engine are **not** part of the list. Microsoft.Build.Templates **is** part of the list. Those 3 packages are a difference to the historic publishing list. + - [ ] Publish docs: submit reference request at https://aka.ms/publishondocs - Click on the link labeled *Request – Reference Publishing* - You can use existing [ticket](https://dev.azure.com/msft-skilling/Content/_workitems/edit/183613) as a reference From 37c8fdb103be7afc3c044a5cd6f3c2de08331701 Mon Sep 17 00:00:00 2001 From: YuliiaKovalova <95473390+YuliiaKovalova@users.noreply.github.com> Date: Mon, 30 Sep 2024 19:48:23 +0200 Subject: [PATCH 11/22] Remove DesignTimeBuild restriction (#10732) * remove DesignTime restriction * add msbuildruntimetype condition --- src/Tasks/Microsoft.CSharp.CurrentVersion.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tasks/Microsoft.CSharp.CurrentVersion.targets b/src/Tasks/Microsoft.CSharp.CurrentVersion.targets index 67b7264b0b2..60045885791 100644 --- a/src/Tasks/Microsoft.CSharp.CurrentVersion.targets +++ b/src/Tasks/Microsoft.CSharp.CurrentVersion.targets @@ -384,7 +384,7 @@ using System.Reflection%3b <_ExplicitReference Include="$(FrameworkPathOverride)\mscorlib.dll" /> - + From 2935bcd9f5e6b89204dac3db9126ad7464aa2272 Mon Sep 17 00:00:00 2001 From: David Federman Date: Tue, 1 Oct 2024 11:10:12 -0700 Subject: [PATCH 12/22] Fix setting ProjectMetadataElement.Name (#10673) * Fix setting ProjectMetadataElement.Name * Fix xmldoc --- .../Construction/ConstructionEditing_Tests.cs | 38 +++++++++++++++++++ .../Construction/ProjectElementContainer.cs | 17 +++++++++ .../Construction/ProjectMetadataElement.cs | 3 ++ 3 files changed, 58 insertions(+) diff --git a/src/Build.OM.UnitTests/Construction/ConstructionEditing_Tests.cs b/src/Build.OM.UnitTests/Construction/ConstructionEditing_Tests.cs index 06827f116b9..6cd24d2c366 100644 --- a/src/Build.OM.UnitTests/Construction/ConstructionEditing_Tests.cs +++ b/src/Build.OM.UnitTests/Construction/ConstructionEditing_Tests.cs @@ -3137,6 +3137,44 @@ public void AddMetadataAsAttributeAndAsElement() Helpers.VerifyAssertProjectContent(expected, project); } + [Fact] + public void SetMetadataName() + { + var project = ProjectRootElement.Create(); + var itemGroup = project.AddItemGroup(); + + var item = itemGroup.AddItem("i1", "i"); + var attributeMetadata = item.AddMetadata("A", "value_a", expressAsAttribute: true); + var elementMetadata = item.AddMetadata("B", "value_b", expressAsAttribute: false); + + string expected = """ + + + + value_b + + + + """; + + Helpers.VerifyAssertProjectContent(expected, project); + + attributeMetadata.Name = "A2"; + elementMetadata.Name = "B2"; + + expected = """ + + + + value_b + + + + """; + + Helpers.VerifyAssertProjectContent(expected, project); + } + ///

/// Legally modify a child whose parent is not parented (should not throw) /// diff --git a/src/Build/Construction/ProjectElementContainer.cs b/src/Build/Construction/ProjectElementContainer.cs index d2386dc8028..72390d44565 100644 --- a/src/Build/Construction/ProjectElementContainer.cs +++ b/src/Build/Construction/ProjectElementContainer.cs @@ -448,6 +448,23 @@ private void SetElementAsAttributeValue(ProjectElement child) ProjectXmlUtilities.SetOrRemoveAttribute(XmlElement, child.XmlElement.Name, value); } + /// + /// If child "element" is actually represented as an attribute, update the name in the corresponding Xml attribute + /// + /// A child element which might be represented as an attribute + /// The old name for the child element + internal void UpdateElementName(ProjectElement child, string oldName) + { + ErrorUtilities.VerifyThrow(Link == null, "External project"); + + if (child.ExpressedAsAttribute) + { + // To rename an attribute, we have to fully remove the old one and add a new one. + XmlElement.RemoveAttribute(oldName); + SetElementAsAttributeValue(child); + } + } + /// /// If child "element" is actually represented as an attribute, update the value in the corresponding Xml attribute /// diff --git a/src/Build/Construction/ProjectMetadataElement.cs b/src/Build/Construction/ProjectMetadataElement.cs index 0d6b355e117..ce79f79ba40 100644 --- a/src/Build/Construction/ProjectMetadataElement.cs +++ b/src/Build/Construction/ProjectMetadataElement.cs @@ -134,11 +134,14 @@ internal void ChangeName(string newName) ValidateValidMetadataAsAttributeName(newName, Parent.ElementName, Parent.Location); } + string oldName = XmlElement.Name; + // Because the element was created from our special XmlDocument, we know it's // an XmlElementWithLocation. XmlElementWithLocation newElement = XmlUtilities.RenameXmlElement(XmlElement, newName, XmlElement.NamespaceURI); ReplaceElement(newElement); + Parent.UpdateElementName(this, oldName); } internal static void ValidateValidMetadataAsAttributeName(string name, string parentName, IElementLocation parentLocation) From 605e3f3abaabb1eb90e40977679d7de37e30630f Mon Sep 17 00:00:00 2001 From: Mariana Dematte Date: Tue, 1 Oct 2024 13:26:34 -0700 Subject: [PATCH 13/22] Branding for 17.13 (#10703) Co-authored-by: YuliiaKovalova <95473390+YuliiaKovalova@users.noreply.github.com> Co-authored-by: YuliiaKovalova --- eng/Versions.props | 4 +- src/Build/CompatibilitySuppressions.xml | 296 -------------------- src/BuildCheck.UnitTests/EndToEndTests.cs | 8 +- src/Framework/CompatibilitySuppressions.xml | 85 +----- src/Tasks/CompatibilitySuppressions.xml | 85 +----- src/Utilities/CompatibilitySuppressions.xml | 57 +--- 6 files changed, 19 insertions(+), 516 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 5c903ad99e3..b3ec8d26ca5 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -2,8 +2,8 @@ - 17.12.0 - 17.11.4 + 17.13.0 + 17.12.0-preview-24476-01 15.1.0.0 preview true diff --git a/src/Build/CompatibilitySuppressions.xml b/src/Build/CompatibilitySuppressions.xml index 0979a70a8c1..05317adadab 100644 --- a/src/Build/CompatibilitySuppressions.xml +++ b/src/Build/CompatibilitySuppressions.xml @@ -1,300 +1,4 @@  - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.AnalysisData - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.BuildAnalyzer - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.BuildAnalyzerConfiguration - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.BuildAnalyzerResultSeverity - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.BuildAnalyzerRule - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.EvaluatedPropertiesAnalysisData - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.EvaluationAnalysisScope - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.ParsedItemsAnalysisData - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.TaskInvocationAnalysisData - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.AnalysisData - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.BuildAnalyzer - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.BuildAnalyzerConfiguration - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.BuildAnalyzerResultSeverity - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.BuildAnalyzerRule - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.EvaluatedPropertiesAnalysisData - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.EvaluationAnalysisScope - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.ParsedItemsAnalysisData - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0001 - T:Microsoft.Build.Experimental.BuildCheck.TaskInvocationAnalysisData - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.BuildCheckResult.#ctor(Microsoft.Build.Experimental.BuildCheck.BuildAnalyzerRule,Microsoft.Build.Construction.ElementLocation,System.String[]) - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.BuildCheckResult.Create(Microsoft.Build.Experimental.BuildCheck.BuildAnalyzerRule,Microsoft.Build.Construction.ElementLocation,System.String[]) - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.BuildCheckResult.get_BuildAnalyzerRule - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.BuildCheckResult.get_Location - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterEvaluatedPropertiesAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.EvaluatedPropertiesAnalysisData}}) - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterParsedItemsAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.ParsedItemsAnalysisData}}) - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterTaskInvocationAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.TaskInvocationAnalysisData}}) - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.BuildCheckResult.#ctor(Microsoft.Build.Experimental.BuildCheck.BuildAnalyzerRule,Microsoft.Build.Construction.ElementLocation,System.String[]) - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.BuildCheckResult.Create(Microsoft.Build.Experimental.BuildCheck.BuildAnalyzerRule,Microsoft.Build.Construction.ElementLocation,System.String[]) - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.BuildCheckResult.get_BuildAnalyzerRule - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.BuildCheckResult.get_Location - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterEvaluatedPropertiesAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.EvaluatedPropertiesAnalysisData}}) - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterParsedItemsAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.ParsedItemsAnalysisData}}) - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0002 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterTaskInvocationAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.TaskInvocationAnalysisData}}) - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0006 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterBuildFinishedAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.BuildFinishedCheckData}}) - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0006 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterEnvironmentVariableReadAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.EnvironmentVariableCheckData}}) - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0006 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterEvaluatedPropertiesAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.EvaluatedPropertiesCheckData}}) - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0006 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterParsedItemsAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.ParsedItemsCheckData}}) - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0006 - M:Microsoft.Build.Experimental.BuildCheck.IBuildCheckRegistrationContext.RegisterTaskInvocationAction(System.Action{Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext{Microsoft.Build.Experimental.BuildCheck.TaskInvocationCheckData}}) - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0021 - T:Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext`1``0:T:Microsoft.Build.Experimental.BuildCheck.AnalysisData - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0021 - T:Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext`1``0:T:Microsoft.Build.Experimental.BuildCheck.CheckData - lib/net472/Microsoft.Build.dll - lib/net472/Microsoft.Build.dll - true - - - CP0021 - T:Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext`1``0:T:Microsoft.Build.Experimental.BuildCheck.AnalysisData - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - CP0021 - T:Microsoft.Build.Experimental.BuildCheck.BuildCheckDataContext`1``0:T:Microsoft.Build.Experimental.BuildCheck.CheckData - ref/net472/Microsoft.Build.dll - ref/net472/Microsoft.Build.dll - true - - - - PKV006 - net8.0 - diff --git a/src/BuildCheck.UnitTests/EndToEndTests.cs b/src/BuildCheck.UnitTests/EndToEndTests.cs index 622609dc5f2..58891677b6a 100644 --- a/src/BuildCheck.UnitTests/EndToEndTests.cs +++ b/src/BuildCheck.UnitTests/EndToEndTests.cs @@ -276,7 +276,7 @@ public void EditorConfig_SeverityAppliedCorrectly(string BC0101Severity, string? } } - [Fact] + [Fact(Skip = "https://github.com/dotnet/msbuild/issues/10702")] public void CheckHasAccessToAllConfigs() { using (var env = TestEnvironment.Create()) @@ -454,7 +454,7 @@ public void NoEnvironmentVariableProperty_DeferredProcessing(bool warnAsError, b } } - [Theory] + [Theory(Skip = "https://github.com/dotnet/msbuild/issues/10702")] [InlineData("CheckCandidate", new[] { "CustomRule1", "CustomRule2" })] [InlineData("CheckCandidateWithMultipleChecksInjected", new[] { "CustomRule1", "CustomRule2", "CustomRule3" }, true)] public void CustomCheckTest_NoEditorConfig(string checkCandidate, string[] expectedRegisteredRules, bool expectedRejectedChecks = false) @@ -487,7 +487,7 @@ public void CustomCheckTest_NoEditorConfig(string checkCandidate, string[] expec } } - [Theory] + [Theory(Skip = "https://github.com/dotnet/msbuild/issues/10702")] [InlineData("CheckCandidate", "X01234", "error", "error X01234")] [InlineData("CheckCandidateWithMultipleChecksInjected", "X01234", "warning", "warning X01234")] public void CustomCheckTest_WithEditorConfig(string checkCandidate, string ruleId, string severity, string expectedMessage) @@ -514,7 +514,7 @@ public void CustomCheckTest_WithEditorConfig(string checkCandidate, string ruleI } } - [Theory] + [Theory(Skip = "https://github.com/dotnet/msbuild/issues/10702")] [InlineData("X01236", "Something went wrong initializing")] // These tests are for failure one different points, will be addressed in a different PR // https://github.com/dotnet/msbuild/issues/10522 diff --git a/src/Framework/CompatibilitySuppressions.xml b/src/Framework/CompatibilitySuppressions.xml index 23bea3c7b5b..d61bb3c6b1f 100644 --- a/src/Framework/CompatibilitySuppressions.xml +++ b/src/Framework/CompatibilitySuppressions.xml @@ -1,5 +1,5 @@  - + PKV004 @@ -49,85 +49,4 @@ PKV004 Xamarin.XboxOne,Version=v0.0 - - - CP0008 - T:Microsoft.Build.Framework.AssemblyLoadingContext - ref/net8.0/Microsoft.Build.Framework.dll - ref/netstandard2.0/Microsoft.Build.Framework.dll - true - - - CP0008 - T:Microsoft.Build.Framework.FeatureStatus - ref/net8.0/Microsoft.Build.Framework.dll - ref/netstandard2.0/Microsoft.Build.Framework.dll - true - - - CP0008 - T:Microsoft.Build.Framework.LoggerVerbosity - ref/net8.0/Microsoft.Build.Framework.dll - ref/netstandard2.0/Microsoft.Build.Framework.dll - true - - - CP0008 - T:Microsoft.Build.Framework.MessageImportance - ref/net8.0/Microsoft.Build.Framework.dll - ref/netstandard2.0/Microsoft.Build.Framework.dll - true - - - CP0008 - T:Microsoft.Build.Framework.Profiler.EvaluationLocationKind - ref/net8.0/Microsoft.Build.Framework.dll - ref/netstandard2.0/Microsoft.Build.Framework.dll - true - - - CP0008 - T:Microsoft.Build.Framework.Profiler.EvaluationPass - ref/net8.0/Microsoft.Build.Framework.dll - ref/netstandard2.0/Microsoft.Build.Framework.dll - true - - - CP0008 - T:Microsoft.Build.Framework.RegisteredTaskObjectLifetime - ref/net8.0/Microsoft.Build.Framework.dll - ref/netstandard2.0/Microsoft.Build.Framework.dll - true - - - CP0008 - T:Microsoft.Build.Framework.TargetBuiltReason - ref/net8.0/Microsoft.Build.Framework.dll - ref/netstandard2.0/Microsoft.Build.Framework.dll - true - - - CP0008 - T:Microsoft.Build.Framework.TargetSkipReason - ref/net8.0/Microsoft.Build.Framework.dll - ref/netstandard2.0/Microsoft.Build.Framework.dll - true - - - CP0008 - T:Microsoft.Build.Framework.TaskParameterMessageKind - ref/net8.0/Microsoft.Build.Framework.dll - ref/netstandard2.0/Microsoft.Build.Framework.dll - true - - - - PKV006 - net8.0 - - + \ No newline at end of file diff --git a/src/Tasks/CompatibilitySuppressions.xml b/src/Tasks/CompatibilitySuppressions.xml index f7865631aa7..6e6f63a5eb6 100644 --- a/src/Tasks/CompatibilitySuppressions.xml +++ b/src/Tasks/CompatibilitySuppressions.xml @@ -1,10 +1,10 @@  - + + TaskRequiresFramework on netstandard/netcore. Since the type is sealed there, + that shouldn't cause any implementation problems since no one can derive + from it and try to call TaskExtension.Log. --> CP0007 T:Microsoft.Build.Tasks.AL @@ -71,18 +71,11 @@ ref/netstandard2.0/Microsoft.Build.Tasks.Core.dll ref/net472/Microsoft.Build.Tasks.Core.dll - - - + This is intentional, because you can only use MSBuild in the context of a .NET SDK + (on net7.0, as of MSBuild 17.4) or in the context of Visual Studio (net472), but we + have previously shipped netstandard2.0 packages, and if you want to support both + runtime contexts it still makes sense to target that. --> PKV004 .NETCoreApp,Version=v2.0 @@ -131,64 +124,4 @@ PKV004 Xamarin.XboxOne,Version=v0.0 - - - CP0008 - T:Microsoft.Build.Tasks.Deployment.Bootstrapper.BuildMessageSeverity - ref/net8.0/Microsoft.Build.Tasks.Core.dll - ref/netstandard2.0/Microsoft.Build.Tasks.Core.dll - true - - - CP0008 - T:Microsoft.Build.Tasks.Deployment.Bootstrapper.ComponentsLocation - ref/net8.0/Microsoft.Build.Tasks.Core.dll - ref/netstandard2.0/Microsoft.Build.Tasks.Core.dll - true - - - CP0008 - T:Microsoft.Build.Tasks.Deployment.ManifestUtilities.AssemblyIdentity.FullNameFlags - ref/net8.0/Microsoft.Build.Tasks.Core.dll - ref/netstandard2.0/Microsoft.Build.Tasks.Core.dll - true - - - CP0008 - T:Microsoft.Build.Tasks.Deployment.ManifestUtilities.AssemblyReferenceType - ref/net8.0/Microsoft.Build.Tasks.Core.dll - ref/netstandard2.0/Microsoft.Build.Tasks.Core.dll - true - - - CP0008 - T:Microsoft.Build.Tasks.Deployment.ManifestUtilities.OutputMessageType - ref/net8.0/Microsoft.Build.Tasks.Core.dll - ref/netstandard2.0/Microsoft.Build.Tasks.Core.dll - true - - - CP0008 - T:Microsoft.Build.Tasks.Deployment.ManifestUtilities.UpdateMode - ref/net8.0/Microsoft.Build.Tasks.Core.dll - ref/netstandard2.0/Microsoft.Build.Tasks.Core.dll - true - - - CP0008 - T:Microsoft.Build.Tasks.Deployment.ManifestUtilities.UpdateUnit - ref/net8.0/Microsoft.Build.Tasks.Core.dll - ref/netstandard2.0/Microsoft.Build.Tasks.Core.dll - true - - - - PKV006 - net8.0 - - + \ No newline at end of file diff --git a/src/Utilities/CompatibilitySuppressions.xml b/src/Utilities/CompatibilitySuppressions.xml index 6e9b7a42dea..eeee8bb3f8a 100644 --- a/src/Utilities/CompatibilitySuppressions.xml +++ b/src/Utilities/CompatibilitySuppressions.xml @@ -1,5 +1,5 @@  - + - - CP0008 - T:Microsoft.Build.Utilities.DotNetFrameworkArchitecture - ref/net8.0/Microsoft.Build.Utilities.Core.dll - ref/netstandard2.0/Microsoft.Build.Utilities.Core.dll - true - - - CP0008 - T:Microsoft.Build.Utilities.HostObjectInitializationStatus - ref/net8.0/Microsoft.Build.Utilities.Core.dll - ref/netstandard2.0/Microsoft.Build.Utilities.Core.dll - true - - - CP0008 - T:Microsoft.Build.Utilities.MultipleVersionSupport - ref/net8.0/Microsoft.Build.Utilities.Core.dll - ref/netstandard2.0/Microsoft.Build.Utilities.Core.dll - true - - - CP0008 - T:Microsoft.Build.Utilities.SDKType - ref/net8.0/Microsoft.Build.Utilities.Core.dll - ref/netstandard2.0/Microsoft.Build.Utilities.Core.dll - true - - - CP0008 - T:Microsoft.Build.Utilities.TargetDotNetFrameworkVersion - ref/net8.0/Microsoft.Build.Utilities.Core.dll - ref/netstandard2.0/Microsoft.Build.Utilities.Core.dll - true - - - CP0008 - T:Microsoft.Build.Utilities.VisualStudioVersion - ref/net8.0/Microsoft.Build.Utilities.Core.dll - ref/netstandard2.0/Microsoft.Build.Utilities.Core.dll - true - - - - PKV006 - net8.0 - - + \ No newline at end of file From 00dab011e7e0db78109be175ce54626a15e9ce7b Mon Sep 17 00:00:00 2001 From: YuliiaKovalova <95473390+YuliiaKovalova@users.noreply.github.com> Date: Wed, 2 Oct 2024 07:58:13 +0200 Subject: [PATCH 14/22] Enable NuGetAudit (#10734) --- NuGet.config | 6 ++++++ eng/Packages.props | 1 + eng/Versions.props | 1 + 3 files changed, 8 insertions(+) diff --git a/NuGet.config b/NuGet.config index bd10a6979cf..4aaf4c66df4 100644 --- a/NuGet.config +++ b/NuGet.config @@ -31,4 +31,10 @@ + + + + + + diff --git a/eng/Packages.props b/eng/Packages.props index e9c77ff48f9..87cf3b78909 100644 --- a/eng/Packages.props +++ b/eng/Packages.props @@ -29,6 +29,7 @@ + diff --git a/eng/Versions.props b/eng/Versions.props index b3ec8d26ca5..02d3770dc53 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -39,6 +39,7 @@ 8.0.0 5.0.0 7.0.0 + 4.3.1 8.0.4 8.0.0 8.0.0 From 63297adbddf00465d675a30688052cdf5ae01995 Mon Sep 17 00:00:00 2001 From: Jan Krivanek Date: Wed, 2 Oct 2024 08:48:16 +0200 Subject: [PATCH 15/22] Add clarification of BuildCheck props check false positives (#10689) --- documentation/specs/BuildCheck/Codes.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/documentation/specs/BuildCheck/Codes.md b/documentation/specs/BuildCheck/Codes.md index c8df45c0937..f52c4f47317 100644 --- a/documentation/specs/BuildCheck/Codes.md +++ b/documentation/specs/BuildCheck/Codes.md @@ -91,7 +91,12 @@ If `BC0202` and [BC0201](#BC0201) are both enabled - then `BC0201` reports only This check indicates that a property was defined in the observed scope (by default it's the project file only) and it was then not used anywhere in the build. -This is a runtime check, not a static analysis check - so it can have false positives (as property not used in particular build might be needed in a build with different conditions). For this reasons it's currently only suggestion. +This is a runtime check, not a static analysis check - so it can have false positives - for this reasons it's currently only suggestion. + +Common cases of false positives: + * Property not used in a particular build might be needed in a build with different conditions or a build of a different target (e.g. `dotnet pack /check` or `dotnet build /t:pack /check` accesses some additional properties as compared to ordinary `dotnet build /check`). + * Property accessing is tracked for each project build request. There might be multiple distinct build requests for a project in a single build. Specific case of this is a call to the [MSBuild task](https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-task) or [CallTarget task](https://learn.microsoft.com/en-us/visualstudio/msbuild/calltarget-task) that can request a result from a project build, while passing additional or different global properties and/or calling specific target. This happens often as part of common targets - e.g. for [multi-targeted project build parallelization](../../High-level-overview.md#parallelism) + * Incremental build might skip execution of some targets, that might have been accessing properties of interest.

From f9b3ce2269410312b90e0f487e1d5dad6de777f7 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 08:49:04 +0200 Subject: [PATCH 16/22] [main] Update dependencies from dotnet/roslyn, nuget/nuget.client (#10730) * Update dependencies from https://github.com/dotnet/roslyn build 20240929.1 Microsoft.SourceBuild.Intermediate.roslyn , Microsoft.Net.Compilers.Toolset From Version 4.12.0-3.24470.11 -> To Version 4.12.0-3.24479.1 * Update dependencies from https://github.com/nuget/nuget.client build 6.12.0.120 NuGet.Build.Tasks From Version 6.12.0-rc.112 -> To Version 6.12.0-rc.120 --------- Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 12 ++++++------ eng/Versions.props | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 047444afd70..25149c69fae 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -85,17 +85,17 @@ https://github.com/dotnet/arcade 04b9022eba9c184a8036328af513c22e6949e8b6
- + https://github.com/nuget/nuget.client - 502e691d67590946d0a4765a25f1da2b6d6c32fc + 675e8a81acb53958e40dc21be5f562d00239a449 - + https://github.com/dotnet/roslyn - 54fd790788b03c256f736c917fc368daf0a643db + ba2f19abe63a267dc9b2d082d0e1904cd91c1947 - + https://github.com/dotnet/roslyn - 54fd790788b03c256f736c917fc368daf0a643db + ba2f19abe63a267dc9b2d082d0e1904cd91c1947 diff --git a/eng/Versions.props b/eng/Versions.props index 02d3770dc53..6ccdf5b3630 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -53,8 +53,8 @@ 9.0.0-beta.24466.2 7.0.0 6.0.1 - 4.12.0-3.24470.11 - 6.12.0-rc.112 + 4.12.0-3.24479.1 + 6.12.0-rc.120 6.0.0 From ef6d9ad8607be1b516f82eb8527c4fa192b82b04 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 08:49:18 +0200 Subject: [PATCH 17/22] Update dependencies from https://github.com/dotnet/arcade build 20240923.1 (#10731) Microsoft.SourceBuild.Intermediate.arcade , Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.XliffTasks , Microsoft.DotNet.XUnitExtensions From Version 9.0.0-beta.24466.2 -> To Version 9.0.0-beta.24473.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 16 ++++++++-------- eng/Versions.props | 2 +- global.json | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 25149c69fae..ebcf20d46e9 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -71,19 +71,19 @@ - + https://github.com/dotnet/arcade - 04b9022eba9c184a8036328af513c22e6949e8b6 + 1230437de1ab7b3e15fe7cdfe7ffce2f65449959 - + https://github.com/dotnet/arcade - 04b9022eba9c184a8036328af513c22e6949e8b6 + 1230437de1ab7b3e15fe7cdfe7ffce2f65449959 - + https://github.com/dotnet/arcade - 04b9022eba9c184a8036328af513c22e6949e8b6 + 1230437de1ab7b3e15fe7cdfe7ffce2f65449959 https://github.com/nuget/nuget.client @@ -98,9 +98,9 @@ ba2f19abe63a267dc9b2d082d0e1904cd91c1947 - + https://github.com/dotnet/arcade - 04b9022eba9c184a8036328af513c22e6949e8b6 + 1230437de1ab7b3e15fe7cdfe7ffce2f65449959 diff --git a/eng/Versions.props b/eng/Versions.props index 6ccdf5b3630..37b0361a28c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -50,7 +50,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 - 9.0.0-beta.24466.2 + 9.0.0-beta.24473.1 7.0.0 6.0.1 4.12.0-3.24479.1 diff --git a/global.json b/global.json index e969ea9175b..20a7d304435 100644 --- a/global.json +++ b/global.json @@ -10,6 +10,6 @@ "xcopy-msbuild": "17.10.0-pre.4.0" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24466.2" + "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24473.1" } } From c034fa10a2e4726eddcb50df7aa42bda81362583 Mon Sep 17 00:00:00 2001 From: Rainer Sigwald Date: Wed, 2 Oct 2024 01:50:08 -0500 Subject: [PATCH 18/22] Use SequenceEqual in win32 GetFullPath (#10706) * Use SequenceEqual in win32 GetFullPath This should be slightly more efficient since it's vectorizable. * fixup! Use SequenceEqual in win32 GetFullPath --- src/Framework/NativeMethods.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Framework/NativeMethods.cs b/src/Framework/NativeMethods.cs index b907742edd1..bbc62463b1e 100644 --- a/src/Framework/NativeMethods.cs +++ b/src/Framework/NativeMethods.cs @@ -1546,6 +1546,7 @@ private static unsafe int GetFullPathWin32(string target, int bufferLength, char /// True only if the contents of and the first characters in are identical. private static unsafe bool AreStringsEqual(char* buffer, int len, string s) { +#if CLR2COMPATIBILITY if (len != s.Length) { return false; @@ -1560,6 +1561,9 @@ private static unsafe bool AreStringsEqual(char* buffer, int len, string s) } return true; +#else + return MemoryExtensions.SequenceEqual(new ReadOnlySpan(buffer, len), s.AsSpan()); +#endif } internal static void VerifyThrowWin32Result(int result) From eb8e324d10d91055302aac4468e5ebb43fd61c0c Mon Sep 17 00:00:00 2001 From: Jenny Bai Date: Wed, 2 Oct 2024 14:51:47 +0800 Subject: [PATCH 19/22] Fix property expander when lsh is string (#10696) --- src/Build.UnitTests/Evaluation/Expander_Tests.cs | 7 +++++-- src/Build/Evaluation/Expander.cs | 9 ++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Build.UnitTests/Evaluation/Expander_Tests.cs b/src/Build.UnitTests/Evaluation/Expander_Tests.cs index d4fe267e225..f4c85d3285e 100644 --- a/src/Build.UnitTests/Evaluation/Expander_Tests.cs +++ b/src/Build.UnitTests/Evaluation/Expander_Tests.cs @@ -4088,7 +4088,10 @@ public void Medley() new string[] {"A$(Reg:AA)", "A"}, new string[] {"$(Reg:AA)", ""}, new string[] {"$(Reg:AAAA)", ""}, - new string[] {"$(Reg:AAA)", ""} + new string[] {"$(Reg:AAA)", ""}, + // Following two are comparison between non-numeric and numeric properties. More details: #10583 + new string[] {"$(a.Equals($(c)))","False"}, + new string[] {"$(a.CompareTo($(c)))","1"}, }; var errorTests = new List { @@ -5074,7 +5077,7 @@ public void FastPathValidationTest(string methodInvocationMetadata) { using (var env = TestEnvironment.Create()) { - // Setting this env variable allows to track if expander was using reflection for a function invocation. + // Setting this env variable allows to track if expander was using reflection for a function invocation. env.SetEnvironmentVariable("MSBuildLogPropertyFunctionsRequiringReflection", "1"); var logger = new MockLogger(); diff --git a/src/Build/Evaluation/Expander.cs b/src/Build/Evaluation/Expander.cs index ac58b5a67a2..3152d850174 100644 --- a/src/Build/Evaluation/Expander.cs +++ b/src/Build/Evaluation/Expander.cs @@ -3525,10 +3525,13 @@ internal object Execute(object objectInstance, IPropertyProvider properties, if (objectInstance != null && args.Length == 1 && (String.Equals("Equals", _methodMethodName, StringComparison.OrdinalIgnoreCase) || String.Equals("CompareTo", _methodMethodName, StringComparison.OrdinalIgnoreCase))) { // Support comparison when the lhs is an integer - if (IsFloatingPointRepresentation(args[0]) && !IsFloatingPointRepresentation(objectInstance)) + if (IsFloatingPointRepresentation(args[0])) { - objectInstance = Convert.ChangeType(objectInstance, typeof(double), CultureInfo.InvariantCulture); - _receiverType = objectInstance.GetType(); + if (double.TryParse(objectInstance.ToString(), NumberStyles.Number | NumberStyles.Float, CultureInfo.InvariantCulture.NumberFormat, out double result)) + { + objectInstance = result; + _receiverType = objectInstance.GetType(); + } } // change the type of the final unescaped string into the destination From 5521e88c2f5df28f1f14f67e2065abe25253baf2 Mon Sep 17 00:00:00 2001 From: Rainer Sigwald Date: Wed, 2 Oct 2024 01:54:44 -0500 Subject: [PATCH 20/22] Hide and warn about TaskItem ctor (#10713) The doc comment mentioned that the parameterless constructor existed only for COM but it was still easy to find, causing problems like #10660. Hide it from IDE completion and extend the comment. --- src/Utilities/TaskItem.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Utilities/TaskItem.cs b/src/Utilities/TaskItem.cs index f4e818e278e..dc1e8ee78ff 100644 --- a/src/Utilities/TaskItem.cs +++ b/src/Utilities/TaskItem.cs @@ -4,6 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; #if FEATURE_SECURITY_PERMISSIONS using System.Security; @@ -60,8 +61,12 @@ public sealed class TaskItem : #region Constructors /// - /// Default constructor -- we need it so this type is COM-createable. + /// Default constructor -- do not use. /// + /// + /// This constructor exists only so that the type is COM-creatable. Prefer . + /// + [EditorBrowsable(EditorBrowsableState.Never)] public TaskItem() { _itemSpec = string.Empty; From ae14349d4f4e30926d5f18c130dca071a729eb71 Mon Sep 17 00:00:00 2001 From: Mariana Dematte Date: Wed, 2 Oct 2024 00:08:52 -0700 Subject: [PATCH 21/22] Update release checklist doc (#10704) * Separated release checklist into sections * Added more check for DARC channel subscriptions * Update documentation/release-checklist.md Co-authored-by: Rainer Sigwald --------- Co-authored-by: YuliiaKovalova <95473390+YuliiaKovalova@users.noreply.github.com> Co-authored-by: Rainer Sigwald --- documentation/release-checklist.md | 46 +++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/documentation/release-checklist.md b/documentation/release-checklist.md index d73cf229d7e..1e5ab0b3f87 100644 --- a/documentation/release-checklist.md +++ b/documentation/release-checklist.md @@ -12,11 +12,23 @@ - [ ] Ping internal "First Responders" Teams channel to get the new channel made available as a promotion target (e.g. dotnet/arcade#12150): {{URL_OF_CHANNEL_PROMOTION_PR}} ## At release time - +Before starting the process: - [ ] If the release is being cut more than a few days before the VS-side snap, do these two steps. Otherwise check them off. - [ ] Modify the VS insertion so that it flows from MSBuild `vs{{THIS_RELEASE_VERSION}}` to VS `main` [in the MSBuild-release-branch release definition](https://dev.azure.com/devdiv/DevDiv/_release?definitionId=1319&view=mine&_a=releases). Alternatively, if the release being cut no more than couple of weeks, disable the scheduled releases and create releases from `vs{{THIS_RELEASE_VERSION}}` manually until the VS-side snap: Edit -> Schedule set under Artifacts -> disable toggle AND - [ ] Disable automated run of [the MSBuild-main-branch release definition](https://dev.azure.com/devdiv/DevDiv/_release?definitionId=2153&view=mine&_a=releases) (because our {{NEXT_VERSION}} builds don't have a place to go in VS yet) + +### Branching from main +- [ ] If the new version's branch was created before the Visual Studio fork: fast-forward merge the correct commit (the one that is currently inserted to VS main) to the `vs{{THIS_RELEASE_VERSION}}` branch \ +e.g.: `git push upstream 2e6f2ff7ea311214255b6b2ca5cc0554fba1b345:refs/heads/vs17.10` \ +_(This is for the case where we create the branch too early and want it to be based actually on a different commit. If you waited until a good point in time with `main` in a clean state, just branch off and you are done. The branch should point to a good, recent spot, so the final-branding PR goes in on top of the right set of commits.)_ +- [ ] Update the branch merge flow in `.config/git-merge-flow-config.jsonc` file to have the currently-in-servicing branches. +- [ ] Create {{NEXT_VERSION}} branding PR (in main) including public API baseline package version change: {{URL_OF_NEXT_VERSION_BRANDING_PR}}. + - In the file `eng/Versions.props` Update the `VersionPrefix` to `{{NEXT_VERSION}}` and `PackageValidationBaselineVersion` set to a latest internally available {{THIS_RELEASE_VERSION}} preview version in the [internal dnceng dotnet-tools feed](https://dev.azure.com/dnceng/internal/_artifacts/feed/dotnet-tools-internal). It might be needed to update `CompatibilitySuppressions.xml` files. See [this documentation](https://learn.microsoft.com/en-us/dotnet/fundamentals/apicompat/overview) for more details. You can update `CompatibilitySuppressions.xml` files by running +`dotnet pack MSBuild.Dev.slnf /p:ApiCompatGenerateSuppressionFile=true`. +- [ ] Merge {{NEXT_VERSION}} branding PR + +### Adjust DARC channels and subscriptions - [ ] Remove the `main` to old release channel ({{THIS_RELEASE_VERSION}}) default channel \ `darc delete-default-channel --repo https://github.com/dotnet/msbuild --branch main --channel "VS {{THIS_RELEASE_VERSION}}"` - [ ] Associate the `main` branch with the next release channel \ @@ -28,24 +40,36 @@ AND - [ ] Ensure that the current release channel `VS {{THIS_RELEASE_VERSION}}` is associated with the correct release branch\ `darc get-default-channels --source-repo https://github.com/dotnet/msbuild --branch vs{{THIS_RELEASE_VERSION}}` \ if it is not, `darc add-default-channel --channel "VS {{THIS_RELEASE_VERSION}}" --branch vs{{THIS_RELEASE_VERSION}} --repo https://github.com/dotnet/msbuild` -- [ ] If the branch was created before the fork: fast-forward merge the correct commit (the one that is currently inserted to VS main) to the `vs{{THIS_RELEASE_VERSION}}` branch \ -e.g.: `git push upstream 2e6f2ff7ea311214255b6b2ca5cc0554fba1b345:refs/heads/vs17.10` \ -_(This is for the case where we create the branch too early and want it to be based actually on a different commit. If you waited until a good point in time with `main` in a clean state, just branch off and you are done. The branch should point to a good, recent spot, so the final-branding PR goes in on top of the right set of commits.)_ -- [ ] Update the branch merge flow in `.config/git-merge-flow-config.jsonc` file to have the currently-in-servicing branches. +- [ ] Double check subscriptions from our repo `darc get-subscriptions --target-repo dotnet/msbuild` and update subscriptions to `VS{{THIS_RELEASE_VERSION}}` and `main` branches according to [supported versions of VS and SDK](https://learn.microsoft.com/en-us/dotnet/core/porting/versioning-sdk-msbuild-vs#supported-net-versions): + - [ ] NuGet client + - Based on VS version channel + - `darc get-subscriptions --exact --target-repo https://github.com/dotnet/msbuild --source-repo https://github.com/nuget/nuget.client` + - [ ] Source Build Packages + - Based on .NET version channel + - `darc get-subscriptions --exact --target-repo https://github.com/dotnet/msbuild --source-repo https://github.com/dotnet/source-build-reference-packages` + - [ ] Roslyn: + - Based on VS version channel + - `darc get-subscriptions --exact --target-repo https://github.com/dotnet/msbuild --source-repo https://github.com/dotnet/roslyn` + - [ ] Arcade: + - Based on .NET version channel--does not change every MSBuild release + - `darc get-subscriptions --exact --target-repo https://github.com/dotnet/msbuild --source-repo https://github.com/dotnet/arcade` + +### Adjust pipelines / releases - [ ] Fix OptProf data flow for the new vs{{THIS_RELEASE_VERSION}} branch - [ ] Run the [official build](https://devdiv.visualstudio.com/DevDiv/_build?definitionId=9434) for vs{{THIS_RELEASE_VERSION}} without OptProf (set `SkipApplyOptimizationData` variable in 'Advanced options' section of the 'Run pipeline' menu to `true`) or alternatively with the latest Opt-Prof collected for the main branch (set `Optional OptProfDrop Override` to the drop path of the collected data, which could be found in the logs of the pipeline: Windows_NT -> Build -> search for `OptimizationData`). - [ ] Check that the [OptProf data collection](https://devdiv.visualstudio.com/DevDiv/_build?definitionId=17389) pipeline run is triggered for vs{{THIS_RELEASE_VERSION}}. If not, run manually ('Run pipeline' in upper right) - [ ] Run the [official build](https://devdiv.visualstudio.com/DevDiv/_build?definitionId=9434) for vs{{THIS_RELEASE_VERSION}} with no extra customization - OptProf should succeed now -- [ ] Create {{NEXT_VERSION}} branding PR (in main) including public API baseline package version change: {{URL_OF_NEXT_VERSION_BRANDING_PR}}. In the file `eng/Versions.props` Update the `VersionPrefix` to `{{NEXT_VERSION}}` and `PackageValidationBaselineVersion` set to a latest internally available {{THIS_RELEASE_VERSION}} preview version in the internal dnceng dotnet-tools feed. It might be needed to update `CompatibilitySuppressions.xml` files. See [this documentation](https://learn.microsoft.com/en-us/dotnet/fundamentals/apicompat/overview) for more details. You can update `CompatibilitySuppressions.xml` files by running -`dotnet pack MSBuild.Dev.slnf /p:ApiCompatGenerateSuppressionFile=true`. +- [ ] When VS main snaps to {{THIS_RELEASE_VERSION}} and updates its version to {{NEXT_VERSION}}, turn on / modify the VS insertion so that it flows from MSBuild main to VS main. + - [ ] Update the [release-branch insertion release definition](https://dev.azure.com/devdiv/DevDiv/_releaseDefinition?definitionId=2153&_a=definition-variables) to have `InsertTargetBranch` `rel/d{{THIS_RELEASE_VERSION}}`. +- [ ] Turn [the release pipeline](https://dev.azure.com/devdiv/DevDiv/_release?definitionId=2153&view=mine&_a=releases) back on. + +### Configure localization - [ ] Create {{THIS_RELEASE_VERSION}} localization ticket: https://aka.ms/ceChangeLocConfig (requesting to switch localization from {{PREVIOUS_RELEASE_VERSION}} to {{THIS_RELEASE_VERSION}}): {{URL_OF_LOCALIZATION_TICKET}} - [ ] Enable {{THIS_RELEASE_VERSION}} localization - by setting [`EnableReleaseOneLocBuild`](https://github.com/dotnet/msbuild/blob/vs{{THIS_RELEASE_VERSION}}/.vsts-dotnet.yml) to `true` - [ ] Disable {{PREVIOUS_RELEASE_VERSION}} localization - by setting [`EnableReleaseOneLocBuild`](https://github.com/dotnet/msbuild/blob/vs{{PREVIOUS_RELEASE_VERSION}}/.vsts-dotnet.yml) to `false`. Update the comment on the same line. -- [ ] Merge {{NEXT_VERSION}} branding PR - [ ] Create and merge a PR in main to update a localization version comment in setting [`EnableReleaseOneLocBuild`](https://github.com/dotnet/msbuild/blob/main/.vsts-dotnet.yml) to set up the merge conflict when this line will be updated in the release branch. -- [ ] When VS main snaps to {{THIS_RELEASE_VERSION}} and updates its version to {{NEXT_VERSION}}, turn on / modify the VS insertion so that it flows from MSBuild main to VS main. -- [ ] Update the [release-branch insertion release definition](https://dev.azure.com/devdiv/DevDiv/_releaseDefinition?definitionId=2153&_a=definition-variables) to have `InsertTargetBranch` `rel/d{{THIS_RELEASE_VERSION}}`. -- [ ] Turn [the release pipeline](https://dev.azure.com/devdiv/DevDiv/_release?definitionId=2153&view=mine&_a=releases) back on. + +### Final branding - [ ] Prepare final branding PR for `vs{{THIS_RELEASE_VERSION}}`: {{URL_OF_FINAL_BRANDING_PR}} - [ ] Merge final branding to `vs{{THIS_RELEASE_VERSION}}` branch - [ ] Update perfstar MSBuild insertions configuration: [example PR](https://dev.azure.com/devdiv/DevDiv/_git/dotnet-perfstar/pullrequest/522843): {{URL_OF_PERFSTAR_PR}} From a7cbaae01e6fab04b1b6668064c2b1af06058fd3 Mon Sep 17 00:00:00 2001 From: Jan Krivanek Date: Wed, 2 Oct 2024 18:51:26 +0200 Subject: [PATCH 22/22] Allow fast-abort of submissions even after EndBuild initiated --- .../BackEnd/BuildManager/BuildManager.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Build/BackEnd/BuildManager/BuildManager.cs b/src/Build/BackEnd/BuildManager/BuildManager.cs index 96cada2d553..199c39ff7f6 100644 --- a/src/Build/BackEnd/BuildManager/BuildManager.cs +++ b/src/Build/BackEnd/BuildManager/BuildManager.cs @@ -789,15 +789,10 @@ void Callback(object? state) { lock (_syncLock) { - if (_shuttingDown) - { - return; - } - - // If we are Idle, obviously there is nothing to cancel. If we are waiting for the build to end, then presumably all requests have already completed - // and there is nothing left to cancel. Putting this here eliminates the possibility of us racing with EndBuild to access the nodeManager before - // EndBuild sets it to null. - if (_buildManagerState != BuildManagerState.Building) + // If the state is Idle - then there is yet or already nothing to cancel + // If state is WaitingForBuildToComplete - we might be already waiting gracefully - but CancelAllSubmissions + // is a request for quick abort - so it's fine to resubmit the request + if (_buildManagerState == BuildManagerState.Idle) { return; } @@ -2078,17 +2073,17 @@ private void ShutdownConnectedNodes(bool abort) lock (_syncLock) { _shuttingDown = true; - _executionCancellationTokenSource!.Cancel(); + _executionCancellationTokenSource?.Cancel(); // If we are aborting, we will NOT reuse the nodes because their state may be compromised by attempts to shut down while the build is in-progress. - _nodeManager!.ShutdownConnectedNodes(!abort && _buildParameters!.EnableNodeReuse); + _nodeManager?.ShutdownConnectedNodes(!abort && _buildParameters!.EnableNodeReuse); // if we are aborting, the task host will hear about it in time through the task building infrastructure; // so only shut down the task host nodes if we're shutting down tidily (in which case, it is assumed that all // tasks are finished building and thus that there's no risk of a race between the two shutdown pathways). if (!abort) { - _taskHostNodeManager!.ShutdownConnectedNodes(_buildParameters!.EnableNodeReuse); + _taskHostNodeManager?.ShutdownConnectedNodes(_buildParameters!.EnableNodeReuse); } } }