From e5125b9823ef55d2fcffdef72affa5be33cf775d Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Mon, 4 May 2026 19:11:52 +0200 Subject: [PATCH 01/35] [msbuild/dotnet] Use 'SdkIsSimulator' instead of 'ComputedPlatform'. (#25234) This simplifies the code, since we only have a single property as the source of truth whether we're building for the simulator or not. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/copilot-instructions.md | 1 + docs/building-apps/build-properties.md | 13 +++++++++ .../Xamarin.Shared.Sdk.DefaultItems.targets | 5 ---- dotnet/targets/Xamarin.Shared.Sdk.props | 7 +++++ dotnet/targets/Xamarin.Shared.Sdk.targets | 4 +-- msbuild/Xamarin.Shared/Xamarin.Shared.props | 28 +++---------------- msbuild/Xamarin.Shared/Xamarin.Shared.targets | 2 +- .../Xamarin.Shared/Xamarin.iOS.Common.targets | 6 ++-- .../Xamarin.iOS.Common.After.targets | 4 +-- tests/ComputeRegistrarConstant.targets | 2 +- tests/monotouch-test/dotnet/shared.csproj | 2 +- 11 files changed, 35 insertions(+), 39 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 570b20cbd2ba..4cb9965eaa88 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -156,6 +156,7 @@ Common project structure for Apple platform apps: 2. Run `make` to rebuild affected components 3. Test changes using appropriate test suite 4. Verify on both simulator and device when possible +5. Check if the documentation in the `docs/` directory needs to be updated to reflect the changes (e.g. new MSBuild properties should be documented in `docs/building-apps/build-properties.md`) ### Code Style diff --git a/docs/building-apps/build-properties.md b/docs/building-apps/build-properties.md index e6ab2cbe3667..ab6a1742229a 100644 --- a/docs/building-apps/build-properties.md +++ b/docs/building-apps/build-properties.md @@ -1234,6 +1234,19 @@ $ dotnet run -p:StandardInputPath=stdin.txt Note: this can also be accomplished by passing `--stdin ...` using the [OpenArguments](#openarguments) property. +## SdkIsDevice + +This property is a read-only property (setting it will have no effect) that +specifies whether we're building for a device or not. + +This property is only `true` when building for an iOS or tvOS device (i.e., +when `SdkIsSimulator` is not `true` and the platform is iOS or tvOS). It is +not set for macOS or Mac Catalyst builds. + +Like `SdkIsSimulator`, this property is only set after [imports and +properties](/visualstudio/msbuild/build-process-overview#evaluate-imports-and-properties) +have been evaluated. + ## SdkIsSimulator This property is a read-only property (setting it will have no effect) that diff --git a/dotnet/targets/Xamarin.Shared.Sdk.DefaultItems.targets b/dotnet/targets/Xamarin.Shared.Sdk.DefaultItems.targets index b970adc12d0d..973f26394330 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.DefaultItems.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.DefaultItems.targets @@ -59,11 +59,6 @@ - - iPhoneSimulator - iPhone - - <_RuntimeFrameworkVersion>$(BundledNETCorePlatformsPackageVersion) <_RuntimeFrameworkVersion Condition="'$(CUSTOM_DOTNET_VERSION)' != ''">$(CUSTOM_DOTNET_VERSION) diff --git a/dotnet/targets/Xamarin.Shared.Sdk.props b/dotnet/targets/Xamarin.Shared.Sdk.props index 039ef3a54e21..ae5137fbbf76 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.props +++ b/dotnet/targets/Xamarin.Shared.Sdk.props @@ -147,6 +147,13 @@ <_SdkIsSimulator Condition="'$(_SdkIsSimulator)' == ''">false $(_SdkIsSimulator) + + + true + + + iPhoneSimulator + iPhone diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets index 24b29b5830ce..341e08ac0808 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.targets @@ -1291,14 +1291,14 @@ <_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == '' And '$(_PlatformName)' == 'MacCatalyst'">static - <_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == '' And ('$(ComputedPlatform)' != 'iPhone' Or '$(_PlatformName)' == 'macOS')">dylib + <_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == '' And ('$(SdkIsSimulator)' == 'true' Or '$(_PlatformName)' == 'macOS')">dylib <_LibMonoLinkMode Condition="'$(_LibMonoLinkMode)' == ''">static <_LibMonoExtension Condition="'$(_LibMonoLinkMode)' == 'dylib'">dylib <_LibMonoExtension Condition="'$(_LibMonoLinkMode)' == 'static'">a <_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == '' And '$(_PlatformName)' == 'MacCatalyst'">static - <_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == '' And '$(ComputedPlatform)' != 'iPhone' And '$(_PlatformName)' != 'macOS'">dylib + <_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == '' And '$(SdkIsSimulator)' == 'true' And '$(_PlatformName)' != 'macOS'">dylib <_LibXamarinLinkMode Condition="'$(_LibXamarinLinkMode)' == ''">static <_LibXamarinExtension Condition="'$(_LibXamarinLinkMode)' == 'dylib'">dylib <_LibXamarinExtension Condition="'$(_LibXamarinLinkMode)' == 'static'">a diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.props b/msbuild/Xamarin.Shared/Xamarin.Shared.props index 01c764d59679..92e9e93ea55c 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.props +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.props @@ -20,26 +20,6 @@ Copyright (C) 2020 Microsoft. All rights reserved. - - - $(Platform) - iPhone - - @@ -117,10 +97,10 @@ Copyright (C) 2020 Microsoft. All rights reserved. - + <_CanArchive>false <_CanArchive Condition="('$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst') And '$(OutputType)' == 'Exe' And '$(IsAppExtension)' == 'false'">true - <_CanArchive Condition="('$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS') And '$(OutputType)' == 'Exe' And '$(ComputedPlatform)' == 'iPhone' And '$(IsAppExtension)' == 'false' And '$(IsWatchApp)' == 'false'">true + <_CanArchive Condition="'$(OutputType)' == 'Exe' And '$(SdkIsDevice)' == 'true' And '$(IsAppExtension)' == 'false'">true @@ -144,7 +124,7 @@ Copyright (C) 2020 Microsoft. All rights reserved. true true - true + true false @@ -153,7 +133,7 @@ Copyright (C) 2020 Microsoft. All rights reserved. true - true + true false diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index 7ca75fdb2512..c5139ca6acc1 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -2665,7 +2665,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. - @@ -124,7 +124,7 @@ Copyright (C) 2013-2016 Xamarin. All rights reserved. /> - + - - + @@ -178,7 +178,7 @@ Copyright (C) 2011-2013 Xamarin. All rights reserved. - + diff --git a/tests/ComputeRegistrarConstant.targets b/tests/ComputeRegistrarConstant.targets index 9d5d2e9dcaf5..8660e48bd918 100644 --- a/tests/ComputeRegistrarConstant.targets +++ b/tests/ComputeRegistrarConstant.targets @@ -2,7 +2,7 @@ - true + true true diff --git a/tests/monotouch-test/dotnet/shared.csproj b/tests/monotouch-test/dotnet/shared.csproj index 282d2a42e265..37437089b7fe 100644 --- a/tests/monotouch-test/dotnet/shared.csproj +++ b/tests/monotouch-test/dotnet/shared.csproj @@ -267,7 +267,7 @@ - $(DefineConstants);AOT + $(DefineConstants);AOT $(DefineConstants);AOT $(DefineConstants);AOT From 0185cba7afcb71a4339877334451989f378a82f9 Mon Sep 17 00:00:00 2001 From: VS MobileTools Engineering Service 2 Date: Mon, 4 May 2026 10:31:21 -0700 Subject: [PATCH 02/35] Localized file check-in by OneLocBuild Task: Build definition ID 14411: Build ID 14005679 (#25305) This is the pull request automatically created by the OneLocBuild task in the build process to check-in localized files generated based upon translation source files (.lcl files) handed-back from the downstream localization pipeline. If there are issues in translations, visit https://aka.ms/icxLocBug and log bugs for fixes. The OneLocBuild wiki is https://aka.ms/onelocbuild and the localization process in general is documented at https://aka.ms/AllAboutLoc. --- macios/tools/mtouch/TranslatedAssemblies/Errors.cs.resx | 9 +++++++++ macios/tools/mtouch/TranslatedAssemblies/Errors.de.resx | 9 +++++++++ macios/tools/mtouch/TranslatedAssemblies/Errors.es.resx | 9 +++++++++ macios/tools/mtouch/TranslatedAssemblies/Errors.fr.resx | 9 +++++++++ macios/tools/mtouch/TranslatedAssemblies/Errors.it.resx | 9 +++++++++ macios/tools/mtouch/TranslatedAssemblies/Errors.ja.resx | 9 +++++++++ macios/tools/mtouch/TranslatedAssemblies/Errors.ko.resx | 9 +++++++++ macios/tools/mtouch/TranslatedAssemblies/Errors.pl.resx | 9 +++++++++ .../tools/mtouch/TranslatedAssemblies/Errors.pt-BR.resx | 9 +++++++++ macios/tools/mtouch/TranslatedAssemblies/Errors.ru.resx | 9 +++++++++ macios/tools/mtouch/TranslatedAssemblies/Errors.tr.resx | 9 +++++++++ .../mtouch/TranslatedAssemblies/Errors.zh-Hans.resx | 9 +++++++++ .../mtouch/TranslatedAssemblies/Errors.zh-Hant.resx | 9 +++++++++ 13 files changed, 117 insertions(+) diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.cs.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.cs.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.cs.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.cs.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.de.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.de.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.de.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.de.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.es.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.es.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.es.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.es.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.fr.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.fr.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.fr.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.fr.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.it.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.it.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.it.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.it.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.ja.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.ja.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.ja.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.ja.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.ko.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.ko.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.ko.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.ko.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.pl.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.pl.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.pl.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.pl.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.pt-BR.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.pt-BR.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.pt-BR.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.pt-BR.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.ru.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.ru.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.ru.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.ru.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.tr.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.tr.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.tr.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.tr.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hans.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hans.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hans.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hans.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hant.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hant.resx index a03441e8b5b6..acaf24817a6d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hant.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hant.resx @@ -1216,6 +1216,9 @@ The class '{0}' will not be registered because the {1} framework has been deprecated from the {2} SDK. + + Could not find the trampoline for the category method {0}. + Missing '{0}' compiler. Please install Xcode 'Command-Line Tools' component @@ -1459,4 +1462,10 @@ Invalid DelegateProxyAttribute for the return value for the method {0}.{1}: No 'Invoke' method found. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + Unable to find the managed function with id {0} ({1}, {2}). Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + + + Type '{0}' is expected to have a ProtocolProxyAttribute. Please file a bug report with a test case (https://github.com/dotnet/macios/issues/new). + \ No newline at end of file From 3482e4303af11de9c4c02457bb9228563e062a39 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 08:16:39 +0200 Subject: [PATCH 03/35] [main] Update dependencies from dotnet/xharness (#25282) This pull request updates the following dependencies ## From https://github.com/dotnet/xharness - **Subscription**: [02e03784-16b3-4ced-b02a-3715797fc7da](https://maestro.dot.net/subscriptions?search=02e03784-16b3-4ced-b02a-3715797fc7da) - **Build**: [20260430.4](https://dev.azure.com/dnceng/internal/_build/results?buildId=2964906) ([312724](https://maestro.dot.net/channel/2/github:dotnet:xharness/build/312724)) - **Date Produced**: May 1, 2026 7:05:11 AM UTC - **Commit**: [92962e5c46ac08a66ded4c5696209cc60f1a232f](https://github.com/dotnet/xharness/commit/92962e5c46ac08a66ded4c5696209cc60f1a232f) - **Branch**: [main](https://github.com/dotnet/xharness/tree/main) - **Dependency Updates**: - From [11.0.0-prerelease.26224.1 to 11.0.0-prerelease.26230.4][2] - Microsoft.DotNet.XHarness.iOS.Shared [2]: https://github.com/dotnet/xharness/compare/888ef3e553...92962e5c46 --- NuGet.config | 1 + eng/Version.Details.props | 2 +- eng/Version.Details.xml | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/NuGet.config b/NuGet.config index b14cd27026f0..75219c2881e1 100644 --- a/NuGet.config +++ b/NuGet.config @@ -13,6 +13,7 @@ + diff --git a/eng/Version.Details.props b/eng/Version.Details.props index a447028e53ff..1f6015e97f8b 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -30,7 +30,7 @@ This file should be imported by eng/Versions.props 18.5.9227 26.4.9015 - 11.0.0-prerelease.26224.1 + 11.0.0-prerelease.26230.4 18.0.9617 18.0.9617 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 176e4e77385e..5b24b5001ad7 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -107,9 +107,9 @@ https://github.com/dotnet/dotnet e43cbe04901ea4cf359ed0883b0533abab224ba2 - + https://github.com/dotnet/xharness - 888ef3e553a0716745ecab689e13b816639b5a5a + 92962e5c46ac08a66ded4c5696209cc60f1a232f https://github.com/dotnet/dotnet From 5d7f7288069a3d4cb0f3a1e2cbf55bff8c597fe0 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 08:21:31 +0200 Subject: [PATCH 04/35] [workflows] Adjust the inter-branch merge flow to run daily + manually. (#25307) It's not necessary to run it on every push to main (which will usually fail if the PR branch was modified, which we always do). --- .github/workflows/inter-branch-merge-flow.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/inter-branch-merge-flow.yml b/.github/workflows/inter-branch-merge-flow.yml index 35a5b4584b4f..9300b4de0fa0 100644 --- a/.github/workflows/inter-branch-merge-flow.yml +++ b/.github/workflows/inter-branch-merge-flow.yml @@ -16,9 +16,8 @@ name: Inter-branch merge workflow on: - push: - branches: - - main + # allow triggering this action manually + workflow_dispatch: # Run every day at 3:00 AM UTC schedule: From b3948e1cc4b93149527e4e46d3b0b7db6d5d273f Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 08:23:33 +0200 Subject: [PATCH 05/35] [github] Recompile macios-reviewer workflow with gh-aw v0.71.2 (#25289) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The activation job in the `macios-reviewer` workflow was missing `pull-requests: write` permission, causing the 'Add eyes reaction for immediate feedback' step to fail with a 403 when triggered by `/review` on a PR comment. This was a known gh-aw bug ([github/gh-aw#28767](https://github.com/github/gh-aw/issues/28767)), fixed in v0.71.2 via [github/gh-aw#28854](https://github.com/github/gh-aw/pull/28854). This PR recompiles the lock file with gh-aw v0.71.2, which adds `pull-requests: write` to the activation job. 🤖 Pull request created by Copilot --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/aw/actions-lock.json | 6 +- .github/workflows/macios-reviewer.lock.yml | 120 ++++++++++++++------- 2 files changed, 83 insertions(+), 43 deletions(-) diff --git a/.github/aw/actions-lock.json b/.github/aw/actions-lock.json index e44fd6da3ec8..996a707ff261 100644 --- a/.github/aw/actions-lock.json +++ b/.github/aw/actions-lock.json @@ -5,10 +5,10 @@ "version": "v9.0.0", "sha": "3a2844b7e9c422d3c10d287c895573f7108da1b3" }, - "github/gh-aw-actions/setup@v0.71.1": { + "github/gh-aw-actions/setup@v0.71.2": { "repo": "github/gh-aw-actions/setup", - "version": "v0.71.1", - "sha": "239aec45b78c8799417efdd5bc6d8cc036629ec1" + "version": "v0.71.2", + "sha": "ab8940d1df237fc4fae4ab8091e7ba66ada55a55" } }, "containers": { diff --git a/.github/workflows/macios-reviewer.lock.yml b/.github/workflows/macios-reviewer.lock.yml index 96544eebf0de..bcaac60c75a8 100644 --- a/.github/workflows/macios-reviewer.lock.yml +++ b/.github/workflows/macios-reviewer.lock.yml @@ -1,5 +1,5 @@ -# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"a4ffe1d52364aca7fafba9ba975ec40a3f4fc4908801119268fc1812f9b09cbe","compiler_version":"v0.71.1","strict":true,"agent_id":"copilot","agent_model":"claude-sonnet-4.5"} -# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"239aec45b78c8799417efdd5bc6d8cc036629ec1","version":"v0.71.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.28","digest":"sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.25.28@sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28","digest":"sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28@sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.28","digest":"sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.25.28@sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.0","digest":"sha256:9c2228324fb1f26f39dc9471612e530ae3efc3156dac05efb2e8d212878d454d","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.0@sha256:9c2228324fb1f26f39dc9471612e530ae3efc3156dac05efb2e8d212878d454d"},{"image":"ghcr.io/github/github-mcp-server:v1.0.2","digest":"sha256:26db03408086a99cf1916348dcc4f9614206658f9082a8060dc7c81ad787f4ba","pinned_image":"ghcr.io/github/github-mcp-server:v1.0.2@sha256:26db03408086a99cf1916348dcc4f9614206658f9082a8060dc7c81ad787f4ba"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} +# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"a4ffe1d52364aca7fafba9ba975ec40a3f4fc4908801119268fc1812f9b09cbe","compiler_version":"v0.71.2","strict":true,"agent_id":"copilot","agent_model":"claude-sonnet-4.5"} +# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"373c709c69115d41ff229c7e5df9f8788daa9553","version":"v9"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"ab8940d1df237fc4fae4ab8091e7ba66ada55a55","version":"v0.71.2"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.29","digest":"sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.25.29@sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.29","digest":"sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.29@sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.29","digest":"sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.25.29@sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.1","digest":"sha256:287fad0236959f3b3d9936ea1ef8d5b4f135ef2a5f5789713495cbbef191e60c","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.1@sha256:287fad0236959f3b3d9936ea1ef8d5b4f135ef2a5f5789713495cbbef191e60c"},{"image":"ghcr.io/github/github-mcp-server:v1.0.3","digest":"sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959","pinned_image":"ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} # ___ _ _ # / _ \ | | (_) # | |_| | __ _ ___ _ __ | |_ _ ___ @@ -14,7 +14,7 @@ # \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ # \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ # -# This file was automatically generated by gh-aw (v0.71.1). DO NOT EDIT. +# This file was automatically generated by gh-aw (v0.71.2). DO NOT EDIT. # # To update this file, edit the corresponding .md file and run: # gh aw compile @@ -32,17 +32,18 @@ # Custom actions used: # - actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 +# - actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9 # - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 # - actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 # - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 -# - github/gh-aw-actions/setup@239aec45b78c8799417efdd5bc6d8cc036629ec1 # v0.71.1 +# - github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 # # Container images used: -# - ghcr.io/github/gh-aw-firewall/agent:0.25.28@sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a -# - ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28@sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb -# - ghcr.io/github/gh-aw-firewall/squid:0.25.28@sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474 -# - ghcr.io/github/gh-aw-mcpg:v0.3.0@sha256:9c2228324fb1f26f39dc9471612e530ae3efc3156dac05efb2e8d212878d454d -# - ghcr.io/github/github-mcp-server:v1.0.2@sha256:26db03408086a99cf1916348dcc4f9614206658f9082a8060dc7c81ad787f4ba +# - ghcr.io/github/gh-aw-firewall/agent:0.25.29@sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4 +# - ghcr.io/github/gh-aw-firewall/api-proxy:0.25.29@sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6 +# - ghcr.io/github/gh-aw-firewall/squid:0.25.29@sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53 +# - ghcr.io/github/gh-aw-mcpg:v0.3.1@sha256:287fad0236959f3b3d9936ea1ef8d5b4f135ef2a5f5789713495cbbef191e60c +# - ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 # - node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f name: ".NET for Apple Platforms PR Reviewer" @@ -72,6 +73,7 @@ jobs: actions: read contents: read issues: write + pull-requests: write outputs: body: ${{ steps.sanitized.outputs.body }} comment_id: ${{ steps.add-comment.outputs.comment-id }} @@ -89,7 +91,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@239aec45b78c8799417efdd5bc6d8cc036629ec1 # v0.71.1 + uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -100,16 +102,16 @@ jobs: GH_AW_INFO_ENGINE_ID: "copilot" GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI" GH_AW_INFO_MODEL: "claude-sonnet-4.5" - GH_AW_INFO_VERSION: "1.0.35" - GH_AW_INFO_AGENT_VERSION: "1.0.35" - GH_AW_INFO_CLI_VERSION: "v0.71.1" + GH_AW_INFO_VERSION: "1.0.36" + GH_AW_INFO_AGENT_VERSION: "1.0.36" + GH_AW_INFO_CLI_VERSION: "v0.71.2" GH_AW_INFO_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" GH_AW_INFO_EXPERIMENTAL: "false" GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" GH_AW_INFO_STAGED: "false" GH_AW_INFO_ALLOWED_DOMAINS: '["defaults","dotnet","github","aka.ms","dev.azure.com","microsoft.com","vsassets.io"]' GH_AW_INFO_FIREWALL_ENABLED: "true" - GH_AW_INFO_AWF_VERSION: "v0.25.28" + GH_AW_INFO_AWF_VERSION: "v0.25.29" GH_AW_INFO_AWMG_VERSION: "" GH_AW_INFO_FIREWALL_TYPE: "squid" GH_AW_COMPILED_STRICT: "true" @@ -173,7 +175,7 @@ jobs: - name: Check compile-agentic version uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 env: - GH_AW_COMPILED_VERSION: "v0.71.1" + GH_AW_COMPILED_VERSION: "v0.71.2" with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); @@ -231,6 +233,9 @@ jobs: Tools: create_pull_request_review_comment(max:50), submit_pull_request_review, missing_tool, missing_data, noop + GH_AW_PROMPT_31522cd090dd3137_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" + cat << 'GH_AW_PROMPT_31522cd090dd3137_EOF' The following GitHub context information is available for this workflow: {{#if __GH_AW_GITHUB_ACTOR__ }} @@ -292,6 +297,7 @@ jobs: GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} GH_AW_IS_PR_COMMENT: ${{ github.event.issue.pull_request && 'true' || '' }} + GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: ${{ needs.pre_activation.outputs.activated }} GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_MATCHED_COMMAND: ${{ needs.pre_activation.outputs.matched_command }} with: @@ -314,6 +320,7 @@ jobs: GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE, GH_AW_IS_PR_COMMENT: process.env.GH_AW_IS_PR_COMMENT, + GH_AW_MCP_CLI_SERVERS_LIST: process.env.GH_AW_MCP_CLI_SERVERS_LIST, GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: process.env.GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED, GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_MATCHED_COMMAND: process.env.GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_MATCHED_COMMAND } @@ -369,7 +376,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@239aec45b78c8799417efdd5bc6d8cc036629ec1 # v0.71.1 + uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -420,11 +427,11 @@ jobs: const { main } = require('${{ runner.temp }}/gh-aw/actions/checkout_pr_branch.cjs'); await main(); - name: Install GitHub Copilot CLI - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.35 + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.36 env: GH_HOST: github.com - name: Install AWF binary - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.28 + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.29 - name: Parse integrity filter lists id: parse-guard-vars env: @@ -444,7 +451,7 @@ jobs: GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md opencode.jsonc" run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh" - name: Download container images - run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.28@sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28@sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb ghcr.io/github/gh-aw-firewall/squid:0.25.28@sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474 ghcr.io/github/gh-aw-mcpg:v0.3.0@sha256:9c2228324fb1f26f39dc9471612e530ae3efc3156dac05efb2e8d212878d454d ghcr.io/github/github-mcp-server:v1.0.2@sha256:26db03408086a99cf1916348dcc4f9614206658f9082a8060dc7c81ad787f4ba node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.29@sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.29@sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6 ghcr.io/github/gh-aw-firewall/squid:0.25.29@sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53 ghcr.io/github/gh-aw-mcpg:v0.3.1@sha256:287fad0236959f3b3d9936ea1ef8d5b4f135ef2a5f5789713495cbbef191e60c ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f - name: Write Safe Outputs Config run: | mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" @@ -668,7 +675,7 @@ jobs: MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') DOCKER_SOCK_GID=$(stat -c '%g' /var/run/docker.sock 2>/dev/null || echo '0') - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.0' + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.1' mkdir -p /home/runner/.copilot GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) @@ -677,7 +684,7 @@ jobs: "mcpServers": { "github": { "type": "stdio", - "container": "ghcr.io/github/github-mcp-server:v1.0.2", + "container": "ghcr.io/github/github-mcp-server:v1.0.3", "env": { "GITHUB_HOST": "\${GITHUB_SERVER_URL}", "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", @@ -717,6 +724,20 @@ jobs: } } GH_AW_MCP_CONFIG_8d4f4bdb31699167_EOF + - name: Mount MCP servers as CLIs + id: mount-mcp-clis + continue-on-error: true + env: + MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} + MCP_GATEWAY_DOMAIN: ${{ steps.start-mcp-gateway.outputs.gateway-domain }} + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/mount_mcp_as_cli.cjs'); + await main(); - name: Clean git credentials continue-on-error: true run: bash "${RUNNER_TEMP}/gh-aw/actions/clean_git_credentials.sh" @@ -731,8 +752,8 @@ jobs: export GH_AW_NODE_BIN (umask 177 && touch /tmp/gh-aw/agent-stdio.log) # shellcheck disable=SC1003 - sudo -E awf --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --allow-domains '*.githubusercontent.com,*.vsblob.vsassets.io,aka.ms,api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.nuget.org,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,azuresearch-usnc.nuget.org,azuresearch-ussc.nuget.org,builds.dotnet.microsoft.com,ci.dot.net,codeload.github.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,dc.services.visualstudio.com,dev.azure.com,dist.nuget.org,docs.github.com,dot.net,dotnet.microsoft.com,dotnetcli.blob.core.windows.net,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,microsoft.com,nuget.org,nuget.pkg.github.com,nugetregistryv2prod.blob.core.windows.net,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,oneocsp.microsoft.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,pkgs.dev.azure.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,vsassets.io,www.googleapis.com,www.microsoft.com' --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --image-tag 0.25.28,squid=sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474,agent=sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a,api-proxy=sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb,cli-proxy=sha256:fdf310e4678ce58d248c466b89399e9680a3003038fd19322c388559016aaac7 --skip-pull --enable-api-proxy \ - -- /bin/bash -c 'GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_driver.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log + sudo -E awf --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --allow-domains '*.githubusercontent.com,*.vsblob.vsassets.io,aka.ms,api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.nuget.org,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,azuresearch-usnc.nuget.org,azuresearch-ussc.nuget.org,builds.dotnet.microsoft.com,ci.dot.net,codeload.github.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,dc.services.visualstudio.com,dev.azure.com,dist.nuget.org,docs.github.com,dot.net,dotnet.microsoft.com,dotnetcli.blob.core.windows.net,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,microsoft.com,nuget.org,nuget.pkg.github.com,nugetregistryv2prod.blob.core.windows.net,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,oneocsp.microsoft.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,pkgs.dev.azure.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,vsassets.io,www.googleapis.com,www.microsoft.com' --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --image-tag 0.25.29,squid=sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53,agent=sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4,agent-act=sha256:97b4cc14dc2123a45b9d5b9927489f66882dec5857de6afc0e5bab257be92ef1,api-proxy=sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6,cli-proxy=sha256:29917488eb90a01ff9544ffeeb5cc26434a8ea16d69ae8972f5f6be0e567e276 --skip-pull --enable-api-proxy \ + -- /bin/bash -c 'export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && export PATH="$(find /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log env: COPILOT_AGENT_RUNNER_TYPE: STANDALONE COPILOT_API_KEY: dummy-byok-key-for-offline-mode @@ -742,7 +763,7 @@ jobs: GH_AW_PHASE: agent GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} - GH_AW_VERSION: v0.71.1 + GH_AW_VERSION: v0.71.2 GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows @@ -930,7 +951,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@239aec45b78c8799417efdd5bc6d8cc036629ec1 # v0.71.1 + uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -1028,6 +1049,7 @@ jobs: GH_AW_MCP_POLICY_ERROR: ${{ needs.agent.outputs.mcp_policy_error }} GH_AW_AGENTIC_ENGINE_TIMEOUT: ${{ needs.agent.outputs.agentic_engine_timeout }} GH_AW_MODEL_NOT_SUPPORTED_ERROR: ${{ needs.agent.outputs.model_not_supported_error }} + GH_AW_ENGINE_API_HOSTS: "api.enterprise.githubcopilot.com,api.githubcopilot.com,api.business.githubcopilot.com,api.individual.githubcopilot.com" GH_AW_LOCKDOWN_CHECK_FAILED: ${{ needs.activation.outputs.lockdown_check_failed }} GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }} GH_AW_GROUP_REPORTS: "false" @@ -1076,7 +1098,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@239aec45b78c8799417efdd5bc6d8cc036629ec1 # v0.71.1 + uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -1106,7 +1128,7 @@ jobs: rm -rf /tmp/gh-aw/sandbox/firewall/logs rm -rf /tmp/gh-aw/sandbox/firewall/audit - name: Download container images - run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.28@sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a ghcr.io/github/gh-aw-firewall/api-proxy:0.25.28@sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb ghcr.io/github/gh-aw-firewall/squid:0.25.28@sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474 + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.29@sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.29@sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6 ghcr.io/github/gh-aw-firewall/squid:0.25.29@sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53 - name: Check if detection needed id: detection_guard if: always() @@ -1121,7 +1143,7 @@ jobs: echo "run_detection=false" >> "$GITHUB_OUTPUT" echo "Detection skipped: no agent outputs or patches to analyze" fi - - name: Clear MCP configuration for detection + - name: Clear MCP Config for detection if: always() && steps.detection_guard.outputs.run_detection == 'true' run: | rm -f "${RUNNER_TEMP}/gh-aw/mcp-config/mcp-servers.json" @@ -1165,13 +1187,14 @@ jobs: node-version: '24' package-manager-cache: false - name: Install GitHub Copilot CLI - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.35 + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.36 env: GH_HOST: github.com - name: Install AWF binary - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.28 + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.29 - name: Execute GitHub Copilot CLI if: always() && steps.detection_guard.outputs.run_detection == 'true' + continue-on-error: true id: detection_agentic_execution # Copilot CLI tool arguments (sorted): timeout-minutes: 20 @@ -1182,8 +1205,8 @@ jobs: export GH_AW_NODE_BIN (umask 177 && touch /tmp/gh-aw/threat-detection/detection.log) # shellcheck disable=SC1003 - sudo -E awf --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,github.com,host.docker.internal,telemetry.enterprise.githubcopilot.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --image-tag 0.25.28,squid=sha256:844c18280f82cd1b06345eb2f4e91966b34185bfc51c9f237c3e022e848fb474,agent=sha256:a8834e285807654bf680154faa710d43fe4365a0868142f5c20e48c85e137a7a,api-proxy=sha256:93290f2393752252911bd7c39a047f776c0b53063575e7bde4e304962a9a61cb,cli-proxy=sha256:fdf310e4678ce58d248c466b89399e9680a3003038fd19322c388559016aaac7 --skip-pull --enable-api-proxy \ - -- /bin/bash -c 'GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_driver.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/threat-detection/detection.log + sudo -E awf --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,github.com,host.docker.internal,telemetry.enterprise.githubcopilot.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --image-tag 0.25.29,squid=sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53,agent=sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4,agent-act=sha256:97b4cc14dc2123a45b9d5b9927489f66882dec5857de6afc0e5bab257be92ef1,api-proxy=sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6,cli-proxy=sha256:29917488eb90a01ff9544ffeeb5cc26434a8ea16d69ae8972f5f6be0e567e276 --skip-pull --enable-api-proxy \ + -- /bin/bash -c 'export PATH="$(find /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/threat-detection/detection.log env: COPILOT_AGENT_RUNNER_TYPE: STANDALONE COPILOT_API_KEY: dummy-byok-key-for-offline-mode @@ -1191,7 +1214,7 @@ jobs: COPILOT_MODEL: claude-sonnet-4.5 GH_AW_PHASE: detection GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_VERSION: v0.71.1 + GH_AW_VERSION: v0.71.2 GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows @@ -1215,16 +1238,33 @@ jobs: - name: Parse and conclude threat detection id: detection_conclusion if: always() + continue-on-error: true uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 env: RUN_DETECTION: ${{ steps.detection_guard.outputs.run_detection }} GH_AW_DETECTION_CONTINUE_ON_ERROR: "true" with: script: | - const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); - setupGlobals(core, github, context, exec, io, getOctokit); - const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_threat_detection_results.cjs'); - await main(); + try { + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_threat_detection_results.cjs'); + await main(); + } catch (loadErr) { + const continueOnError = process.env.GH_AW_DETECTION_CONTINUE_ON_ERROR !== 'false'; + const msg = 'ERR_SYSTEM: \u274C Unexpected error loading threat detection module: ' + (loadErr && loadErr.message ? loadErr.message : String(loadErr)); + core.error(msg); + core.setOutput('reason', 'parse_error'); + if (continueOnError) { + core.warning('\u26A0\uFE0F ' + msg); + core.setOutput('conclusion', 'warning'); + core.setOutput('success', 'false'); + } else { + core.setOutput('conclusion', 'failure'); + core.setOutput('success', 'false'); + core.setFailed(msg); + } + } pre_activation: if: "github.event_name == 'issue_comment' && (startsWith(github.event.comment.body, '/review ') || startsWith(github.event.comment.body, '/review\n') || github.event.comment.body == '/review') && github.event.issue.pull_request != null || !(github.event_name == 'issue_comment')" @@ -1236,7 +1276,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@239aec45b78c8799417efdd5bc6d8cc036629ec1 # v0.71.1 + uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} @@ -1282,7 +1322,7 @@ jobs: GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }} GH_AW_ENGINE_ID: "copilot" GH_AW_ENGINE_MODEL: "claude-sonnet-4.5" - GH_AW_ENGINE_VERSION: "1.0.35" + GH_AW_ENGINE_VERSION: "1.0.36" GH_AW_WORKFLOW_ID: "macios-reviewer" GH_AW_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" outputs: @@ -1295,7 +1335,7 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@239aec45b78c8799417efdd5bc6d8cc036629ec1 # v0.71.1 + uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} From 90c27c82e9363dbce29cfb76ce0eaec588170c69 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 08:37:56 +0200 Subject: [PATCH 06/35] [tests] Fix flaky SecureTransportTest.Tls12 by ignoring network timeouts in CI (#25302) Wrap the Tls12 test body in a try/catch that calls TestRuntime.IgnoreInCIIfBadNetwork to mark the test as ignored (rather than failed) when transient network issues occur in CI. Also extend IgnoreInCIIfTimedOut to handle SocketException timeouts, not just WebException timeouts, so that the SocketException thrown by TcpClient is properly recognized. Fixes https://github.com/dotnet/macios/issues/25241 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- tests/common/TestRuntime.cs | 5 ++ .../Security/SecureTransportTest.cs | 78 +++++++++++-------- 2 files changed, 49 insertions(+), 34 deletions(-) diff --git a/tests/common/TestRuntime.cs b/tests/common/TestRuntime.cs index cfa84a3fb329..60e6e37d5c6a 100644 --- a/tests/common/TestRuntime.cs +++ b/tests/common/TestRuntime.cs @@ -1664,6 +1664,11 @@ public static void IgnoreInCIIfTimedOut (Exception ex) IgnoreInCI ($"Ignored due to network error: {wex}"); } } + + var se = FindInner (ex); + if (se is not null && se.SocketErrorCode == System.Net.Sockets.SocketError.TimedOut) { + IgnoreInCI ($"Ignored due to socket timeout: {se.Message}"); + } } public static void IgnoreInCIIfForbidden (Exception ex) diff --git a/tests/monotouch-test/Security/SecureTransportTest.cs b/tests/monotouch-test/Security/SecureTransportTest.cs index 79b9f89467f4..d44aa17a3619 100644 --- a/tests/monotouch-test/Security/SecureTransportTest.cs +++ b/tests/monotouch-test/Security/SecureTransportTest.cs @@ -130,45 +130,55 @@ public void DatagramDefaults () [Test] public void Tls12 () { - var client = new TcpClient ("google.ca", 443); - using (NetworkStream ns = client.GetStream ()) - using (var ssl = new SslContext (SslProtocolSide.Client, SslConnectionType.Stream)) { - - ssl.MinProtocol = SslProtocol.Tls_1_2; - Assert.That (ssl.MinProtocol, Is.EqualTo (SslProtocol.Tls_1_2), "MinProtocol"); - - ssl.Connection = new SslStreamConnection (ns); - - var result = ssl.Handshake (); - while (result == SslStatus.WouldBlock || result == (SslStatus) (-108)) { - // we need to ask again - but if we're too fast we'll get -108 (errSecAllocate) - Thread.Sleep (100); - // during the above call SessionState is Handshake - Assert.That (ssl.SessionState, Is.EqualTo (SslSessionState.Handshake), "Handshake/in progress"); - result = ssl.Handshake (); - } - Assert.That (result, Is.EqualTo (SslStatus.Success), "Handshake/done"); + try { + var client = new TcpClient ("google.ca", 443); + using (NetworkStream ns = client.GetStream ()) + using (var ssl = new SslContext (SslProtocolSide.Client, SslConnectionType.Stream)) { + + ssl.MinProtocol = SslProtocol.Tls_1_2; + Assert.That (ssl.MinProtocol, Is.EqualTo (SslProtocol.Tls_1_2), "MinProtocol"); + + ssl.Connection = new SslStreamConnection (ns); + + var deadline = DateTime.UtcNow.AddSeconds (30); + var result = ssl.Handshake (); + while (result == SslStatus.WouldBlock || result == (SslStatus) errSecAllocate) { + Assert.That (DateTime.UtcNow, Is.LessThan (deadline), "Handshake/timeout"); + // we need to ask again - but if we're too fast we'll get errSecAllocate + Thread.Sleep (100); + // during the above call SessionState is Handshake + Assert.That (ssl.SessionState, Is.EqualTo (SslSessionState.Handshake), "Handshake/in progress"); + result = ssl.Handshake (); + } + Assert.That (result, Is.EqualTo (SslStatus.Success), "Handshake/done"); - // FIXME: iOS 8 beta 1 bug ?!? the state is not updated (maybe delayed?) but the code still works - //Assert.That (ssl.SessionState, Is.EqualTo (SslSessionState.Connected), "Connected"); - Assert.That (ssl.NegotiatedProtocol, Is.EqualTo (SslProtocol.Tls_1_2), "NegotiatedProtocol"); + // FIXME: iOS 8 beta 1 bug ?!? the state is not updated (maybe delayed?) but the code still works + //Assert.That (ssl.SessionState, Is.EqualTo (SslSessionState.Connected), "Connected"); + Assert.That (ssl.NegotiatedProtocol, Is.EqualTo (SslProtocol.Tls_1_2), "NegotiatedProtocol"); - nint processed; - var data = Encoding.UTF8.GetBytes ("GET / HTTP/1.0" + Environment.NewLine + Environment.NewLine); - result = ssl.Write (data, out processed); - Assert.That (processed, Is.EqualTo ((nint) data.Length), "small buffer"); - Assert.That (result, Is.EqualTo (SslStatus.Success), "Write"); + nint processed; + var data = Encoding.UTF8.GetBytes ("GET / HTTP/1.0" + Environment.NewLine + Environment.NewLine); + result = ssl.Write (data, out processed); + Assert.That (processed, Is.EqualTo ((nint) data.Length), "small buffer"); + Assert.That (result, Is.EqualTo (SslStatus.Success), "Write"); - data = new byte [1024]; - result = ssl.Read (data, out processed); - while (result == SslStatus.WouldBlock) + data = new byte [1024]; + deadline = DateTime.UtcNow.AddSeconds (30); result = ssl.Read (data, out processed); - Assert.That (result, Is.EqualTo (SslStatus.Success), "Read"); + while (result == SslStatus.WouldBlock) { + Assert.That (DateTime.UtcNow, Is.LessThan (deadline), "Read/timeout"); + result = ssl.Read (data, out processed); + } + Assert.That (result, Is.EqualTo (SslStatus.Success), "Read"); - string s = Encoding.UTF8.GetString (data, 0, (int) processed); - // The result apparently depends on where you are: I get a 302, the bots get a 200. - // Also sometimes it fails with 502 Bad Gateway on the bots - Assert.That (s, Does.StartWith ("HTTP/1.0 302 Found").Or.StartWith ("HTTP/1.0 200 OK").Or.StartWith ("HTTP/1.0 502 Bad Gateway"), "response"); + string s = Encoding.UTF8.GetString (data, 0, (int) processed); + // The result apparently depends on where you are: I get a 302, the bots get a 200. + // Also sometimes it fails with 502 Bad Gateway on the bots + Assert.That (s, Does.StartWith ("HTTP/1.0 302 Found").Or.StartWith ("HTTP/1.0 200 OK").Or.StartWith ("HTTP/1.0 502 Bad Gateway"), "response"); + } + } catch (Exception ex) { + TestRuntime.IgnoreInCIIfBadNetwork (ex); + throw; } } } From 5a4d75c3faf6db5df2134f509668956a9a48a86a Mon Sep 17 00:00:00 2001 From: "CSIGS@microsoft.com" Date: Tue, 5 May 2026 02:26:00 -0700 Subject: [PATCH 07/35] LEGO: Pull request from lego/hb_5df43909-4a19-4f55-bc3f-9ea8fccf3c82_20260505064756191 to main (#25325) LEGO: Pull request from lego/hb_5df43909-4a19-4f55-bc3f-9ea8fccf3c82_20260505064756191 to main with localized lcls --- .../cs/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ .../es/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ .../fr/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ .../pt-BR/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ .../ru/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ .../macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ .../macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ 7 files changed, 189 insertions(+) diff --git a/macios/Localize/loc/cs/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/cs/macios/tools/mtouch/Errors.resx.lcl index d66a13518d03..81e85ff7b213 100644 --- a/macios/Localize/loc/cs/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/cs/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/macios/Localize/loc/es/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/es/macios/tools/mtouch/Errors.resx.lcl index 71d382396cc5..63e741058a55 100644 --- a/macios/Localize/loc/es/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/es/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/macios/Localize/loc/fr/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/fr/macios/tools/mtouch/Errors.resx.lcl index d3a69c437805..8ef8855f9da5 100644 --- a/macios/Localize/loc/fr/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/fr/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/macios/Localize/loc/pt-BR/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/pt-BR/macios/tools/mtouch/Errors.resx.lcl index d893a87b4e74..b6e107f5acc2 100644 --- a/macios/Localize/loc/pt-BR/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/pt-BR/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/macios/Localize/loc/ru/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/ru/macios/tools/mtouch/Errors.resx.lcl index 80205c40569f..e076f441c2eb 100644 --- a/macios/Localize/loc/ru/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/ru/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/macios/Localize/loc/zh-Hans/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/zh-Hans/macios/tools/mtouch/Errors.resx.lcl index 08b62dea5624..a2d73ba8d17a 100644 --- a/macios/Localize/loc/zh-Hans/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/zh-Hans/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/macios/Localize/loc/zh-Hant/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/zh-Hant/macios/tools/mtouch/Errors.resx.lcl index 0063007365b0..3d2193f28959 100644 --- a/macios/Localize/loc/zh-Hant/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/zh-Hant/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + From 69ef15b81ced4f5cacc6707b1c46ab598d383616 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 12:07:42 +0200 Subject: [PATCH 08/35] Change DtdProcessing.Parse to DtdProcessing.Prohibit in XML loading helpers (#25268) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Multiple XML loading helpers use `DtdProcessing.Parse`, which enables inline DTD processing and opens a vector for entity expansion DoS ("billion laughs"). While `XmlResolver = null` prevents external entity resolution, inline DTDs are still processed. Apple plist files declare a DTD but don't depend on DTD processing for correctness. This PR changes `DtdProcessing.Parse` to `DtdProcessing.Prohibit` in all affected locations: - `tools/common/PListExtensions.cs` — 2 occurrences (file and string overloads) - `src/bgen/Extensions/ExtensionMethods.cs` — 1 occurrence - `tests/cecil-tests/Helper.cs` — 1 occurrence - `tests/mtouch/MTouch.cs` — 1 occurrence - `tests/common/ProductTests.cs` — 1 occurrence 🤖 Pull request created by Copilot --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/bgen/Extensions/ExtensionMethods.cs | 2 +- tests/cecil-tests/Helper.cs | 2 +- tests/common/ProductTests.cs | 2 +- tests/mtouch/MTouch.cs | 2 +- tools/common/PListExtensions.cs | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/bgen/Extensions/ExtensionMethods.cs b/src/bgen/Extensions/ExtensionMethods.cs index dec5b0caf256..3f3bdc389265 100644 --- a/src/bgen/Extensions/ExtensionMethods.cs +++ b/src/bgen/Extensions/ExtensionMethods.cs @@ -26,7 +26,7 @@ public static void LoadWithoutNetworkAccess (this XmlDocument doc, string filena using (var fs = new FileStream (filename, FileMode.Open, FileAccess.Read)) { var settings = new XmlReaderSettings () { XmlResolver = null, - DtdProcessing = DtdProcessing.Parse, + DtdProcessing = DtdProcessing.Ignore, }; using (var reader = XmlReader.Create (fs, settings)) { doc.Load (reader); diff --git a/tests/cecil-tests/Helper.cs b/tests/cecil-tests/Helper.cs index 30f4e487e42f..f06c07616a8a 100644 --- a/tests/cecil-tests/Helper.cs +++ b/tests/cecil-tests/Helper.cs @@ -616,7 +616,7 @@ public static void LoadWithoutNetworkAccess (this XmlDocument doc, string filena using (var fs = new FileStream (filename, FileMode.Open, FileAccess.Read)) { var settings = new XmlReaderSettings () { XmlResolver = null, - DtdProcessing = DtdProcessing.Parse, + DtdProcessing = DtdProcessing.Ignore, }; using (var reader = XmlReader.Create (fs, settings)) { doc.Load (reader); diff --git a/tests/common/ProductTests.cs b/tests/common/ProductTests.cs index cd00328e78d4..ec1d1bc53569 100644 --- a/tests/common/ProductTests.cs +++ b/tests/common/ProductTests.cs @@ -18,7 +18,7 @@ public void MonoVersion () // Verify that the mono version is in the Versions.plist, and that it's a parsable version number. var settings = new XmlReaderSettings () { XmlResolver = null, - DtdProcessing = DtdProcessing.Parse + DtdProcessing = DtdProcessing.Ignore }; var plist = Path.Combine (Configuration.SdkRoot, "Versions.plist"); diff --git a/tests/mtouch/MTouch.cs b/tests/mtouch/MTouch.cs index 8f6a10fa853d..d25662235eaf 100644 --- a/tests/mtouch/MTouch.cs +++ b/tests/mtouch/MTouch.cs @@ -1986,7 +1986,7 @@ static void LoadWithoutNetworkAccess (XmlDocument doc, string filename) using (var fs = new FileStream (filename, FileMode.Open, FileAccess.Read)) { var settings = new XmlReaderSettings () { XmlResolver = null, - DtdProcessing = DtdProcessing.Parse, + DtdProcessing = DtdProcessing.Ignore, }; using (var reader = XmlReader.Create (fs, settings)) { doc.Load (reader); diff --git a/tools/common/PListExtensions.cs b/tools/common/PListExtensions.cs index 26ac6c7e745e..892e142eb61d 100644 --- a/tools/common/PListExtensions.cs +++ b/tools/common/PListExtensions.cs @@ -11,7 +11,7 @@ public static void LoadWithoutNetworkAccess (this XmlDocument doc, string filena using (var fs = new FileStream (filename, FileMode.Open, FileAccess.Read)) { var settings = new XmlReaderSettings () { XmlResolver = null, - DtdProcessing = DtdProcessing.Parse, + DtdProcessing = DtdProcessing.Ignore, }; using (var reader = XmlReader.Create (fs, settings)) { doc.Load (reader); @@ -24,7 +24,7 @@ public static void LoadXmlWithoutNetworkAccess (this XmlDocument doc, string xml using (var fs = new StringReader (xml)) { var settings = new XmlReaderSettings () { XmlResolver = null, - DtdProcessing = DtdProcessing.Parse, + DtdProcessing = DtdProcessing.Ignore, }; using (var reader = XmlReader.Create (fs, settings)) { doc.Load (reader); From 211364cd5dc18951b694bfdd63b872fbff04041a Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 12:08:16 +0200 Subject: [PATCH 09/35] [devops] Show "(Publish failed)" instead of broken VSDrops link when html report publish fails. (#25233) When the "Publish to Artifact Services Drop" step times out or fails, the VSDrops link in the GitHub comment would point to a non-existent page. Now detect the failure by setting an output variable when the step does not succeed, and show "(Publish failed)" in plain text instead of a broken link. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../automation/scripts/TestResults.Tests.ps1 | 72 +++++++++++++++++++ .../automation/scripts/TestResults.psm1 | 14 +++- .../devops/automation/templates/mac/build.yml | 20 ++++++ .../automation/templates/tests/run-tests.yml | 20 ++++++ 4 files changed, 124 insertions(+), 2 deletions(-) diff --git a/tools/devops/automation/scripts/TestResults.Tests.ps1 b/tools/devops/automation/scripts/TestResults.Tests.ps1 index 1a27744780c7..0d29999bc54f 100644 --- a/tools/devops/automation/scripts/TestResults.Tests.ps1 +++ b/tools/devops/automation/scripts/TestResults.Tests.ps1 @@ -1352,4 +1352,76 @@ Test results reported success, but the tests job failed. $sonomaIdx | Should -BeLessThan $sequoiaIdx } } + + Context "VSDrops publish failed" { + It "shows publish failed text instead of VSDrops link" { + $VerbosePreference = "Continue" + $DebugPreference = "Continue" + + $vsdropsMatrix = @" +{ + "cecil": { + "LABEL": "cecil", + "TESTS_LABELS": "--label=skip-all-tests,run-cecil-tests", + "TEST_STAGE": "simulator_tests", + "LABEL_WITH_PLATFORM": "cecil", + "STATUS_CONTEXT": "VSTS: simulator tests - cecil", + "TEST_PREFIX": "simulator_testscecil", + "TEST_PLATFORM": "" + } +} +"@ + $vsdropsFailedStageDeps = @" +{ + "configure_build": { + "configure": { + "outputs": { + "test_matrix.TEST_MATRIX": "$($vsdropsMatrix.Replace("`n", "\n").Replace("`"", "\`""))" + } + } + }, + "simulator_tests": { + "tests": { + "outputs": { + "cecil.PowerShell15.TESTS_ATTEMPT": "1", + "cecil.PowerShell15.TESTS_BOT": "XAMMINI-013.Ventura", + "cecil.PowerShell15.TESTS_LABEL": "cecil", + "cecil.PowerShell15.TESTS_PLATFORM": "", + "cecil.PowerShell15.TESTS_TITLE": "cecil", + "cecil.runTests.TESTS_JOBSTATUS": "Succeeded", + "cecil.setVSDropsPublishResult.VSDROPS_PUBLISHED": "Failed" + }, + "identifier": null, + "name": "tests", + "attempt": 1, + "startTime": null, + "finishTime": null, + "state": "NotStarted", + "result": "Succeeded" + } + } +} +"@ + $testDirectory = Join-Path "." "subdir" + New-Item -Path "$testDirectory" -ItemType "directory" -Force + New-Item -Path "$testDirectory/TestSummary-simulator_testscecil-1" -Name "TestSummary.md" -Value "# :tada: All 1 tests passed :tada:" -Force + + $parallelResults = New-ParallelTestsResults -Path "$testDirectory" -StageDependencies "$vsdropsFailedStageDeps" -Context "context" -VSDropsIndex "vsdropsIndex" + + $parallelResults.IsSuccess() | Should -Be $true + + $sb = [System.Text.StringBuilder]::new() + $parallelResults.WriteComment($sb) + + Remove-Item -Path $testDirectory -Recurse + + $content = $sb.ToString() + + Write-Host $content + + $content | Should -Not -BeLike "*[Html Report (VSDrops)]*" + $content | Should -BeLike "*(:warning: Html Report Publish failed :warning:)*" + $content | Should -BeLike "*[Download]*" + } + } } diff --git a/tools/devops/automation/scripts/TestResults.psm1 b/tools/devops/automation/scripts/TestResults.psm1 index ef5b0eb06457..da6b71d7107e 100644 --- a/tools/devops/automation/scripts/TestResults.psm1 +++ b/tools/devops/automation/scripts/TestResults.psm1 @@ -61,6 +61,7 @@ class TestResult { [string] $TestStage [string] $DisplayName [bool] $IsMacTest + [bool] $VSDropsPublishFailed hidden [int] $Passed hidden [int] $Failed hidden [string[]] $NotTestSummaryLabels = @() @@ -339,9 +340,13 @@ class ParallelTestsResults { } [string] GetDownloadLinks($testResult) { - $dropsIndex = "$($this.VSDropsIndex)/$($testResult.TestStage)$($testResult.Title)-$($testResult.Attempt)/;/tests/vsdrops_index.html" $artifactUrl = "$Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI$Env:SYSTEM_TEAMPROJECT/_apis/build/builds/$Env:BUILD_BUILDID/artifacts?artifactName=HtmlReport-$($testResult.TestStage)$($testResult.Title)-$($testResult.Attempt)&api-version=6.0&`$format=zip" - $downloadInfo = "[Html Report (VSDrops)]($dropsIndex) [Download]($artifactUrl)" + if ($testResult.VSDropsPublishFailed) { + $downloadInfo = "(:warning: Html Report Publish failed :warning:) [Download]($artifactUrl)" + } else { + $dropsIndex = "$($this.VSDropsIndex)/$($testResult.TestStage)$($testResult.Title)-$($testResult.Attempt)/;/tests/vsdrops_index.html" + $downloadInfo = "[Html Report (VSDrops)]($dropsIndex) [Download]($artifactUrl)" + } return $downloadInfo } @@ -589,6 +594,7 @@ class ParallelTestsResults { $platformKey = $outputs.Keys | Where-Object { $_.EndsWith(".TESTS_PLATFORM") } $attemptKey = $outputs.Keys | Where-Object { $_.EndsWith(".TESTS_ATTEMPT") } $titleKey = $outputs.Keys | Where-Object { $_.EndsWith(".TESTS_TITLE") } + $vsdropsPublishedKey = $outputs.Keys | Where-Object { $_.EndsWith(".VSDROPS_PUBLISHED") } | Sort-Object | Select-Object -Last 1 } else { # matrix job $jobName = $name.Substring(0, $name.IndexOf('.')) @@ -597,6 +603,7 @@ class ParallelTestsResults { $platformKey = $outputs.Keys | Where-Object { $_.StartsWith($jobName + ".") -and $_.EndsWith(".TESTS_PLATFORM") } $attemptKey = $outputs.Keys | Where-Object { $_.StartsWith($jobName + ".") -and $_.EndsWith(".TESTS_ATTEMPT") } $titleKey = $outputs.Keys | Where-Object { $_.StartsWith($jobName + ".") -and $_.EndsWith(".TESTS_TITLE") } + $vsdropsPublishedKey = $outputs.Keys | Where-Object { $_.StartsWith($jobName + ".") -and $_.EndsWith(".VSDROPS_PUBLISHED") } | Sort-Object | Select-Object -Last 1 } Write-Host "Keys for Label='$label' and JobName='$jobName' (dotCount=$dotCount): TitleKey='$titleKey' StatusKey=$statusKey BotKey=$botKey PlatformKey=$platformKey AttemptKey=$attemptKey" @@ -611,6 +618,7 @@ class ParallelTestsResults { $platform = if ($platformKey -eq $null) { "NotFound" } else { $outputs[$platformKey] } $attempt = if ($attemptKey -eq $null) { -2 } else { [int]$outputs[$attemptKey] } $title = if ($titleKey -eq $null) { "NotFound" } else { $outputs[$titleKey] } + $vsdropsPublished = if ($vsdropsPublishedKey -eq $null) { $null } else { $outputs[$vsdropsPublishedKey] } $testResult = [PSCustomObject]@{ Label = $label Title = $title @@ -619,6 +627,7 @@ class ParallelTestsResults { Platform = $platform Attempt = $attempt TestStage = $testStage + VSDropsPublished = $vsdropsPublished } if ($tests.Contains($label)) { $testInfo = $tests[$label] @@ -675,6 +684,7 @@ class ParallelTestsResults { } $result = [TestResult]::new($testSummaryPath, $status, $testConfig, $testAttempt) + $result.VSDropsPublishFailed = ($testResult.VSDropsPublished -eq "Failed") } $testResults += $result diff --git a/tools/devops/automation/templates/mac/build.yml b/tools/devops/automation/templates/mac/build.yml index b564d24af9ac..770a2358fb29 100644 --- a/tools/devops/automation/templates/mac/build.yml +++ b/tools/devops/automation/templates/mac/build.yml @@ -210,8 +210,15 @@ steps: condition: succeededOrFailed() # Upload to VSDrops so that the Html Report link in the GitHub comment works. +- bash: | + echo "##vso[task.setvariable variable=JOB_STATUS_BEFORE_VSDROPS]$AGENT_JOBSTATUS" + displayName: 'Capture job status before VSDrops publish' + condition: succeededOrFailed() + continueOnError: true + - task: artifactDropTask@1 displayName: 'Publish to Artifact Services Drop' + name: publishVSDrops inputs: dropServiceURI: 'https://devdiv.artifacts.visualstudio.com/DefaultCollection' dropMetadataContainerName: '${{ parameters.uploadPrefix }}DropMetadata-${{ parameters.stageName }}${{ parameters.label }}-$(System.JobAttempt)' @@ -223,6 +230,19 @@ steps: continueOnError: true condition: succeededOrFailed() +# Azure DevOps doesn't support checking individual step results in step conditions +# (failed('stepName') only works for jobs/stages). Comparing AGENT_JOBSTATUS before +# and after the publish step is the best available approach to detect publish failures. +- bash: | + if [ "$JOB_STATUS_BEFORE_VSDROPS" != "$AGENT_JOBSTATUS" ]; then + echo "VSDrops publish changed job status from '$JOB_STATUS_BEFORE_VSDROPS' to '$AGENT_JOBSTATUS'" + echo "##vso[task.setvariable variable=VSDROPS_PUBLISHED;isOutput=true]Failed" + fi + name: setVSDropsPublishResult + displayName: 'Set VSDrops publish result' + continueOnError: true + condition: succeededOrFailed() + - template: ../common/archive-html-report.yml parameters: rootFolder: '$(BUILD_REPOSITORY_TITLE)/jenkins-results' diff --git a/tools/devops/automation/templates/tests/run-tests.yml b/tools/devops/automation/templates/tests/run-tests.yml index 0ff0d43d39cb..188474aa28ea 100644 --- a/tools/devops/automation/templates/tests/run-tests.yml +++ b/tools/devops/automation/templates/tests/run-tests.yml @@ -182,8 +182,15 @@ steps: continueOnError: true condition: succeededOrFailed() +- bash: | + echo "##vso[task.setvariable variable=JOB_STATUS_BEFORE_VSDROPS]$AGENT_JOBSTATUS" + displayName: 'Capture job status before VSDrops publish' + condition: succeededOrFailed() + continueOnError: true + - task: artifactDropTask@1 displayName: 'Publish to Artifact Services Drop' + name: publishVSDrops inputs: dropServiceURI: 'https://devdiv.artifacts.visualstudio.com/DefaultCollection' dropMetadataContainerName: '${{ parameters.uploadPrefix }}DropMetadata-${{ parameters.testPrefix }}${{ parameters.labelWithPlatform }}-$(System.JobAttempt)' @@ -195,6 +202,19 @@ steps: continueOnError: true condition: succeededOrFailed() +# Azure DevOps doesn't support checking individual step results in step conditions +# (failed('stepName') only works for jobs/stages). Comparing AGENT_JOBSTATUS before +# and after the publish step is the best available approach to detect publish failures. +- bash: | + if [ "$JOB_STATUS_BEFORE_VSDROPS" != "$AGENT_JOBSTATUS" ]; then + echo "VSDrops publish changed job status from '$JOB_STATUS_BEFORE_VSDROPS' to '$AGENT_JOBSTATUS'" + echo "##vso[task.setvariable variable=VSDROPS_PUBLISHED;isOutput=true]Failed" + fi + name: setVSDropsPublishResult + displayName: 'Set VSDrops publish result' + continueOnError: true + condition: succeededOrFailed() + - bash: | set -ex find . -name 'vsts-*.xml' || true From 8f5e4781378c460dc25ec412b4eb4b09c1d2dfcd Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 13:04:53 +0200 Subject: [PATCH 10/35] [dotnet] Disable trimming when using CoreCLR in the simulator. (#25315) Fixes #25295. --- dotnet/targets/Xamarin.Shared.Sdk.Trimming.props | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/dotnet/targets/Xamarin.Shared.Sdk.Trimming.props b/dotnet/targets/Xamarin.Shared.Sdk.Trimming.props index c2b34b5d4c10..02dd815c5f81 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.Trimming.props +++ b/dotnet/targets/Xamarin.Shared.Sdk.Trimming.props @@ -50,8 +50,11 @@ <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == '' And '$(_UseNativeAot)' == 'true'">Full - - <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == '' And '$(UseMonoRuntime)' != 'true'">None + + <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == '' And '$(UseMonoRuntime)' != 'true' And '$(_PlatformName)' == 'macOS'">None + + + <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == '' And '$(UseMonoRuntime)' != 'true' And '$(_SdkIsSimulator)' == 'true'">None <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == '' And '$(_PlatformName)' == 'MacCatalyst' And '$(Configuration)' == 'Release'">SdkOnly @@ -62,10 +65,10 @@ <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == '' And '$(_PlatformName)' == 'MacCatalyst'">None - - <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == '' And '$(_SdkIsSimulator)' == 'true' And $(RuntimeIdentifier.Contains('arm64')) And '$(MtouchInterpreter)' == ''">SdkOnly - - <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == '' And '$(_SdkIsSimulator)' == 'true' And (!$(RuntimeIdentifier.Contains('arm64')) Or '$(MtouchInterpreter)' != '')">None + + <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == '' And '$(_SdkIsSimulator)' == 'true' And '$(UseMonoRuntime)' == 'true' And $(RuntimeIdentifier.Contains('arm64')) And '$(MtouchInterpreter)' == ''">SdkOnly + + <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == '' And '$(_SdkIsSimulator)' == 'true' And '$(UseMonoRuntime)' == 'true' And (!$(RuntimeIdentifier.Contains('arm64')) Or '$(MtouchInterpreter)' != '')">None <_DefaultLinkMode Condition="'$(_DefaultLinkMode)' == ''">SdkOnly From a18350121e6d99355b93df77f5705ccb1e6482e4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 11:35:59 +0000 Subject: [PATCH 11/35] Reset files to net11.0 Reset patterns: - global.json - NuGet.config - eng/Version.Details.xml - eng/Version.Details.props - eng/common/* --- NuGet.config | 23 +- eng/Version.Details.props | 56 +- eng/Version.Details.xml | 112 ++-- eng/common/SetupNugetSources.ps1 | 17 +- eng/common/SetupNugetSources.sh | 17 +- eng/common/build.ps1 | 2 + eng/common/build.sh | 8 +- eng/common/core-templates/job/job.yml | 8 + .../job/publish-build-assets.yml | 12 +- eng/common/core-templates/job/renovate.yml | 196 +++++++ .../job/source-index-stage1.yml | 6 +- .../post-build/common-variables.yml | 2 - .../core-templates/post-build/post-build.yml | 528 ++++++++---------- eng/common/core-templates/stages/renovate.yml | 111 ++++ .../steps/install-microbuild-impl.yml | 34 ++ .../steps/install-microbuild.yml | 64 ++- .../core-templates/steps/publish-logs.yml | 1 + .../core-templates/steps/source-build.yml | 2 +- .../steps/source-index-stage1-publish.yml | 8 +- eng/common/cross/build-rootfs.sh | 81 ++- eng/common/cross/toolchain.cmake | 15 +- eng/common/darc-init.ps1 | 8 +- eng/common/darc-init.sh | 6 +- eng/common/dotnet-install.sh | 2 +- eng/common/dotnet.sh | 2 +- eng/common/internal-feed-operations.sh | 2 +- eng/common/native/init-distro-rid.sh | 2 + eng/common/native/install-dependencies.sh | 11 +- eng/common/post-build/redact-logs.ps1 | 7 +- eng/common/renovate.env | 42 ++ eng/common/sdk-task.ps1 | 17 +- eng/common/sdk-task.sh | 2 +- eng/common/template-guidance.md | 3 - eng/common/tools.ps1 | 216 +++---- eng/common/tools.sh | 122 +++- global.json | 6 +- 36 files changed, 1086 insertions(+), 665 deletions(-) create mode 100644 eng/common/core-templates/job/renovate.yml create mode 100644 eng/common/core-templates/stages/renovate.yml create mode 100644 eng/common/core-templates/steps/install-microbuild-impl.yml create mode 100644 eng/common/renovate.env diff --git a/NuGet.config b/NuGet.config index 75219c2881e1..16e5efc02d96 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,11 +9,8 @@ - - - - + @@ -27,27 +24,13 @@ - - + + - - - - - - - - - - - - - - diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 1f6015e97f8b..da51f16a7df7 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -6,36 +6,27 @@ This file should be imported by eng/Versions.props - 10.0.0-beta.26216.121 - 10.0.0-beta.26216.121 - 0.11.5-alpha.26070.104 - 10.0.0-beta.26216.121 - 10.0.3-servicing.26070.104 - 10.0.3 - 10.0.3 - 10.0.300-preview.0.26216.121 - 10.0.3 - 10.0.300-preview.26216.121 + 11.0.0-beta.26229.113 + 11.0.0-beta.26229.113 + 0.11.5-preview.26229.113 + 11.0.0-beta.26229.113 + 11.0.0-preview.5.26229.113 + 11.0.0-preview.5.26229.113 + 11.0.0-preview.5.26229.113 + 11.0.100-preview.5.26229.113 + 11.0.0-preview.5.26229.113 + 11.0.100-preview.5.26229.113 26.0.11017 - 18.5.9227 - 26.4.9015 + 26.4.10259 26.0.11017 - 18.5.9227 - 26.4.9015 + 26.4.10259 26.0.11017 - 15.5.9227 - 26.4.9015 + 26.4.10259 26.0.11017 - 18.5.9227 - 26.4.9015 + 26.4.10259 - 11.0.0-prerelease.26230.4 - - 18.0.9617 - 18.0.9617 - 15.0.9617 - 18.0.9617 + 11.0.0-prerelease.26217.1 @@ -52,23 +43,14 @@ This file should be imported by eng/Versions.props $(MicrosoftTemplateEngineAuthoringTasksPackageVersion) $(MicrosoftiOSSdknet100_260PackageVersion) - $(MicrosoftiOSSdknet90_185PackageVersion) - $(MicrosoftiOSSdknet90_264PackageVersion) + $(MicrosoftiOSSdknet100_264PackageVersion) $(MicrosoftMacCatalystSdknet100_260PackageVersion) - $(MicrosoftMacCatalystSdknet90_185PackageVersion) - $(MicrosoftMacCatalystSdknet90_264PackageVersion) + $(MicrosoftMacCatalystSdknet100_264PackageVersion) $(MicrosoftmacOSSdknet100_260PackageVersion) - $(MicrosoftmacOSSdknet90_155PackageVersion) - $(MicrosoftmacOSSdknet90_264PackageVersion) + $(MicrosoftmacOSSdknet100_264PackageVersion) $(MicrosofttvOSSdknet100_260PackageVersion) - $(MicrosofttvOSSdknet90_185PackageVersion) - $(MicrosofttvOSSdknet90_264PackageVersion) + $(MicrosofttvOSSdknet100_264PackageVersion) $(MicrosoftDotNetXHarnessiOSSharedPackageVersion) - - $(MicrosoftiOSSdknet90_180PackageVersion) - $(MicrosoftMacCatalystSdknet90_180PackageVersion) - $(MicrosoftmacOSSdknet90_150PackageVersion) - $(MicrosofttvOSSdknet90_180PackageVersion) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5b24b5001ad7..8a9be39bd6d5 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,80 +1,29 @@ - + https://github.com/dotnet/dotnet - e43cbe04901ea4cf359ed0883b0533abab224ba2 + 4c4e7f410fc876590f219fc6022b6c18d6f6a475 - + https://github.com/dotnet/dotnet - 455f1358f39b4d38fa3893c327a45027c4a81843 + 4c4e7f410fc876590f219fc6022b6c18d6f6a475 - + https://github.com/dotnet/dotnet - 455f1358f39b4d38fa3893c327a45027c4a81843 + 4c4e7f410fc876590f219fc6022b6c18d6f6a475 - + https://github.com/dotnet/dotnet - 455f1358f39b4d38fa3893c327a45027c4a81843 + 4c4e7f410fc876590f219fc6022b6c18d6f6a475 - + https://github.com/dotnet/dotnet - 455f1358f39b4d38fa3893c327a45027c4a81843 + 4c4e7f410fc876590f219fc6022b6c18d6f6a475 - + https://github.com/dotnet/dotnet - 455f1358f39b4d38fa3893c327a45027c4a81843 - - - - https://github.com/dotnet/macios - 4681bf928d70aa79cff2c33ad324b3be9c62b66d - - - https://github.com/dotnet/macios - 4681bf928d70aa79cff2c33ad324b3be9c62b66d - - - https://github.com/dotnet/macios - 4681bf928d70aa79cff2c33ad324b3be9c62b66d - - - https://github.com/dotnet/macios - 4681bf928d70aa79cff2c33ad324b3be9c62b66d - - - - https://github.com/xamarin/xamarin-macios - 797d30720e5e629d23eb146935da94cb1b61047e - - - https://github.com/xamarin/xamarin-macios - 797d30720e5e629d23eb146935da94cb1b61047e - - - https://github.com/xamarin/xamarin-macios - 797d30720e5e629d23eb146935da94cb1b61047e - - - https://github.com/xamarin/xamarin-macios - 797d30720e5e629d23eb146935da94cb1b61047e - - - - https://github.com/dotnet/macios - ac80159dab3bdd969c7e38fceb02499d3be92ac4 - - - https://github.com/dotnet/macios - ac80159dab3bdd969c7e38fceb02499d3be92ac4 - - - https://github.com/dotnet/macios - ac80159dab3bdd969c7e38fceb02499d3be92ac4 - - - https://github.com/dotnet/macios - ac80159dab3bdd969c7e38fceb02499d3be92ac4 + 4c4e7f410fc876590f219fc6022b6c18d6f6a475 @@ -93,27 +42,44 @@ https://github.com/dotnet/macios 23eb1c2c9465fe76c810c8a69982c1254161f4b0 + + + https://github.com/dotnet/macios + 644ec02a86d927f38d214102bc94ba4162b13c4c + + + https://github.com/dotnet/macios + 644ec02a86d927f38d214102bc94ba4162b13c4c + + + https://github.com/dotnet/macios + 644ec02a86d927f38d214102bc94ba4162b13c4c + + + https://github.com/dotnet/macios + 644ec02a86d927f38d214102bc94ba4162b13c4c + - + https://github.com/dotnet/dotnet - e43cbe04901ea4cf359ed0883b0533abab224ba2 + 4c4e7f410fc876590f219fc6022b6c18d6f6a475 - + https://github.com/dotnet/dotnet - e43cbe04901ea4cf359ed0883b0533abab224ba2 + 4c4e7f410fc876590f219fc6022b6c18d6f6a475 - + https://github.com/dotnet/dotnet - e43cbe04901ea4cf359ed0883b0533abab224ba2 + 4c4e7f410fc876590f219fc6022b6c18d6f6a475 - + https://github.com/dotnet/xharness - 92962e5c46ac08a66ded4c5696209cc60f1a232f + 866707736d49c2323628744716cda2475b3af9ee - + https://github.com/dotnet/dotnet - e43cbe04901ea4cf359ed0883b0533abab224ba2 + 4c4e7f410fc876590f219fc6022b6c18d6f6a475 diff --git a/eng/common/SetupNugetSources.ps1 b/eng/common/SetupNugetSources.ps1 index 65ed3a8adef0..fc8d618014e0 100644 --- a/eng/common/SetupNugetSources.ps1 +++ b/eng/common/SetupNugetSources.ps1 @@ -1,7 +1,6 @@ # This script adds internal feeds required to build commits that depend on internal package sources. For instance, -# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. Similarly, -# dotnet-eng-internal and dotnet-tools-internal are added if dotnet-eng and dotnet-tools are present. -# In addition, this script also enables disabled internal Maestro (darc-int*) feeds. +# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. In addition also enables +# disabled internal Maestro (darc-int*) feeds. # # Optionally, this script also adds a credential entry for each of the internal feeds if supplied. # @@ -174,16 +173,4 @@ foreach ($dotnetVersion in $dotnetVersions) { } } -# Check for dotnet-eng and add dotnet-eng-internal if present -$dotnetEngSource = $sources.SelectSingleNode("add[@key='dotnet-eng']") -if ($dotnetEngSource -ne $null) { - AddOrEnablePackageSource -Sources $sources -DisabledPackageSources $disabledSources -SourceName "dotnet-eng-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-eng-internal/nuget/$feedSuffix" -Creds $creds -Username $userName -pwd $Password -} - -# Check for dotnet-tools and add dotnet-tools-internal if present -$dotnetToolsSource = $sources.SelectSingleNode("add[@key='dotnet-tools']") -if ($dotnetToolsSource -ne $null) { - AddOrEnablePackageSource -Sources $sources -DisabledPackageSources $disabledSources -SourceName "dotnet-tools-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal/nuget/$feedSuffix" -Creds $creds -Username $userName -pwd $Password -} - $doc.Save($filename) diff --git a/eng/common/SetupNugetSources.sh b/eng/common/SetupNugetSources.sh index b2163abbe71b..b97cc536379d 100644 --- a/eng/common/SetupNugetSources.sh +++ b/eng/common/SetupNugetSources.sh @@ -1,9 +1,8 @@ #!/usr/bin/env bash # This script adds internal feeds required to build commits that depend on internal package sources. For instance, -# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. Similarly, -# dotnet-eng-internal and dotnet-tools-internal are added if dotnet-eng and dotnet-tools are present. -# In addition, this script also enables disabled internal Maestro (darc-int*) feeds. +# dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. In addition also enables +# disabled internal Maestro (darc-int*) feeds. # # Optionally, this script also adds a credential entry for each of the internal feeds if supplied. # @@ -174,18 +173,6 @@ for DotNetVersion in ${DotNetVersions[@]} ; do fi done -# Check for dotnet-eng and add dotnet-eng-internal if present -grep -i " /dev/null -if [ "$?" == "0" ]; then - AddOrEnablePackageSource "dotnet-eng-internal" "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-eng-internal/nuget/$FeedSuffix" -fi - -# Check for dotnet-tools and add dotnet-tools-internal if present -grep -i " /dev/null -if [ "$?" == "0" ]; then - AddOrEnablePackageSource "dotnet-tools-internal" "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet-tools-internal/nuget/$FeedSuffix" -fi - # I want things split line by line PrevIFS=$IFS IFS=$'\n' diff --git a/eng/common/build.ps1 b/eng/common/build.ps1 index 8cfee107e7a3..18397a60eb85 100644 --- a/eng/common/build.ps1 +++ b/eng/common/build.ps1 @@ -6,6 +6,7 @@ Param( [string][Alias('v')]$verbosity = "minimal", [string] $msbuildEngine = $null, [bool] $warnAsError = $true, + [string] $warnNotAsError = '', [bool] $nodeReuse = $true, [switch] $buildCheck = $false, [switch][Alias('r')]$restore, @@ -70,6 +71,7 @@ function Print-Usage() { Write-Host " -excludeCIBinarylog Don't output binary log (short: -nobl)" Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build" Write-Host " -warnAsError Sets warnaserror msbuild parameter ('true' or 'false')" + Write-Host " -warnNotAsError Sets a semi-colon delimited list of warning codes that should not be treated as errors" Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." Write-Host " -excludePrereleaseVS Set to exclude build engines in prerelease versions of Visual Studio" Write-Host " -nativeToolsOnMachine Sets the native tools on machine environment variable (indicating that the script should use native tools on machine)" diff --git a/eng/common/build.sh b/eng/common/build.sh index 9767bb411a4f..5883e53bcfb1 100644 --- a/eng/common/build.sh +++ b/eng/common/build.sh @@ -42,6 +42,7 @@ usage() echo " --prepareMachine Prepare machine for CI run, clean up processes after build" echo " --nodeReuse Sets nodereuse msbuild parameter ('true' or 'false')" echo " --warnAsError Sets warnaserror msbuild parameter ('true' or 'false')" + echo " --warnNotAsError Sets a semi-colon delimited list of warning codes that should not be treated as errors" echo " --buildCheck Sets /check msbuild parameter" echo " --fromVMR Set when building from within the VMR" echo "" @@ -78,6 +79,7 @@ ci=false clean=false warn_as_error=true +warn_not_as_error='' node_reuse=true build_check=false binary_log=false @@ -92,7 +94,7 @@ runtime_source_feed='' runtime_source_feed_key='' properties=() -while [[ $# > 0 ]]; do +while [[ $# -gt 0 ]]; do opt="$(echo "${1/#--/-}" | tr "[:upper:]" "[:lower:]")" case "$opt" in -help|-h) @@ -176,6 +178,10 @@ while [[ $# > 0 ]]; do warn_as_error=$2 shift ;; + -warnnotaserror) + warn_not_as_error=$2 + shift + ;; -nodereuse) node_reuse=$2 shift diff --git a/eng/common/core-templates/job/job.yml b/eng/common/core-templates/job/job.yml index eaed6d87e653..66c7988f222a 100644 --- a/eng/common/core-templates/job/job.yml +++ b/eng/common/core-templates/job/job.yml @@ -19,6 +19,8 @@ parameters: # publishing defaults artifacts: '' enableMicrobuild: false + enablePreviewMicrobuild: false + microbuildPluginVersion: 'latest' enableMicrobuildForMacAndLinux: false microbuildUseESRP: true enablePublishBuildArtifacts: false @@ -71,6 +73,8 @@ jobs: templateContext: ${{ parameters.templateContext }} variables: + - name: AllowPtrToDetectTestRunRetryFiles + value: true - ${{ if ne(parameters.enableTelemetry, 'false') }}: - name: DOTNET_CLI_TELEMETRY_PROFILE value: '$(Build.Repository.Uri)' @@ -128,6 +132,8 @@ jobs: - template: /eng/common/core-templates/steps/install-microbuild.yml parameters: enableMicrobuild: ${{ parameters.enableMicrobuild }} + enablePreviewMicrobuild: ${{ parameters.enablePreviewMicrobuild }} + microbuildPluginVersion: ${{ parameters.microbuildPluginVersion }} enableMicrobuildForMacAndLinux: ${{ parameters.enableMicrobuildForMacAndLinux }} microbuildUseESRP: ${{ parameters.microbuildUseESRP }} continueOnError: ${{ parameters.continueOnError }} @@ -150,6 +156,8 @@ jobs: - template: /eng/common/core-templates/steps/cleanup-microbuild.yml parameters: enableMicrobuild: ${{ parameters.enableMicrobuild }} + enablePreviewMicrobuild: ${{ parameters.enablePreviewMicrobuild }} + microbuildPluginVersion: ${{ parameters.microbuildPluginVersion }} enableMicrobuildForMacAndLinux: ${{ parameters.enableMicrobuildForMacAndLinux }} continueOnError: ${{ parameters.continueOnError }} diff --git a/eng/common/core-templates/job/publish-build-assets.yml b/eng/common/core-templates/job/publish-build-assets.yml index 06f2eed0323d..700f77114658 100644 --- a/eng/common/core-templates/job/publish-build-assets.yml +++ b/eng/common/core-templates/job/publish-build-assets.yml @@ -91,8 +91,8 @@ jobs: fetchDepth: 3 clean: true - - ${{ if eq(parameters.isAssetlessBuild, 'false') }}: - - ${{ if eq(parameters.publishingVersion, 3) }}: + - ${{ if eq(parameters.isAssetlessBuild, 'false') }}: + - ${{ if eq(parameters.publishingVersion, 3) }}: - task: DownloadPipelineArtifact@2 displayName: Download Asset Manifests inputs: @@ -117,7 +117,7 @@ jobs: flattenFolders: true condition: ${{ parameters.condition }} continueOnError: ${{ parameters.continueOnError }} - + - task: NuGetAuthenticate@1 # Populate internal runtime variables. @@ -125,7 +125,7 @@ jobs: ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: parameters: legacyCredential: $(dn-bot-dnceng-artifact-feeds-rw) - + - template: /eng/common/templates/steps/enable-internal-runtimes.yml - task: AzureCLI@2 @@ -145,7 +145,7 @@ jobs: condition: ${{ parameters.condition }} continueOnError: ${{ parameters.continueOnError }} - + - task: powershell@2 displayName: Create ReleaseConfigs Artifact inputs: @@ -191,7 +191,7 @@ jobs: BARBuildId: ${{ parameters.BARBuildId }} PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} is1ESPipeline: ${{ parameters.is1ESPipeline }} - + # Darc is targeting 8.0, so make sure it's installed - task: UseDotNet@2 inputs: diff --git a/eng/common/core-templates/job/renovate.yml b/eng/common/core-templates/job/renovate.yml new file mode 100644 index 000000000000..ff86c80b4689 --- /dev/null +++ b/eng/common/core-templates/job/renovate.yml @@ -0,0 +1,196 @@ +# -------------------------------------------------------------------------------------- +# Renovate Bot Job Template +# -------------------------------------------------------------------------------------- +# This Azure DevOps pipeline job template runs Renovate (https://docs.renovatebot.com/) +# to automatically update dependencies in a GitHub repository. +# +# Renovate scans the repository for dependency files and creates pull requests to update +# outdated dependencies based on the configuration specified in the renovateConfigPath +# parameter. +# +# Usage: +# For each product repo wanting to make use of Renovate, this template is called from +# an internal Azure DevOps pipeline, typically with a schedule trigger, to check for +# and propose dependency updates. +# +# For more info, see https://github.com/dotnet/arcade/blob/main/Documentation/Renovate.md +# -------------------------------------------------------------------------------------- + +parameters: + +# Path to the Renovate configuration file within the repository. +- name: renovateConfigPath + type: string + default: 'eng/renovate.json' + +# GitHub repository to run Renovate against, in the format 'owner/repo'. +# This could technically be any repo but convention is to target the same +# repo that contains the calling pipeline. The Renovate config file would +# be co-located with the pipeline's repo and, in most cases, the config +# file is specific to the repo being targeted. +- name: gitHubRepo + type: string + +# List of base branches to target for Renovate PRs. +# NOTE: The Renovate configuration file is always read from the branch where the +# pipeline is run, NOT from the target branches specified here. If you need different +# configurations for different branches, run the pipeline from each branch separately. +- name: baseBranches + type: object + default: + - main + +# When true, Renovate will run in dry run mode, which previews changes without creating PRs. +# See the 'Run Renovate' step log output for details of what would have been changed. +- name: dryRun + type: boolean + default: false + +# By default, Renovate will not recreate a PR for a given dependency/version pair that was +# previously closed. This allows opting in to always recreating PRs even if they were +# previously closed. +- name: forceRecreatePR + type: boolean + default: false + +# Name of the arcade repository resource in the pipeline. +# This allows repos which haven't been onboarded to Arcade to still use this +# template by checking out the repo as a resource with a custom name and pointing +# this parameter to it. +- name: arcadeRepoResource + type: string + default: self + +# Directory name for the self repo under $(Build.SourcesDirectory) in multi-checkout. +# In multi-checkout (when arcadeRepoResource != 'self'), Azure DevOps checks out the +# self repo to $(Build.SourcesDirectory)/. Set this to match the auto-generated +# directory name. Using the auto-generated name is necessary rather than explicitly +# defining a checkout path because container jobs expect repos to live under the agent's +# workspace ($(Pipeline.Workspace)). On some self-hosted setups the host path +# (e.g., /mnt/vss/_work) differs from the container path (e.g., /__w), and a custom checkout +# path can fail validation. Using the default checkout location keeps the paths consistent +# and avoids this issue. +- name: selfRepoName + type: string + default: '' +- name: arcadeRepoName + type: string + default: '' + +# Pool configuration for the job. +- name: pool + type: object + default: + name: NetCore1ESPool-Internal + image: build.azurelinux.3.amd64 + os: linux + +jobs: +- job: Renovate + displayName: Run Renovate + container: RenovateContainer + variables: + - group: dotnet-renovate-bot + # The Renovate version is automatically updated by https://github.com/dotnet/arcade/blob/main/azure-pipelines-renovate.yml. + # Changing the variable name here would require updating the name in https://github.com/dotnet/arcade/blob/main/eng/renovate.json as well. + - name: renovateVersion + value: '42' + readonly: true + - name: renovateLogFilePath + value: '$(Build.ArtifactStagingDirectory)/renovate.json' + readonly: true + - name: dryRunArg + readonly: true + ${{ if eq(parameters.dryRun, true) }}: + value: 'full' + ${{ else }}: + value: '' + - name: recreateWhenArg + readonly: true + ${{ if eq(parameters.forceRecreatePR, true) }}: + value: 'always' + ${{ else }}: + value: '' + # In multi-checkout (without custom paths), Azure DevOps places each repo under + # $(Build.SourcesDirectory)/. selfRepoName must be provided in that case. + - name: selfRepoPath + readonly: true + ${{ if eq(parameters.arcadeRepoResource, 'self') }}: + value: '$(Build.SourcesDirectory)' + ${{ else }}: + value: '$(Build.SourcesDirectory)/${{ parameters.selfRepoName }}' + - name: arcadeRepoPath + readonly: true + ${{ if eq(parameters.arcadeRepoResource, 'self') }}: + value: '$(Build.SourcesDirectory)' + ${{ else }}: + value: '$(Build.SourcesDirectory)/${{ parameters.arcadeRepoName }}' + pool: ${{ parameters.pool }} + + templateContext: + outputParentDirectory: $(Build.ArtifactStagingDirectory) + outputs: + - output: pipelineArtifact + displayName: Publish Renovate Log + condition: succeededOrFailed() + targetPath: $(Build.ArtifactStagingDirectory) + artifactName: $(Agent.JobName)_Logs_Attempt$(System.JobAttempt) + isProduction: false # logs are non-production artifacts + + steps: + - checkout: self + fetchDepth: 1 + + - ${{ if ne(parameters.arcadeRepoResource, 'self') }}: + - checkout: ${{ parameters.arcadeRepoResource }} + fetchDepth: 1 + + - script: | + renovate-config-validator $(selfRepoPath)/${{parameters.renovateConfigPath}} 2>&1 | tee /tmp/renovate-config-validator.out + validatorExit=${PIPESTATUS[0]} + if grep -q '^ WARN:' /tmp/renovate-config-validator.out; then + echo "##vso[task.logissue type=warning]Renovate config validator produced warnings." + echo "##vso[task.complete result=SucceededWithIssues]" + fi + exit $validatorExit + displayName: Validate Renovate config + env: + LOG_LEVEL: info + LOG_FILE_LEVEL: debug + LOG_FILE: $(Build.ArtifactStagingDirectory)/renovate-config-validator.json + + - script: | + . $(arcadeRepoPath)/eng/common/renovate.env + renovate 2>&1 | tee /tmp/renovate.out + renovateExit=${PIPESTATUS[0]} + if grep -q '^ WARN:' /tmp/renovate.out; then + echo "##vso[task.logissue type=warning]Renovate produced warnings." + echo "##vso[task.complete result=SucceededWithIssues]" + fi + exit $renovateExit + displayName: Run Renovate + env: + RENOVATE_FORK_TOKEN: $(BotAccount-dotnet-renovate-bot-PAT) + RENOVATE_TOKEN: $(BotAccount-dotnet-renovate-bot-PAT) + RENOVATE_REPOSITORIES: ${{parameters.gitHubRepo}} + RENOVATE_BASE_BRANCHES: ${{ convertToJson(parameters.baseBranches) }} + RENOVATE_DRY_RUN: $(dryRunArg) + RENOVATE_RECREATE_WHEN: $(recreateWhenArg) + LOG_LEVEL: info + LOG_FILE_LEVEL: debug + LOG_FILE: $(renovateLogFilePath) + RENOVATE_CONFIG_FILE: $(selfRepoPath)/${{parameters.renovateConfigPath}} + + - script: | + echo "PRs created by Renovate:" + if [ -s "$(renovateLogFilePath)" ]; then + if ! jq -r 'select(.msg == "PR created" and .pr != null) | "https://github.com/\(.repository)/pull/\(.pr)"' "$(renovateLogFilePath)" | sort -u; then + echo "##vso[task.logissue type=warning]Failed to parse Renovate log file with jq." + echo "##vso[task.complete result=SucceededWithIssues]" + fi + else + echo "##vso[task.logissue type=warning]No Renovate log file found or file is empty." + echo "##vso[task.complete result=SucceededWithIssues]" + fi + displayName: List created PRs + condition: and(succeededOrFailed(), eq('${{ parameters.dryRun }}', false)) diff --git a/eng/common/core-templates/job/source-index-stage1.yml b/eng/common/core-templates/job/source-index-stage1.yml index 76baf5c27258..bac6ac5faac3 100644 --- a/eng/common/core-templates/job/source-index-stage1.yml +++ b/eng/common/core-templates/job/source-index-stage1.yml @@ -15,6 +15,8 @@ jobs: variables: - name: BinlogPath value: ${{ parameters.binlogPath }} + - name: skipComponentGovernanceDetection + value: true - template: /eng/common/core-templates/variables/pool-providers.yml parameters: is1ESPipeline: ${{ parameters.is1ESPipeline }} @@ -25,10 +27,10 @@ jobs: pool: ${{ if eq(variables['System.TeamProject'], 'public') }}: name: $(DncEngPublicBuildPool) - image: windows.vs2026preview.scout.amd64.open + image: windows.vs2026.amd64.open ${{ if eq(variables['System.TeamProject'], 'internal') }}: name: $(DncEngInternalBuildPool) - image: windows.vs2026preview.scout.amd64 + image: windows.vs2026.amd64 steps: - ${{ if eq(parameters.is1ESPipeline, '') }}: diff --git a/eng/common/core-templates/post-build/common-variables.yml b/eng/common/core-templates/post-build/common-variables.yml index d5627a994ae5..db298ae16bae 100644 --- a/eng/common/core-templates/post-build/common-variables.yml +++ b/eng/common/core-templates/post-build/common-variables.yml @@ -11,8 +11,6 @@ variables: - name: MaestroApiVersion value: "2020-02-20" - - name: SourceLinkCLIVersion - value: 3.0.0 - name: SymbolToolVersion value: 1.0.1 - name: BinlogToolVersion diff --git a/eng/common/core-templates/post-build/post-build.yml b/eng/common/core-templates/post-build/post-build.yml index 905a6315e2d5..8aa86e304919 100644 --- a/eng/common/core-templates/post-build/post-build.yml +++ b/eng/common/core-templates/post-build/post-build.yml @@ -1,118 +1,108 @@ parameters: - # Which publishing infra should be used. THIS SHOULD MATCH THE VERSION ON THE BUILD MANIFEST. - # Publishing V1 is no longer supported - # Publishing V2 is no longer supported - # Publishing V3 is the default - - name: publishingInfraVersion - displayName: Which version of publishing should be used to promote the build definition? - type: number - default: 3 - values: - - 3 - - 4 - - - name: BARBuildId - displayName: BAR Build Id - type: number - default: 0 - - - name: PromoteToChannelIds - displayName: Channel to promote BARBuildId to - type: string - default: '' - - - name: enableSourceLinkValidation - displayName: Enable SourceLink validation - type: boolean - default: false - - - name: enableSigningValidation - displayName: Enable signing validation - type: boolean - default: true - - - name: enableSymbolValidation - displayName: Enable symbol validation - type: boolean - default: false - - - name: enableNugetValidation - displayName: Enable NuGet validation - type: boolean - default: true - - - name: publishInstallersAndChecksums - displayName: Publish installers and checksums - type: boolean - default: true - - - name: requireDefaultChannels - displayName: Fail the build if there are no default channel(s) registrations for the current build - type: boolean - default: false - - - name: SDLValidationParameters - type: object - default: - enable: false - publishGdn: false - continueOnError: false - params: '' - artifactNames: '' - downloadArtifacts: true - - - name: isAssetlessBuild - type: boolean - displayName: Is Assetless Build - default: false - - # These parameters let the user customize the call to sdk-task.ps1 for publishing - # symbols & general artifacts as well as for signing validation - - name: symbolPublishingAdditionalParameters - displayName: Symbol publishing additional parameters - type: string - default: '' - - - name: artifactsPublishingAdditionalParameters - displayName: Artifact publishing additional parameters - type: string - default: '' - - - name: signingValidationAdditionalParameters - displayName: Signing validation additional parameters - type: string - default: '' - - # Which stages should finish execution before post-build stages start - - name: validateDependsOn - type: object - default: - - build - - - name: publishDependsOn - type: object - default: - - Validate - - # Optional: Call asset publishing rather than running in a separate stage - - name: publishAssetsImmediately - type: boolean - default: false - - - name: is1ESPipeline - type: boolean - default: false +# Which publishing infra should be used. THIS SHOULD MATCH THE VERSION ON THE BUILD MANIFEST. +# Publishing V1 is no longer supported +# Publishing V2 is no longer supported +# Publishing V3 is the default +- name: publishingInfraVersion + displayName: Which version of publishing should be used to promote the build definition? + type: number + default: 3 + values: + - 3 + - 4 + +- name: BARBuildId + displayName: BAR Build Id + type: number + default: 0 + +- name: PromoteToChannelIds + displayName: Channel to promote BARBuildId to + type: string + default: '' + +- name: enableSourceLinkValidation + displayName: Enable SourceLink validation + type: boolean + default: false + +- name: enableSigningValidation + displayName: Enable signing validation + type: boolean + default: true + +- name: enableSymbolValidation + displayName: Enable symbol validation + type: boolean + default: false + +- name: enableNugetValidation + displayName: Enable NuGet validation + type: boolean + default: true + +- name: publishInstallersAndChecksums + displayName: Publish installers and checksums + type: boolean + default: true + +- name: requireDefaultChannels + displayName: Fail the build if there are no default channel(s) registrations for the current build + type: boolean + default: false + +- name: isAssetlessBuild + type: boolean + displayName: Is Assetless Build + default: false + +# These parameters let the user customize the call to sdk-task.ps1 for publishing +# symbols & general artifacts as well as for signing validation +- name: symbolPublishingAdditionalParameters + displayName: Symbol publishing additional parameters + type: string + default: '' + +- name: artifactsPublishingAdditionalParameters + displayName: Artifact publishing additional parameters + type: string + default: '' + +- name: signingValidationAdditionalParameters + displayName: Signing validation additional parameters + type: string + default: '' + +# Which stages should finish execution before post-build stages start +- name: validateDependsOn + type: object + default: + - build + +- name: publishDependsOn + type: object + default: + - Validate + +# Optional: Call asset publishing rather than running in a separate stage +- name: publishAssetsImmediately + type: boolean + default: false + +- name: is1ESPipeline + type: boolean + default: false stages: -- ${{ if or(eq( parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true'), eq(parameters.SDLValidationParameters.enable, 'true')) }}: +- ${{ if or(eq( parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true')) }}: - stage: Validate dependsOn: ${{ parameters.validateDependsOn }} displayName: Validate Build Assets variables: - - template: /eng/common/core-templates/post-build/common-variables.yml - - template: /eng/common/core-templates/variables/pool-providers.yml - parameters: - is1ESPipeline: ${{ parameters.is1ESPipeline }} + - template: /eng/common/core-templates/post-build/common-variables.yml + - template: /eng/common/core-templates/variables/pool-providers.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} jobs: - job: displayName: NuGet Validation @@ -128,49 +118,49 @@ stages: ${{ else }}: ${{ if eq(parameters.is1ESPipeline, true) }}: name: $(DncEngInternalBuildPool) - image: windows.vs2026preview.scout.amd64 + image: windows.vs2026.amd64 os: windows ${{ else }}: name: $(DncEngInternalBuildPool) - demands: ImageOverride -equals windows.vs2026preview.scout.amd64 + demands: ImageOverride -equals windows.vs2026.amd64 steps: - - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml - parameters: - BARBuildId: ${{ parameters.BARBuildId }} - PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} - is1ESPipeline: ${{ parameters.is1ESPipeline }} - - - ${{ if ne(parameters.publishingInfraVersion, 4) }}: - - task: DownloadBuildArtifacts@0 - displayName: Download Package Artifacts - inputs: - buildType: specific - buildVersionToDownload: specific - project: $(AzDOProjectName) - pipeline: $(AzDOPipelineId) - buildId: $(AzDOBuildId) - artifactName: PackageArtifacts - checkDownloadedFiles: true - - ${{ if eq(parameters.publishingInfraVersion, 4) }}: - - task: DownloadPipelineArtifact@2 - displayName: Download Pipeline Artifacts (V4) - inputs: - itemPattern: '*/packages/**/*.nupkg' - targetPath: '$(Build.ArtifactStagingDirectory)/PipelineArtifactsDownload' - - task: CopyFiles@2 - displayName: Flatten packages to PackageArtifacts - inputs: - SourceFolder: '$(Build.ArtifactStagingDirectory)/PipelineArtifactsDownload' - Contents: '**/*.nupkg' - TargetFolder: '$(Build.ArtifactStagingDirectory)/PackageArtifacts' - flattenFolders: true - - - task: PowerShell@2 - displayName: Validate + - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml + parameters: + BARBuildId: ${{ parameters.BARBuildId }} + PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} + is1ESPipeline: ${{ parameters.is1ESPipeline }} + + - ${{ if ne(parameters.publishingInfraVersion, 4) }}: + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) + artifactName: PackageArtifacts + checkDownloadedFiles: true + - ${{ if eq(parameters.publishingInfraVersion, 4) }}: + - task: DownloadPipelineArtifact@2 + displayName: Download Pipeline Artifacts (V4) + inputs: + itemPattern: '*/packages/**/*.nupkg' + targetPath: '$(Build.ArtifactStagingDirectory)/PipelineArtifactsDownload' + - task: CopyFiles@2 + displayName: Flatten packages to PackageArtifacts inputs: - filePath: $(System.DefaultWorkingDirectory)/eng/common/post-build/nuget-validation.ps1 - arguments: -PackagesPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/ + SourceFolder: '$(Build.ArtifactStagingDirectory)/PipelineArtifactsDownload' + Contents: '**/*.nupkg' + TargetFolder: '$(Build.ArtifactStagingDirectory)/PackageArtifacts' + flattenFolders: true + + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: $(System.DefaultWorkingDirectory)/eng/common/post-build/nuget-validation.ps1 + arguments: -PackagesPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/ - job: displayName: Signing Validation @@ -184,143 +174,96 @@ stages: os: windows # If it's not devdiv, it's dnceng ${{ else }}: - ${{ if eq(parameters.is1ESPipeline, true) }}: + ${{ if eq(parameters.is1ESPipeline, true) }}: name: $(DncEngInternalBuildPool) image: windows.vs2026.amd64 os: windows ${{ else }}: name: $(DncEngInternalBuildPool) - demands: ImageOverride -equals windows.vs2026preview.scout.amd64 + demands: ImageOverride -equals windows.vs2026.amd64 steps: - - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml - parameters: - BARBuildId: ${{ parameters.BARBuildId }} - PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} - is1ESPipeline: ${{ parameters.is1ESPipeline }} - - - ${{ if ne(parameters.publishingInfraVersion, 4) }}: - - task: DownloadBuildArtifacts@0 - displayName: Download Package Artifacts - inputs: - buildType: specific - buildVersionToDownload: specific - project: $(AzDOProjectName) - pipeline: $(AzDOPipelineId) - buildId: $(AzDOBuildId) - artifactName: PackageArtifacts - checkDownloadedFiles: true - - ${{ if eq(parameters.publishingInfraVersion, 4) }}: - - task: DownloadPipelineArtifact@2 - displayName: Download Pipeline Artifacts (V4) - inputs: - itemPattern: '*/packages/**/*.nupkg' - targetPath: '$(Build.ArtifactStagingDirectory)/PipelineArtifactsDownload' - - task: CopyFiles@2 - displayName: Flatten packages to PackageArtifacts - inputs: - SourceFolder: '$(Build.ArtifactStagingDirectory)/PipelineArtifactsDownload' - Contents: '**/*.nupkg' - TargetFolder: '$(Build.ArtifactStagingDirectory)/PackageArtifacts' - flattenFolders: true - - # This is necessary whenever we want to publish/restore to an AzDO private feed - # Since sdk-task.ps1 tries to restore packages we need to do this authentication here - # otherwise it'll complain about accessing a private feed. - - task: NuGetAuthenticate@1 - displayName: 'Authenticate to AzDO Feeds' - - # Signing validation will optionally work with the buildmanifest file which is downloaded from - # Azure DevOps above. - - task: PowerShell@2 - displayName: Validate - inputs: - filePath: eng\common\sdk-task.ps1 - arguments: -task SigningValidation -restore -msbuildEngine vs - /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts' - /p:SignCheckExclusionsFile='$(System.DefaultWorkingDirectory)/eng/SignCheckExclusionsFile.txt' - ${{ parameters.signingValidationAdditionalParameters }} - - - template: /eng/common/core-templates/steps/publish-logs.yml - parameters: - is1ESPipeline: ${{ parameters.is1ESPipeline }} - StageLabel: 'Validation' - JobLabel: 'Signing' - BinlogToolVersion: $(BinlogToolVersion) + - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml + parameters: + BARBuildId: ${{ parameters.BARBuildId }} + PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} + is1ESPipeline: ${{ parameters.is1ESPipeline }} - - job: - displayName: SourceLink Validation - condition: eq( ${{ parameters.enableSourceLinkValidation }}, 'true') - pool: - # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com) - ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: - name: AzurePipelines-EO - image: 1ESPT-Windows2025 - demands: Cmd - os: windows - # If it's not devdiv, it's dnceng - ${{ else }}: - ${{ if eq(parameters.is1ESPipeline, true) }}: - name: $(DncEngInternalBuildPool) - image: windows.vs2026.amd64 - os: windows - ${{ else }}: - name: $(DncEngInternalBuildPool) - demands: ImageOverride -equals windows.vs2026preview.scout.amd64 - steps: - - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml - parameters: - BARBuildId: ${{ parameters.BARBuildId }} - PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} - is1ESPipeline: ${{ parameters.is1ESPipeline }} - - - ${{ if ne(parameters.publishingInfraVersion, 4) }}: - - task: DownloadBuildArtifacts@0 - displayName: Download Blob Artifacts - inputs: - buildType: specific - buildVersionToDownload: specific - project: $(AzDOProjectName) - pipeline: $(AzDOPipelineId) - buildId: $(AzDOBuildId) - artifactName: BlobArtifacts - checkDownloadedFiles: true - - ${{ if eq(parameters.publishingInfraVersion, 4) }}: - - task: DownloadPipelineArtifact@2 - displayName: Download Pipeline Artifacts (V4) - inputs: - itemPattern: '*/assets/**' - targetPath: '$(Build.ArtifactStagingDirectory)/PipelineArtifactsDownload' - - task: CopyFiles@2 - displayName: Flatten assets to BlobArtifacts - inputs: - SourceFolder: '$(Build.ArtifactStagingDirectory)/PipelineArtifactsDownload' - Contents: '**/*' - TargetFolder: '$(Build.ArtifactStagingDirectory)/BlobArtifacts' - flattenFolders: true - - - task: PowerShell@2 - displayName: Validate + - ${{ if ne(parameters.publishingInfraVersion, 4) }}: + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: specific + buildVersionToDownload: specific + project: $(AzDOProjectName) + pipeline: $(AzDOPipelineId) + buildId: $(AzDOBuildId) + artifactName: PackageArtifacts + checkDownloadedFiles: true + - ${{ if eq(parameters.publishingInfraVersion, 4) }}: + - task: DownloadPipelineArtifact@2 + displayName: Download Pipeline Artifacts (V4) + inputs: + itemPattern: '*/packages/**/*.nupkg' + targetPath: '$(Build.ArtifactStagingDirectory)/PipelineArtifactsDownload' + - task: CopyFiles@2 + displayName: Flatten packages to PackageArtifacts + inputs: + SourceFolder: '$(Build.ArtifactStagingDirectory)/PipelineArtifactsDownload' + Contents: '**/*.nupkg' + TargetFolder: '$(Build.ArtifactStagingDirectory)/PackageArtifacts' + flattenFolders: true + + # This is necessary whenever we want to publish/restore to an AzDO private feed + # Since sdk-task.ps1 tries to restore packages we need to do this authentication here + # otherwise it'll complain about accessing a private feed. + - task: NuGetAuthenticate@1 + displayName: 'Authenticate to AzDO Feeds' + + # Signing validation will optionally work with the buildmanifest file which is downloaded from + # Azure DevOps above. + - task: PowerShell@2 + displayName: Validate + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task SigningValidation -restore -msbuildEngine dotnet + /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts' + /p:SignCheckExclusionsFile='$(System.DefaultWorkingDirectory)/eng/SignCheckExclusionsFile.txt' + ${{ parameters.signingValidationAdditionalParameters }} + + - template: /eng/common/core-templates/steps/publish-logs.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} + StageLabel: 'Validation' + JobLabel: 'Signing' + BinlogToolVersion: $(BinlogToolVersion) + + # SourceLink validation has been removed — the underlying CLI tool + # (targeting netcoreapp2.1) has not functioned for years. + # The enableSourceLinkValidation parameter is kept but ignored so + # existing pipelines that pass it are not broken. + # See https://github.com/dotnet/arcade/issues/16647 + - ${{ if eq(parameters.enableSourceLinkValidation, 'true') }}: + - job: + displayName: 'SourceLink Validation Removed - please remove enableSourceLinkValidation from your pipeline' + pool: server + steps: + - task: Delay@1 + displayName: 'Warning: SourceLink validation removed (see https://github.com/dotnet/arcade/issues/16647)' inputs: - filePath: $(System.DefaultWorkingDirectory)/eng/common/post-build/sourcelink-validation.ps1 - arguments: -InputPath $(Build.ArtifactStagingDirectory)/BlobArtifacts/ - -ExtractPath $(Agent.BuildDirectory)/Extract/ - -GHRepoName $(Build.Repository.Name) - -GHCommit $(Build.SourceVersion) - -SourcelinkCliVersion $(SourceLinkCLIVersion) - continueOnError: true + delayForMinutes: '0' - ${{ if ne(parameters.publishAssetsImmediately, 'true') }}: - stage: publish_using_darc - ${{ if or(eq(parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true'), eq(parameters.SDLValidationParameters.enable, 'true')) }}: + ${{ if or(eq(parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true')) }}: dependsOn: ${{ parameters.publishDependsOn }} ${{ else }}: dependsOn: ${{ parameters.validateDependsOn }} displayName: Publish using Darc variables: - - template: /eng/common/core-templates/post-build/common-variables.yml - - template: /eng/common/core-templates/variables/pool-providers.yml - parameters: - is1ESPipeline: ${{ parameters.is1ESPipeline }} + - template: /eng/common/core-templates/post-build/common-variables.yml + - template: /eng/common/core-templates/variables/pool-providers.yml + parameters: + is1ESPipeline: ${{ parameters.is1ESPipeline }} jobs: - job: displayName: Publish Using Darc @@ -334,7 +277,7 @@ stages: os: windows # If it's not devdiv, it's dnceng ${{ else }}: - ${{ if eq(parameters.is1ESPipeline, true) }}: + ${{ if eq(parameters.is1ESPipeline, true) }}: name: NetCore1ESPool-Publishing-Internal image: windows.vs2026.amd64 os: windows @@ -342,34 +285,33 @@ stages: name: NetCore1ESPool-Publishing-Internal demands: ImageOverride -equals windows.vs2026.amd64 steps: - - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml - parameters: - BARBuildId: ${{ parameters.BARBuildId }} - PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} - is1ESPipeline: ${{ parameters.is1ESPipeline }} - - - task: NuGetAuthenticate@1 - - # Populate internal runtime variables. - - template: /eng/common/templates/steps/enable-internal-sources.yml - parameters: - legacyCredential: $(dn-bot-dnceng-artifact-feeds-rw) - - - template: /eng/common/templates/steps/enable-internal-runtimes.yml + - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml + parameters: + BARBuildId: ${{ parameters.BARBuildId }} + PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }} + is1ESPipeline: ${{ parameters.is1ESPipeline }} - # Darc is targeting 8.0, so make sure it's installed - - task: UseDotNet@2 - inputs: - version: 8.0.x + - task: NuGetAuthenticate@1 - - task: AzureCLI@2 - displayName: Publish Using Darc - inputs: - azureSubscription: "Darc: Maestro Production" - scriptType: ps - scriptLocation: scriptPath - scriptPath: $(System.DefaultWorkingDirectory)/eng/common/post-build/publish-using-darc.ps1 - arguments: > + # Populate internal runtime variables. + - template: /eng/common/templates/steps/enable-internal-sources.yml + parameters: + legacyCredential: $(dn-bot-dnceng-artifact-feeds-rw) + + - template: /eng/common/templates/steps/enable-internal-runtimes.yml + + - task: UseDotNet@2 + inputs: + version: 8.0.x + + - task: AzureCLI@2 + displayName: Publish Using Darc + inputs: + azureSubscription: "Darc: Maestro Production" + scriptType: ps + scriptLocation: scriptPath + scriptPath: $(System.DefaultWorkingDirectory)/eng/common/post-build/publish-using-darc.ps1 + arguments: > -BuildId $(BARBuildId) -PublishingInfraVersion 3 -AzdoToken '$(System.AccessToken)' diff --git a/eng/common/core-templates/stages/renovate.yml b/eng/common/core-templates/stages/renovate.yml new file mode 100644 index 000000000000..edab28182585 --- /dev/null +++ b/eng/common/core-templates/stages/renovate.yml @@ -0,0 +1,111 @@ +# -------------------------------------------------------------------------------------- +# Renovate Pipeline Template +# -------------------------------------------------------------------------------------- +# This template provides a complete reusable pipeline definition for running Renovate +# in a 1ES Official pipeline. Pipelines can extend from this template and only need +# to pass the Renovate job parameters. +# +# For more info, see https://github.com/dotnet/arcade/blob/main/Documentation/Renovate.md +# -------------------------------------------------------------------------------------- + +parameters: + +# Path to the Renovate configuration file within the repository. +- name: renovateConfigPath + type: string + default: 'eng/renovate.json' + +# GitHub repository to run Renovate against, in the format 'owner/repo'. +- name: gitHubRepo + type: string + +# List of base branches to target for Renovate PRs. +- name: baseBranches + type: object + default: + - main + +# When true, Renovate will run in dry run mode. +- name: dryRun + type: boolean + default: false + +# When true, Renovate will recreate PRs even if they were previously closed. +- name: forceRecreatePR + type: boolean + default: false + +# Name of the arcade repository resource in the pipeline. +# This allows repos which haven't been onboarded to Arcade to still use this +# template by checking out the repo as a resource with a custom name and pointing +# this parameter to it. +- name: arcadeRepoResource + type: string + default: 'self' + +- name: selfRepoName + type: string + default: '' +- name: arcadeRepoName + type: string + default: '' + +# Pool configuration for the pipeline. +- name: pool + type: object + default: + name: NetCore1ESPool-Internal + image: build.azurelinux.3.amd64 + os: linux + +# Renovate version used in the container image tag. +- name: renovateVersion + default: 43 + type: number + +# Pool configuration for SDL analysis. +- name: sdlPool + type: object + default: + name: NetCore1ESPool-Internal + image: windows.vs2026.amd64 + os: windows + +resources: + repositories: + - repository: 1ESPipelineTemplates + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release + +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1ESPipelineTemplates + parameters: + pool: ${{ parameters.pool }} + sdl: + sourceAnalysisPool: ${{ parameters.sdlPool }} + # When repos that aren't onboarded to Arcade use this template, they set the + # arcadeRepoResource parameter to point to their Arcade repo resource. In that case, + # Aracde will be excluded from SDL analysis. + ${{ if ne(parameters.arcadeRepoResource, 'self') }}: + sourceRepositoriesToScan: + exclude: + - repository: ${{ parameters.arcadeRepoResource }} + containers: + RenovateContainer: + image: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-renovate-${{ parameters.renovateVersion }}-amd64 + stages: + - stage: Renovate + displayName: Run Renovate + jobs: + - template: /eng/common/core-templates/job/renovate.yml@${{ parameters.arcadeRepoResource }} + parameters: + renovateConfigPath: ${{ parameters.renovateConfigPath }} + gitHubRepo: ${{ parameters.gitHubRepo }} + baseBranches: ${{ parameters.baseBranches }} + dryRun: ${{ parameters.dryRun }} + forceRecreatePR: ${{ parameters.forceRecreatePR }} + pool: ${{ parameters.pool }} + arcadeRepoResource: ${{ parameters.arcadeRepoResource }} + selfRepoName: ${{ parameters.selfRepoName }} + arcadeRepoName: ${{ parameters.arcadeRepoName }} diff --git a/eng/common/core-templates/steps/install-microbuild-impl.yml b/eng/common/core-templates/steps/install-microbuild-impl.yml new file mode 100644 index 000000000000..da22beb3f60c --- /dev/null +++ b/eng/common/core-templates/steps/install-microbuild-impl.yml @@ -0,0 +1,34 @@ +parameters: + - name: microbuildTaskInputs + type: object + default: {} + + - name: microbuildEnv + type: object + default: {} + + - name: enablePreviewMicrobuild + type: boolean + default: false + + - name: condition + type: string + + - name: continueOnError + type: boolean + +steps: +- ${{ if eq(parameters.enablePreviewMicrobuild, true) }}: + - task: MicroBuildSigningPluginPreview@4 + displayName: Install Preview MicroBuild plugin + inputs: ${{ parameters.microbuildTaskInputs }} + env: ${{ parameters.microbuildEnv }} + continueOnError: ${{ parameters.continueOnError }} + condition: ${{ parameters.condition }} +- ${{ else }}: + - task: MicroBuildSigningPlugin@4 + displayName: Install MicroBuild plugin + inputs: ${{ parameters.microbuildTaskInputs }} + env: ${{ parameters.microbuildEnv }} + continueOnError: ${{ parameters.continueOnError }} + condition: ${{ parameters.condition }} diff --git a/eng/common/core-templates/steps/install-microbuild.yml b/eng/common/core-templates/steps/install-microbuild.yml index 553fce66b940..76a54e157fda 100644 --- a/eng/common/core-templates/steps/install-microbuild.yml +++ b/eng/common/core-templates/steps/install-microbuild.yml @@ -4,6 +4,8 @@ parameters: # Enable install tasks for MicroBuild on Mac and Linux # Will be ignored if 'enableMicrobuild' is false or 'Agent.Os' is 'Windows_NT' enableMicrobuildForMacAndLinux: false + # Enable preview version of MB signing plugin + enablePreviewMicrobuild: false # Determines whether the ESRP service connection information should be passed to the signing plugin. # This overlaps with _SignType to some degree. We only need the service connection for real signing. # It's important that the service connection not be passed to the MicroBuildSigningPlugin task in this place. @@ -13,6 +15,8 @@ parameters: microbuildUseESRP: true # Microbuild installation directory microBuildOutputFolder: $(Agent.TempDirectory)/MicroBuild + # Microbuild version + microbuildPluginVersion: 'latest' continueOnError: false @@ -69,42 +73,46 @@ steps: # YAML expansion, and Windows vs. Linux/Mac uses different service connections. However, # we can avoid including the MB install step if not enabled at all. This avoids a bunch of # extra pipeline authorizations, since most pipelines do not sign on non-Windows. - - task: MicroBuildSigningPlugin@4 - displayName: Install MicroBuild plugin (Windows) - inputs: - signType: $(_SignType) - zipSources: false - feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json - ${{ if eq(parameters.microbuildUseESRP, true) }}: - ConnectedServiceName: 'MicroBuild Signing Task (DevDiv)' - ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: - ConnectedPMEServiceName: 6cc74545-d7b9-4050-9dfa-ebefcc8961ea - ${{ else }}: - ConnectedPMEServiceName: 248d384a-b39b-46e3-8ad5-c2c210d5e7ca - env: - TeamName: $(_TeamName) - MicroBuildOutputFolderOverride: ${{ parameters.microBuildOutputFolder }} - SYSTEM_ACCESSTOKEN: $(System.AccessToken) - continueOnError: ${{ parameters.continueOnError }} - condition: and(succeeded(), eq(variables['Agent.Os'], 'Windows_NT'), in(variables['_SignType'], 'real', 'test')) - - - ${{ if eq(parameters.enableMicrobuildForMacAndLinux, true) }}: - - task: MicroBuildSigningPlugin@4 - displayName: Install MicroBuild plugin (non-Windows) - inputs: + - template: /eng/common/core-templates/steps/install-microbuild-impl.yml + parameters: + enablePreviewMicrobuild: ${{ parameters.enablePreviewMicrobuild }} + microbuildTaskInputs: signType: $(_SignType) zipSources: false feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json - workingDirectory: ${{ parameters.microBuildOutputFolder }} + version: ${{ parameters.microbuildPluginVersion }} ${{ if eq(parameters.microbuildUseESRP, true) }}: ConnectedServiceName: 'MicroBuild Signing Task (DevDiv)' ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: - ConnectedPMEServiceName: beb8cb23-b303-4c95-ab26-9e44bc958d39 + ConnectedPMEServiceName: 6cc74545-d7b9-4050-9dfa-ebefcc8961ea ${{ else }}: - ConnectedPMEServiceName: c24de2a5-cc7a-493d-95e4-8e5ff5cad2bc - env: + ConnectedPMEServiceName: 248d384a-b39b-46e3-8ad5-c2c210d5e7ca + microbuildEnv: TeamName: $(_TeamName) MicroBuildOutputFolderOverride: ${{ parameters.microBuildOutputFolder }} SYSTEM_ACCESSTOKEN: $(System.AccessToken) continueOnError: ${{ parameters.continueOnError }} - condition: and(succeeded(), ne(variables['Agent.Os'], 'Windows_NT'), eq(variables['_SignType'], 'real')) + condition: and(succeeded(), eq(variables['Agent.Os'], 'Windows_NT'), in(variables['_SignType'], 'real', 'test')) + + - ${{ if eq(parameters.enableMicrobuildForMacAndLinux, true) }}: + - template: /eng/common/core-templates/steps/install-microbuild-impl.yml + parameters: + enablePreviewMicrobuild: ${{ parameters.enablePreviewMicrobuild }} + microbuildTaskInputs: + signType: $(_SignType) + zipSources: false + feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json + version: ${{ parameters.microbuildPluginVersion }} + workingDirectory: ${{ parameters.microBuildOutputFolder }} + ${{ if eq(parameters.microbuildUseESRP, true) }}: + ConnectedServiceName: 'MicroBuild Signing Task (DevDiv)' + ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}: + ConnectedPMEServiceName: beb8cb23-b303-4c95-ab26-9e44bc958d39 + ${{ else }}: + ConnectedPMEServiceName: c24de2a5-cc7a-493d-95e4-8e5ff5cad2bc + microbuildEnv: + TeamName: $(_TeamName) + MicroBuildOutputFolderOverride: ${{ parameters.microBuildOutputFolder }} + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), ne(variables['Agent.Os'], 'Windows_NT'), eq(variables['_SignType'], 'real')) diff --git a/eng/common/core-templates/steps/publish-logs.yml b/eng/common/core-templates/steps/publish-logs.yml index 4eed0312b807..84a1922c73f3 100644 --- a/eng/common/core-templates/steps/publish-logs.yml +++ b/eng/common/core-templates/steps/publish-logs.yml @@ -61,3 +61,4 @@ steps: condition: always() retryCountOnTaskFailure: 10 # for any files being locked isProduction: false # logs are non-production artifacts + diff --git a/eng/common/core-templates/steps/source-build.yml b/eng/common/core-templates/steps/source-build.yml index 09ae5cd73ae3..b75f59c428d4 100644 --- a/eng/common/core-templates/steps/source-build.yml +++ b/eng/common/core-templates/steps/source-build.yml @@ -24,7 +24,7 @@ steps: # in the default public locations. internalRuntimeDownloadArgs= if [ '$(dotnetbuilds-internal-container-read-token-base64)' != '$''(dotnetbuilds-internal-container-read-token-base64)' ]; then - internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://ci.dot.net/internal /p:DotNetRuntimeSourceFeedKey=$(dotnetbuilds-internal-container-read-token-base64) --runtimesourcefeed https://ci.dot.net/internal --runtimesourcefeedkey '$(dotnetbuilds-internal-container-read-token-base64)'' + internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://ci.dot.net/internal /p:DotNetRuntimeSourceFeedKey=$(dotnetbuilds-internal-container-read-token-base64) --runtimesourcefeed https://ci.dot.net/internal --runtimesourcefeedkey $(dotnetbuilds-internal-container-read-token-base64)' fi buildConfig=Release diff --git a/eng/common/core-templates/steps/source-index-stage1-publish.yml b/eng/common/core-templates/steps/source-index-stage1-publish.yml index e9a694afa58e..3ad83b8c3075 100644 --- a/eng/common/core-templates/steps/source-index-stage1-publish.yml +++ b/eng/common/core-templates/steps/source-index-stage1-publish.yml @@ -1,6 +1,6 @@ parameters: - sourceIndexUploadPackageVersion: 2.0.0-20250818.1 - sourceIndexProcessBinlogPackageVersion: 1.0.1-20250818.1 + sourceIndexUploadPackageVersion: 2.0.0-20250906.1 + sourceIndexProcessBinlogPackageVersion: 1.0.1-20250906.1 sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json binlogPath: artifacts/log/Debug/Build.binlog @@ -14,8 +14,8 @@ steps: workingDirectory: $(Agent.TempDirectory) - script: | - $(Agent.TempDirectory)/dotnet/dotnet tool install BinLogToSln --version ${{parameters.sourceIndexProcessBinlogPackageVersion}} --add-source ${{parameters.SourceIndexPackageSource}} --tool-path $(Agent.TempDirectory)/.source-index/tools - $(Agent.TempDirectory)/dotnet/dotnet tool install UploadIndexStage1 --version ${{parameters.sourceIndexUploadPackageVersion}} --add-source ${{parameters.SourceIndexPackageSource}} --tool-path $(Agent.TempDirectory)/.source-index/tools + $(Agent.TempDirectory)/dotnet/dotnet tool install BinLogToSln --version ${{parameters.sourceIndexProcessBinlogPackageVersion}} --source ${{parameters.sourceIndexPackageSource}} --tool-path $(Agent.TempDirectory)/.source-index/tools + $(Agent.TempDirectory)/dotnet/dotnet tool install UploadIndexStage1 --version ${{parameters.sourceIndexUploadPackageVersion}} --source ${{parameters.sourceIndexPackageSource}} --tool-path $(Agent.TempDirectory)/.source-index/tools displayName: "Source Index: Download netsourceindex Tools" # Set working directory to temp directory so 'dotnet' doesn't try to use global.json and use the repo's sdk. workingDirectory: $(Agent.TempDirectory) diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh index 8abfb71f7275..314c93c57598 100644 --- a/eng/common/cross/build-rootfs.sh +++ b/eng/common/cross/build-rootfs.sh @@ -9,6 +9,7 @@ usage() echo "CodeName - optional, Code name for Linux, can be: xenial(default), zesty, bionic, alpine" echo " for alpine can be specified with version: alpineX.YY or alpineedge" echo " for FreeBSD can be: freebsd13, freebsd14" + echo " for OpenBSD can be: openbsd" echo " for illumos can be: illumos" echo " for Haiku can be: haiku." echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine and FreeBSD" @@ -27,6 +28,8 @@ __BuildArch=arm __AlpineArch=armv7 __FreeBSDArch=arm __FreeBSDMachineArch=armv7 +__OpenBSDArch=arm +__OpenBSDMachineArch=armv7 __IllumosArch=arm7 __HaikuArch=arm __QEMUArch=arm @@ -72,7 +75,7 @@ __AlpinePackages+=" krb5-dev" __AlpinePackages+=" openssl-dev" __AlpinePackages+=" zlib-dev" -__FreeBSDBase="13.4-RELEASE" +__FreeBSDBase="13.5-RELEASE" __FreeBSDPkg="1.21.3" __FreeBSDABI="13" __FreeBSDPackages="libunwind" @@ -82,6 +85,12 @@ __FreeBSDPackages+=" openssl" __FreeBSDPackages+=" krb5" __FreeBSDPackages+=" terminfo-db" +__OpenBSDVersion="7.8" +__OpenBSDPackages="heimdal-libs" +__OpenBSDPackages+=" icu4c" +__OpenBSDPackages+=" inotify-tools" +__OpenBSDPackages+=" openssl" + __IllumosPackages="icu" __IllumosPackages+=" mit-krb5" __IllumosPackages+=" openssl" @@ -160,6 +169,8 @@ while :; do __QEMUArch=aarch64 __FreeBSDArch=arm64 __FreeBSDMachineArch=aarch64 + __OpenBSDArch=arm64 + __OpenBSDMachineArch=aarch64 ;; armel) __BuildArch=armel @@ -235,6 +246,8 @@ while :; do __UbuntuArch=amd64 __FreeBSDArch=amd64 __FreeBSDMachineArch=amd64 + __OpenBSDArch=amd64 + __OpenBSDMachineArch=amd64 __illumosArch=x86_64 __HaikuArch=x86_64 __UbuntuRepo="http://archive.ubuntu.com/ubuntu/" @@ -295,9 +308,7 @@ while :; do ;; noble) # Ubuntu 24.04 __CodeName=noble - if [[ -z "$__LLDB_Package" ]]; then - __LLDB_Package="liblldb-19-dev" - fi + __LLDB_Package="liblldb-19-dev" ;; stretch) # Debian 9 __CodeName=stretch @@ -383,10 +394,14 @@ while :; do ;; freebsd14) __CodeName=freebsd - __FreeBSDBase="14.2-RELEASE" + __FreeBSDBase="14.3-RELEASE" __FreeBSDABI="14" __SkipUnmount=1 ;; + openbsd) + __CodeName=openbsd + __SkipUnmount=1 + ;; illumos) __CodeName=illumos __SkipUnmount=1 @@ -595,6 +610,62 @@ elif [[ "$__CodeName" == "freebsd" ]]; then INSTALL_AS_USER=$(whoami) "$__RootfsDir"/host/sbin/pkg -r "$__RootfsDir" -C "$__RootfsDir"/usr/local/etc/pkg.conf update # shellcheck disable=SC2086 INSTALL_AS_USER=$(whoami) "$__RootfsDir"/host/sbin/pkg -r "$__RootfsDir" -C "$__RootfsDir"/usr/local/etc/pkg.conf install --yes $__FreeBSDPackages +elif [[ "$__CodeName" == "openbsd" ]]; then + # determine mirrors + OPENBSD_MIRROR="https://cdn.openbsd.org/pub/OpenBSD/$__OpenBSDVersion/$__OpenBSDMachineArch" + + # download base system sets + ensureDownloadTool + + BASE_SETS=(base comp) + for set in "${BASE_SETS[@]}"; do + FILE="${set}${__OpenBSDVersion//./}.tgz" + echo "Downloading $FILE..." + if [[ "$__hasWget" == 1 ]]; then + wget -O- "$OPENBSD_MIRROR/$FILE" | tar -C "$__RootfsDir" -xzpf - + else + curl -SL "$OPENBSD_MIRROR/$FILE" | tar -C "$__RootfsDir" -xzpf - + fi + done + + PKG_MIRROR="https://cdn.openbsd.org/pub/OpenBSD/${__OpenBSDVersion}/packages/${__OpenBSDMachineArch}" + + echo "Installing packages into sysroot..." + + # Fetch package index once + if [[ "$__hasWget" == 1 ]]; then + PKG_INDEX=$(wget -qO- "$PKG_MIRROR/") + else + PKG_INDEX=$(curl -s "$PKG_MIRROR/") + fi + + for pkg in $__OpenBSDPackages; do + PKG_FILE=$(echo "$PKG_INDEX" | grep -Po ">\K${pkg}-[0-9][^\" ]*\.tgz" \ + | sort -V | tail -n1) + + echo "Resolved package filename for $pkg: $PKG_FILE" + + [[ -z "$PKG_FILE" ]] && { echo "ERROR: Package $pkg not found"; exit 1; } + + if [[ "$__hasWget" == 1 ]]; then + wget -O- "$PKG_MIRROR/$PKG_FILE" | tar -C "$__RootfsDir" -xzpf - + else + curl -SL "$PKG_MIRROR/$PKG_FILE" | tar -C "$__RootfsDir" -xzpf - + fi + done + + echo "Creating versionless symlinks for shared libraries..." + # Find all versioned .so files and create the base .so symlink + for lib in "$__RootfsDir/usr/lib/libc++.so."* "$__RootfsDir/usr/lib/libc++abi.so."* "$__RootfsDir/usr/lib/libpthread.so."*; do + if [ -f "$lib" ]; then + # Extract the filename (e.g., libc++.so.12.0) + VERSIONED_NAME=$(basename "$lib") + # Remove the trailing version numbers (e.g., libc++.so) + BASE_NAME=${VERSIONED_NAME%.so.*}.so + # Create the symlink in the same directory + ln -sf "$VERSIONED_NAME" "$__RootfsDir/usr/lib/$BASE_NAME" + fi + done elif [[ "$__CodeName" == "illumos" ]]; then mkdir "$__RootfsDir/tmp" pushd "$__RootfsDir/tmp" diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index 0ff85cf0367e..ff2dfdb4a5bf 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -3,15 +3,22 @@ set(CROSS_ROOTFS $ENV{ROOTFS_DIR}) # reset platform variables (e.g. cmake 3.25 sets LINUX=1) unset(LINUX) unset(FREEBSD) +unset(OPENBSD) unset(ILLUMOS) unset(ANDROID) unset(TIZEN) unset(HAIKU) set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH}) + +file(GLOB OPENBSD_PROBE "${CROSS_ROOTFS}/etc/signify/openbsd-*.pub") + if(EXISTS ${CROSS_ROOTFS}/bin/freebsd-version) set(CMAKE_SYSTEM_NAME FreeBSD) set(FREEBSD 1) +elseif(OPENBSD_PROBE) + set(CMAKE_SYSTEM_NAME OpenBSD) + set(OPENBSD 1) elseif(EXISTS ${CROSS_ROOTFS}/usr/platform/i86pc) set(CMAKE_SYSTEM_NAME SunOS) set(ILLUMOS 1) @@ -53,6 +60,8 @@ elseif(TARGET_ARCH_NAME STREQUAL "arm64") endif() elseif(FREEBSD) set(triple "aarch64-unknown-freebsd12") + elseif(OPENBSD) + set(triple "aarch64-unknown-openbsd") endif() elseif(TARGET_ARCH_NAME STREQUAL "armel") set(CMAKE_SYSTEM_PROCESSOR armv7l) @@ -109,6 +118,8 @@ elseif(TARGET_ARCH_NAME STREQUAL "x64") endif() elseif(FREEBSD) set(triple "x86_64-unknown-freebsd12") + elseif(OPENBSD) + set(triple "x86_64-unknown-openbsd") elseif(ILLUMOS) set(TOOLCHAIN "x86_64-illumos") elseif(HAIKU) @@ -193,7 +204,7 @@ if(ANDROID) # include official NDK toolchain script include(${CROSS_ROOTFS}/../build/cmake/android.toolchain.cmake) -elseif(FREEBSD) +elseif(FREEBSD OR OPENBSD) # we cross-compile by instructing clang set(CMAKE_C_COMPILER_TARGET ${triple}) set(CMAKE_CXX_COMPILER_TARGET ${triple}) @@ -291,7 +302,7 @@ endif() # Specify compile options -if((TARGET_ARCH_NAME MATCHES "^(arm|arm64|armel|armv6|loongarch64|ppc64le|riscv64|s390x|x64|x86)$" AND NOT ANDROID AND NOT FREEBSD) OR ILLUMOS OR HAIKU) +if((TARGET_ARCH_NAME MATCHES "^(arm|arm64|armel|armv6|loongarch64|ppc64le|riscv64|s390x|x64|x86)$" AND NOT ANDROID AND NOT FREEBSD AND NOT OPENBSD) OR ILLUMOS OR HAIKU) set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN}) set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN}) set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN}) diff --git a/eng/common/darc-init.ps1 b/eng/common/darc-init.ps1 index e33743105635..a5be41db6906 100644 --- a/eng/common/darc-init.ps1 +++ b/eng/common/darc-init.ps1 @@ -29,11 +29,11 @@ function InstallDarcCli ($darcVersion, $toolpath) { Write-Host "Installing Darc CLI version $darcVersion..." Write-Host 'You may need to restart your command window if this is the first dotnet tool you have installed.' if (-not $toolpath) { - Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g" - & "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity -g + Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --source '$arcadeServicesSource' -v $verbosity -g" + & "$dotnet" tool install $darcCliPackageName --version $darcVersion --source "$arcadeServicesSource" -v $verbosity -g }else { - Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity --tool-path '$toolpath'" - & "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity --tool-path "$toolpath" + Write-Host "'$dotnet' tool install $darcCliPackageName --version $darcVersion --source '$arcadeServicesSource' -v $verbosity --tool-path '$toolpath'" + & "$dotnet" tool install $darcCliPackageName --version $darcVersion --source "$arcadeServicesSource" -v $verbosity --tool-path "$toolpath" } } diff --git a/eng/common/darc-init.sh b/eng/common/darc-init.sh index e889f439b8dc..b56d40e5706c 100644 --- a/eng/common/darc-init.sh +++ b/eng/common/darc-init.sh @@ -5,7 +5,7 @@ darcVersion='' versionEndpoint='https://maestro.dot.net/api/assets/darc-version?api-version=2020-02-20' verbosity='minimal' -while [[ $# > 0 ]]; do +while [[ $# -gt 0 ]]; do opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" case "$opt" in --darcversion) @@ -73,9 +73,9 @@ function InstallDarcCli { echo "Installing Darc CLI version $darcVersion..." echo "You may need to restart your command shell if this is the first dotnet tool you have installed." if [ -z "$toolpath" ]; then - echo $($dotnet_root/dotnet tool install $darc_cli_package_name --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity -g) + echo $($dotnet_root/dotnet tool install $darc_cli_package_name --version $darcVersion --source "$arcadeServicesSource" -v $verbosity -g) else - echo $($dotnet_root/dotnet tool install $darc_cli_package_name --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity --tool-path "$toolpath") + echo $($dotnet_root/dotnet tool install $darc_cli_package_name --version $darcVersion --source "$arcadeServicesSource" -v $verbosity --tool-path "$toolpath") fi } diff --git a/eng/common/dotnet-install.sh b/eng/common/dotnet-install.sh index 7b9d97e3bd4d..61f302bb6775 100644 --- a/eng/common/dotnet-install.sh +++ b/eng/common/dotnet-install.sh @@ -18,7 +18,7 @@ architecture='' runtime='dotnet' runtimeSourceFeed='' runtimeSourceFeedKey='' -while [[ $# > 0 ]]; do +while [[ $# -gt 0 ]]; do opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" case "$opt" in -version|-v) diff --git a/eng/common/dotnet.sh b/eng/common/dotnet.sh index 2ef68235675f..f6d24871c1d4 100644 --- a/eng/common/dotnet.sh +++ b/eng/common/dotnet.sh @@ -19,7 +19,7 @@ source $scriptroot/tools.sh InitializeDotNetCli true # install # Invoke acquired SDK with args if they are provided -if [[ $# > 0 ]]; then +if [[ $# -gt 0 ]]; then __dotnetDir=${_InitializeDotNetCli} dotnetPath=${__dotnetDir}/dotnet ${dotnetPath} "$@" diff --git a/eng/common/internal-feed-operations.sh b/eng/common/internal-feed-operations.sh index 9378223ba095..6299e7effd4c 100644 --- a/eng/common/internal-feed-operations.sh +++ b/eng/common/internal-feed-operations.sh @@ -100,7 +100,7 @@ operation='' authToken='' repoName='' -while [[ $# > 0 ]]; do +while [[ $# -gt 0 ]]; do opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" case "$opt" in --operation) diff --git a/eng/common/native/init-distro-rid.sh b/eng/common/native/init-distro-rid.sh index 83ea7aab0e08..8fc6d2fec78d 100644 --- a/eng/common/native/init-distro-rid.sh +++ b/eng/common/native/init-distro-rid.sh @@ -39,6 +39,8 @@ getNonPortableDistroRid() # $rootfsDir can be empty. freebsd-version is a shell script and should always work. __freebsd_major_version=$("$rootfsDir"/bin/freebsd-version | cut -d'.' -f1) nonPortableRid="freebsd.$__freebsd_major_version-${targetArch}" + elif [ "$targetOs" = "openbsd" ]; then + nonPortableRid="openbsd.$(uname -r)-${targetArch}" elif command -v getprop >/dev/null && getprop ro.product.system.model | grep -qi android; then __android_sdk_version=$(getprop ro.build.version.sdk) nonPortableRid="android.$__android_sdk_version-${targetArch}" diff --git a/eng/common/native/install-dependencies.sh b/eng/common/native/install-dependencies.sh index 477a44f335be..4742177a7685 100644 --- a/eng/common/native/install-dependencies.sh +++ b/eng/common/native/install-dependencies.sh @@ -24,14 +24,16 @@ case "$os" in apt update apt install -y build-essential gettext locales cmake llvm clang lld lldb liblldb-dev libunwind8-dev libicu-dev liblttng-ust-dev \ - libssl-dev libkrb5-dev pigz cpio + libssl-dev libkrb5-dev pigz cpio ninja-build localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 - elif [ "$ID" = "fedora" ] || [ "$ID" = "rhel" ] || [ "$ID" = "azurelinux" ]; then + elif [ "$ID" = "fedora" ] || [ "$ID" = "rhel" ] || [ "$ID" = "azurelinux" ] || [ "$ID" = "centos" ]; then pkg_mgr="$(command -v tdnf 2>/dev/null || command -v dnf)" - $pkg_mgr install -y cmake llvm lld lldb clang python curl libicu-devel openssl-devel krb5-devel lttng-ust-devel pigz cpio + $pkg_mgr install -y cmake llvm lld lldb clang python curl libicu-devel openssl-devel krb5-devel lttng-ust-devel pigz cpio ninja-build + elif [ "$ID" = "amzn" ]; then + dnf install -y cmake llvm lld lldb clang python libicu-devel openssl-devel krb5-devel lttng-ust-devel pigz cpio ninja-build elif [ "$ID" = "alpine" ]; then - apk add build-base cmake bash curl clang llvm-dev lld lldb krb5-dev lttng-ust-dev icu-dev openssl-dev pigz cpio + apk add build-base cmake bash curl clang llvm llvm-dev lld lldb-dev krb5-dev lttng-ust-dev icu-dev openssl-dev pigz cpio ninja else echo "Unsupported distro. distro: $ID" exit 1 @@ -52,6 +54,7 @@ brew "openssl@3" brew "pkgconf" brew "python3" brew "pigz" +brew "ninja" EOF ;; diff --git a/eng/common/post-build/redact-logs.ps1 b/eng/common/post-build/redact-logs.ps1 index 472d5bb562c9..672f4e2652ed 100644 --- a/eng/common/post-build/redact-logs.ps1 +++ b/eng/common/post-build/redact-logs.ps1 @@ -9,7 +9,8 @@ param( [Parameter(Mandatory=$false)][string] $TokensFilePath, [Parameter(ValueFromRemainingArguments=$true)][String[]]$TokensToRedact, [Parameter(Mandatory=$false)][string] $runtimeSourceFeed, - [Parameter(Mandatory=$false)][string] $runtimeSourceFeedKey) + [Parameter(Mandatory=$false)][string] $runtimeSourceFeedKey +) try { $ErrorActionPreference = 'Stop' @@ -48,8 +49,8 @@ try { Write-Host "Installing Binlog redactor CLI..." Write-Host "'$dotnet' new tool-manifest" & "$dotnet" new tool-manifest - Write-Host "'$dotnet' tool install $packageName --local --add-source '$PackageFeed' -v $verbosity --version $BinlogToolVersion" - & "$dotnet" tool install $packageName --local --add-source "$PackageFeed" -v $verbosity --version $BinlogToolVersion + Write-Host "'$dotnet' tool install $packageName --local --source '$PackageFeed' -v $verbosity --version $BinlogToolVersion" + & "$dotnet" tool install $packageName --local --source "$PackageFeed" -v $verbosity --version $BinlogToolVersion if (Test-Path $TokensFilePath) { Write-Host "Adding additional sensitive data for redaction from file: " $TokensFilePath diff --git a/eng/common/renovate.env b/eng/common/renovate.env new file mode 100644 index 000000000000..17ecc05d9b19 --- /dev/null +++ b/eng/common/renovate.env @@ -0,0 +1,42 @@ +# Renovate Global Configuration +# https://docs.renovatebot.com/self-hosted-configuration/ +# +# NOTE: This file uses bash/shell format and is sourced via `. renovate.env`. +# Values containing spaces or special characters must be quoted. + +# Author to use for git commits made by Renovate +# https://docs.renovatebot.com/configuration-options/#gitauthor +export RENOVATE_GIT_AUTHOR='.NET Renovate ' + +# Disable rate limiting for PR creation (0 = unlimited) +# https://docs.renovatebot.com/presets-default/#prhourlylimitnone +# https://docs.renovatebot.com/presets-default/#prconcurrentlimitnone +export RENOVATE_PR_HOURLY_LIMIT=0 +export RENOVATE_PR_CONCURRENT_LIMIT=0 + +# Skip the onboarding PR that Renovate normally creates for new repos +# https://docs.renovatebot.com/config-overview/#onboarding +export RENOVATE_ONBOARDING=false + +# Any Renovate config file in the cloned repository is ignored. Only +# the Renovate config file from the repo where the pipeline is running +# is used (yes, those are the same repo but the sources may be different). +# https://docs.renovatebot.com/self-hosted-configuration/#requireconfig +export RENOVATE_REQUIRE_CONFIG=ignored + +# Customize the PR body content. This removes some of the default +# sections that aren't relevant in a self-hosted config. +# https://docs.renovatebot.com/configuration-options/#prheader +# https://docs.renovatebot.com/configuration-options/#prbodynotes +# https://docs.renovatebot.com/configuration-options/#prbodytemplate +export RENOVATE_PR_HEADER='## Automated Dependency Update' +export RENOVATE_PR_BODY_NOTES='["This PR has been created automatically by the [.NET Renovate Bot](https://github.com/dotnet/arcade/blob/main/Documentation/Renovate.md) to update one or more dependencies in your repo. Please review the changes and merge the PR if everything looks good."]' +export RENOVATE_PR_BODY_TEMPLATE='{{{header}}}{{{table}}}{{{warnings}}}{{{notes}}}{{{changelogs}}}' + +# Extend the global config with additional presets +# https://docs.renovatebot.com/self-hosted-configuration/#globalextends +# Disable the Dependency Dashboard issue that tracks all updates +export RENOVATE_GLOBAL_EXTENDS='[":disableDependencyDashboard"]' + +# Allow all commands for post-upgrade commands. +export RENOVATE_ALLOWED_COMMANDS='[".*"]' diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 index b64b66a6275b..68119de603ef 100644 --- a/eng/common/sdk-task.ps1 +++ b/eng/common/sdk-task.ps1 @@ -22,7 +22,7 @@ $warnAsError = if ($noWarnAsError) { $false } else { $true } function Print-Usage() { Write-Host "Common settings:" - Write-Host " -task Name of Arcade task (name of a project in SdkTasks directory of the Arcade SDK package)" + Write-Host " -task Name of Arcade task (name of a project in toolset directory of the Arcade SDK package)" Write-Host " -restore Restore dependencies" Write-Host " -verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" Write-Host " -help Print help and exit" @@ -66,20 +66,7 @@ try { if( $msbuildEngine -eq "vs") { # Ensure desktop MSBuild is available for sdk tasks. - if( -not ($GlobalJson.tools.PSObject.Properties.Name -contains "vs" )) { - $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 "18.0.0" -MemberType NoteProperty - } - if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") { - $xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true - } - if ($xcopyMSBuildToolsFolder -eq $null) { - throw 'Unable to get xcopy downloadable version of msbuild' - } - - $global:_MSBuildExe = "$($xcopyMSBuildToolsFolder)\MSBuild\Current\Bin\MSBuild.exe" + $global:_MSBuildExe = InitializeVisualStudioMSBuild } $taskProject = GetSdkTaskProject $task diff --git a/eng/common/sdk-task.sh b/eng/common/sdk-task.sh index 3270f83fa9a7..1cf71bb2aea4 100644 --- a/eng/common/sdk-task.sh +++ b/eng/common/sdk-task.sh @@ -2,7 +2,7 @@ show_usage() { echo "Common settings:" - echo " --task Name of Arcade task (name of a project in SdkTasks directory of the Arcade SDK package)" + echo " --task Name of Arcade task (name of a project in toolset directory of the Arcade SDK package)" echo " --restore Restore dependencies" echo " --verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" echo " --help Print help and exit" diff --git a/eng/common/template-guidance.md b/eng/common/template-guidance.md index e2b07a865f10..f772aa3d78fa 100644 --- a/eng/common/template-guidance.md +++ b/eng/common/template-guidance.md @@ -71,7 +71,6 @@ eng\common\ source-build.yml (shim) source-index-stage1.yml (shim) jobs\ - codeql-build.yml (shim) jobs.yml (shim) source-build.yml (shim) post-build\ @@ -88,7 +87,6 @@ eng\common\ source-build.yml (shim) variables\ pool-providers.yml (logic + redirect) # templates/variables/pool-providers.yml will redirect to templates-official/variables/pool-providers.yml if you are running in the internal project - sdl-variables.yml (logic) core-templates\ job\ job.yml (logic) @@ -97,7 +95,6 @@ eng\common\ source-build.yml (logic) source-index-stage1.yml (logic) jobs\ - codeql-build.yml (logic) jobs.yml (logic) source-build.yml (logic) post-build\ diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 977a2d4b1039..65adefc7f268 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -34,6 +34,9 @@ # Configures warning treatment in msbuild. [bool]$warnAsError = if (Test-Path variable:warnAsError) { $warnAsError } else { $true } +# Specifies semi-colon delimited list of warning codes that should not be treated as errors. +[string]$warnNotAsError = if (Test-Path variable:warnNotAsError) { $warnNotAsError } else { '' } + # Specifies which msbuild engine to use for build: 'vs', 'dotnet' or unspecified (determined based on presence of tools.vs in global.json). [string]$msbuildEngine = if (Test-Path variable:msbuildEngine) { $msbuildEngine } else { $null } @@ -157,9 +160,6 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { return $global:_DotNetInstallDir } - # Don't resolve runtime, shared framework, or SDK from other locations to ensure build determinism - $env:DOTNET_MULTILEVEL_LOOKUP=0 - # Disable first run since we do not need all ASP.NET packages restored. $env:DOTNET_NOLOGO=1 @@ -185,7 +185,11 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { if ((-not $globalJsonHasRuntimes) -and (-not [string]::IsNullOrEmpty($env:DOTNET_INSTALL_DIR)) -and (Test-Path(Join-Path $env:DOTNET_INSTALL_DIR "sdk\$dotnetSdkVersion"))) { $dotnetRoot = $env:DOTNET_INSTALL_DIR } else { - $dotnetRoot = Join-Path $RepoRoot '.dotnet' + if (-not [string]::IsNullOrEmpty($env:DOTNET_GLOBAL_INSTALL_DIR)) { + $dotnetRoot = $env:DOTNET_GLOBAL_INSTALL_DIR + } else { + $dotnetRoot = Join-Path $RepoRoot '.dotnet' + } if (-not (Test-Path(Join-Path $dotnetRoot "sdk\$dotnetSdkVersion"))) { if ($install) { @@ -225,7 +229,6 @@ function InitializeDotNetCli([bool]$install, [bool]$createSdkLocationFile) { # Make Sure that our bootstrapped dotnet cli is available in future steps of the Azure Pipelines build Write-PipelinePrependPath -Path $dotnetRoot - Write-PipelineSetVariable -Name 'DOTNET_MULTILEVEL_LOOKUP' -Value '0' Write-PipelineSetVariable -Name 'DOTNET_NOLOGO' -Value '1' return $global:_DotNetInstallDir = $dotnetRoot @@ -299,6 +302,8 @@ function InstallDotNet([string] $dotnetRoot, $dotnetVersionLabel = "'sdk v$version'" + # For performance this check is duplicated in src/Microsoft.DotNet.Arcade.Sdk/src/InstallDotNetCore.cs + # if you are making changes here, consider if you need to make changes there as well. if ($runtime -ne '' -and $runtime -ne 'sdk') { $runtimePath = $dotnetRoot $runtimePath = $runtimePath + "\shared" @@ -374,12 +379,11 @@ function InstallDotNet([string] $dotnetRoot, # # 1. MSBuild from an active VS command prompt # 2. MSBuild from a compatible VS installation -# 3. MSBuild from the xcopy tool package # # Returns full path to msbuild.exe. # Throws on failure. # -function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = $null) { +function InitializeVisualStudioMSBuild([object]$vsRequirements = $null) { if (-not (IsWindowsPlatform)) { throw "Cannot initialize Visual Studio on non-Windows" } @@ -389,13 +393,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = } # Minimum VS version to require. - $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/Microsoft.DotNet.Arcade.MSBuild.Xcopy/versions/18.0.0 - $defaultXCopyMSBuildVersion = '18.0.0' + $vsMinVersionReqdStr = '18.0' if (!$vsRequirements) { if (Get-Member -InputObject $GlobalJson.tools -Name 'vs') { @@ -425,46 +423,16 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = } } - # Locate Visual Studio installation or download x-copy msbuild. + # Locate Visual Studio installation. $vsInfo = LocateVisualStudio $vsRequirements - if ($vsInfo -ne $null -and $env:ForceUseXCopyMSBuild -eq $null) { + if ($vsInfo -ne $null) { # Ensure vsInstallDir has a trailing slash $vsInstallDir = Join-Path $vsInfo.installationPath "\" $vsMajorVersion = $vsInfo.installationVersion.Split('.')[0] InitializeVisualStudioEnvironmentVariables $vsInstallDir $vsMajorVersion } else { - if (Get-Member -InputObject $GlobalJson.tools -Name 'xcopy-msbuild') { - $xcopyMSBuildVersion = $GlobalJson.tools.'xcopy-msbuild' - $vsMajorVersion = $xcopyMSBuildVersion.Split('.')[0] - } else { - #if vs version provided in global.json is incompatible (too low) then use the default version for xcopy msbuild download - if($vsMinVersion -lt $vsMinVersionReqd){ - Write-Host "Using xcopy-msbuild version of $defaultXCopyMSBuildVersion since VS version $vsMinVersionStr provided in global.json is not compatible" - $xcopyMSBuildVersion = $defaultXCopyMSBuildVersion - $vsMajorVersion = $xcopyMSBuildVersion.Split('.')[0] - } - else{ - # If the VS version IS compatible, look for an xcopy msbuild package - # with a version matching VS. - # Note: If this version does not exist, then an explicit version of xcopy msbuild - # can be specified in global.json. This will be required for pre-release versions of msbuild. - $vsMajorVersion = $vsMinVersion.Major - $vsMinorVersion = $vsMinVersion.Minor - $xcopyMSBuildVersion = "$vsMajorVersion.$vsMinorVersion.0" - } - } - - $vsInstallDir = $null - if ($xcopyMSBuildVersion.Trim() -ine "none") { - $vsInstallDir = InitializeXCopyMSBuild $xcopyMSBuildVersion $install - if ($vsInstallDir -eq $null) { - throw "Could not xcopy msbuild. Please check that package 'Microsoft.DotNet.Arcade.MSBuild.Xcopy @ $xcopyMSBuildVersion' exists on feed 'dotnet-eng'." - } - } - if ($vsInstallDir -eq $null) { - throw 'Unable to find Visual Studio that has required version and components installed' - } + throw 'Unable to find Visual Studio that has required version and components installed' } $msbuildVersionDir = if ([int]$vsMajorVersion -lt 16) { "$vsMajorVersion.0" } else { "Current" } @@ -491,38 +459,6 @@ function InitializeVisualStudioEnvironmentVariables([string] $vsInstallDir, [str } } -function InstallXCopyMSBuild([string]$packageVersion) { - return InitializeXCopyMSBuild $packageVersion -install $true -} - -function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) { - $packageName = 'Microsoft.DotNet.Arcade.MSBuild.Xcopy' - $packageDir = Join-Path $ToolsDir "msbuild\$packageVersion" - $packagePath = Join-Path $packageDir "$packageName.$packageVersion.nupkg" - - if (!(Test-Path $packageDir)) { - if (!$install) { - return $null - } - - Create-Directory $packageDir - - Write-Host "Downloading $packageName $packageVersion" - $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit - Retry({ - Invoke-WebRequest "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/flat2/$packageName/$packageVersion/$packageName.$packageVersion.nupkg" -UseBasicParsing -OutFile $packagePath - }) - - if (!(Test-Path $packagePath)) { - Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "See https://dev.azure.com/dnceng/internal/_wiki/wikis/DNCEng%20Services%20Wiki/1074/Updating-Microsoft.DotNet.Arcade.MSBuild.Xcopy-WAS-RoslynTools.MSBuild-(xcopy-msbuild)-generation?anchor=troubleshooting for help troubleshooting issues with XCopy MSBuild" - throw - } - Unzip $packagePath $packageDir - } - - return Join-Path $packageDir 'tools' -} - # # Locates Visual Studio instance that meets the minimal requirements specified by tools.vs object in global.json. # @@ -544,7 +480,6 @@ function LocateVisualStudio([object]$vsRequirements = $null){ if (Get-Member -InputObject $GlobalJson.tools -Name 'vswhere') { $vswhereVersion = $GlobalJson.tools.vswhere } else { - # keep this in sync with the VSWhereVersion in DefaultVersions.props $vswhereVersion = '3.1.7' } @@ -592,6 +527,11 @@ function LocateVisualStudio([object]$vsRequirements = $null){ return $null } + if ($null -eq $vsInfo -or $vsInfo.Count -eq 0) { + throw "No instance of Visual Studio meeting the requirements specified was found. Requirements: $($args -join ' ')" + return $null + } + # use first matching instance return $vsInfo[0] } @@ -627,7 +567,7 @@ function InitializeBuildTool() { $buildTool = @{ Path = $dotnetPath; Command = 'msbuild'; Tool = 'dotnet'; Framework = 'net' } } elseif ($msbuildEngine -eq "vs") { try { - $msbuildPath = InitializeVisualStudioMSBuild -install:$restore + $msbuildPath = InitializeVisualStudioMSBuild } catch { Write-PipelineTelemetryError -Category 'InitializeToolset' -Message $_ ExitWithExitCode 1 @@ -674,7 +614,17 @@ function GetNuGetPackageCachePath() { # Returns a full path to an Arcade SDK task project file. function GetSdkTaskProject([string]$taskName) { - return Join-Path (Split-Path (InitializeToolset) -Parent) "SdkTasks\$taskName.proj" + $toolsetDir = Split-Path (InitializeToolset) -Parent + $proj = Join-Path $toolsetDir "$taskName.proj" + if (Test-Path $proj) { + return $proj + } + # TODO: Remove this fallback once all supported versions use the new layout. + $legacyProj = Join-Path $toolsetDir "SdkTasks\$taskName.proj" + if (Test-Path $legacyProj) { + return $legacyProj + } + throw "Unable to find $taskName.proj in toolset at: $toolsetDir" } function InitializeNativeTools() { @@ -711,13 +661,18 @@ function InitializeToolset() { $nugetCache = GetNuGetPackageCachePath $toolsetVersion = Read-ArcadeSdkVersion - $toolsetLocationFile = Join-Path $ToolsetDir "$toolsetVersion.txt" + $toolsetToolsDir = Join-Path $ToolsetDir $toolsetVersion - if (Test-Path $toolsetLocationFile) { - $path = Get-Content $toolsetLocationFile -TotalCount 1 - if (Test-Path $path) { - return $global:_InitializeToolset = $path - } + # Check if the toolset has already been extracted + $toolsetBuildProj = $null + $buildProjPath = Join-Path $toolsetToolsDir 'Build.proj' + + if (Test-Path $buildProjPath) { + $toolsetBuildProj = $buildProjPath + } + + if ($toolsetBuildProj -ne $null) { + return $global:_InitializeToolset = $toolsetBuildProj } if (-not $restore) { @@ -725,21 +680,50 @@ function InitializeToolset() { ExitWithExitCode 1 } - $buildTool = InitializeBuildTool + $downloadArgs = @("package", "download", "Microsoft.DotNet.Arcade.Sdk@$toolsetVersion", "--verbosity", "minimal", "--prerelease", "--output", "$nugetCache") + $nugetConfig = $env:NUGET_CONFIG + if (-not $nugetConfig) { + # Search for any variation of nuget.config in the RepoRoot + $configFile = Get-ChildItem -Path $RepoRoot -File | Where-Object { $_.Name -ieq "nuget.config" } | Select-Object -First 1 - $proj = Join-Path $ToolsetDir 'restore.proj' - $bl = if ($binaryLog) { '/bl:' + (Join-Path $LogDir 'ToolsetRestore.binlog') } else { '' } + if ($configFile) { + $nugetConfig = $configFile.FullName + } + } - '' | Set-Content $proj + if ($nugetConfig) { + $downloadArgs += "--configfile" + $downloadArgs += $nugetConfig + } + DotNet @downloadArgs - MSBuild-Core $proj $bl /t:__WriteToolsetLocation /clp:ErrorsOnly`;NoSummary /p:__ToolsetLocationOutputFile=$toolsetLocationFile + $packageDir = Join-Path $nugetCache (Join-Path 'microsoft.dotnet.arcade.sdk' $toolsetVersion) + $packageToolsetDir = Join-Path $packageDir 'toolset' + $packageToolsDir = Join-Path $packageDir 'tools' + + # TODO: Remove the tools/ check once all supported versions have the toolset folder. + if (!(Test-Path $packageToolsetDir) -and !(Test-Path $packageToolsDir)) { + Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Arcade SDK package does not contain a toolset or tools folder: $packageDir" + ExitWithExitCode 3 + } + + New-Item -ItemType Directory -Path $toolsetToolsDir -Force | Out-Null + + # Copy toolset if present at the package root (new layout), otherwise fall back to tools + if (Test-Path $packageToolsetDir) { + Copy-Item -Path "$packageToolsetDir\*" -Destination $toolsetToolsDir -Recurse -Force + } else { + # TODO: Remove this fallback once all supported versions have the toolset folder. + Copy-Item -Path "$packageToolsDir\*" -Destination $toolsetToolsDir -Recurse -Force + } - $path = Get-Content $toolsetLocationFile -Encoding UTF8 -TotalCount 1 - if (!(Test-Path $path)) { - throw "Invalid toolset path: $path" + if (Test-Path $buildProjPath) { + $toolsetBuildProj = $buildProjPath + } else { + throw "Unable to find Build.proj in toolset at: $toolsetToolsDir" } - return $global:_InitializeToolset = $path + return $global:_InitializeToolset = $toolsetBuildProj } function ExitWithExitCode([int] $exitCode) { @@ -800,6 +784,40 @@ function MSBuild() { MSBuild-Core @args } +# +# Executes a dotnet command with arguments passed to the function. +# Terminates the script if the command fails. +# +function DotNet() { + $dotnetRoot = InitializeDotNetCli -install:$restore + $dotnetPath = Join-Path $dotnetRoot (GetExecutableFileName 'dotnet') + + $cmdArgs = "" + foreach ($arg in $args) { + if ($null -ne $arg -and $arg.Trim() -ne "") { + if ($arg.EndsWith('\')) { + $arg = $arg + "\" + } + $cmdArgs += " `"$arg`"" + } + } + + $env:ARCADE_BUILD_TOOL_COMMAND = "`"$dotnetPath`" $cmdArgs" + + $exitCode = Exec-Process $dotnetPath $cmdArgs + + if ($exitCode -ne 0) { + Write-Host "dotnet command failed with exit code $exitCode. Check errors above." -ForegroundColor Red + + if ($ci -and $env:SYSTEM_TEAMPROJECT -ne $null -and !$fromVMR) { + Write-PipelineSetResult -Result "Failed" -Message "dotnet command execution failed." + ExitWithExitCode 0 + } else { + ExitWithExitCode $exitCode + } + } +} + # # Executes msbuild (or 'dotnet msbuild') with arguments passed to the function. # The arguments are automatically quoted. @@ -836,6 +854,10 @@ function MSBuild-Core() { $cmdArgs += ' /p:TreatWarningsAsErrors=false' } + if ($warnAsError -and $warnNotAsError) { + $cmdArgs += " /warnnotaserror:$warnNotAsError /p:AdditionalWarningsNotAsErrors=$warnNotAsError" + } + foreach ($arg in $args) { if ($null -ne $arg -and $arg.Trim() -ne "") { if ($arg.EndsWith('\')) { diff --git a/eng/common/tools.sh b/eng/common/tools.sh index 1b296f646c23..95c55ce9b4d9 100644 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -52,6 +52,9 @@ fi # Configures warning treatment in msbuild. warn_as_error=${warn_as_error:-true} +# Specifies semi-colon delimited list of warning codes that should not be treated as errors. +warn_not_as_error=${warn_not_as_error:-''} + # True to attempt using .NET Core already that meets requirements specified in global.json # installed on the machine instead of downloading one. use_installed_dotnet_cli=${use_installed_dotnet_cli:-true} @@ -115,9 +118,6 @@ function InitializeDotNetCli { local install=$1 - # Don't resolve runtime, shared framework, or SDK from other locations to ensure build determinism - export DOTNET_MULTILEVEL_LOOKUP=0 - # Disable first run since we want to control all package sources export DOTNET_NOLOGO=1 @@ -148,7 +148,11 @@ function InitializeDotNetCli { if [[ $global_json_has_runtimes == false && -n "${DOTNET_INSTALL_DIR:-}" && -d "$DOTNET_INSTALL_DIR/sdk/$dotnet_sdk_version" ]]; then dotnet_root="$DOTNET_INSTALL_DIR" else - dotnet_root="${repo_root}.dotnet" + if [[ -n "${DOTNET_GLOBAL_INSTALL_DIR:-}" ]]; then + dotnet_root="$DOTNET_GLOBAL_INSTALL_DIR" + else + dotnet_root="${repo_root}.dotnet" + fi export DOTNET_INSTALL_DIR="$dotnet_root" @@ -166,7 +170,6 @@ function InitializeDotNetCli { # build steps from using anything other than what we've downloaded. Write-PipelinePrependPath -path "$dotnet_root" - Write-PipelineSetVariable -name "DOTNET_MULTILEVEL_LOOKUP" -value "0" Write-PipelineSetVariable -name "DOTNET_NOLOGO" -value "1" # return value @@ -188,6 +191,8 @@ function InstallDotNet { local version=$2 local runtime=$4 + # For performance this check is duplicated in src/Microsoft.DotNet.Arcade.Sdk/src/InstallDotNetCore.cs + # if you are making changes here, consider if you need to make changes there as well. local dotnetVersionLabel="'$runtime v$version'" if [[ -n "${4:-}" ]] && [ "$4" != 'sdk' ]; then runtimePath="$root" @@ -406,15 +411,18 @@ function InitializeToolset { ReadGlobalVersion "Microsoft.DotNet.Arcade.Sdk" local toolset_version=$_ReadGlobalVersion - local toolset_location_file="$toolset_dir/$toolset_version.txt" + local toolset_tools_dir="$toolset_dir/$toolset_version" - if [[ -a "$toolset_location_file" ]]; then - local path=`cat "$toolset_location_file"` - if [[ -a "$path" ]]; then - # return value - _InitializeToolset="$path" - return - fi + # Check if the toolset has already been extracted + local toolset_build_proj="" + if [[ -a "$toolset_tools_dir/Build.proj" ]]; then + toolset_build_proj="$toolset_tools_dir/Build.proj" + fi + + if [[ -n "$toolset_build_proj" ]]; then + # return value + _InitializeToolset="$toolset_build_proj" + return fi if [[ "$restore" != true ]]; then @@ -422,20 +430,45 @@ function InitializeToolset { ExitWithExitCode 2 fi - local proj="$toolset_dir/restore.proj" + local download_args=("package" "download" "Microsoft.DotNet.Arcade.Sdk@$toolset_version" "--verbosity" "minimal" "--prerelease" "--output" "$_GetNuGetPackageCachePath") + local nuget_config="${NUGET_CONFIG:-}" + if [[ -z "$nuget_config" ]]; then + # Search for any variation of nuget.config in the RepoRoot + local found_config + found_config=$(find "$repo_root" -maxdepth 1 -type f -iname "nuget.config" -print -quit) - local bl="" - if [[ "$binary_log" == true ]]; then - bl="/bl:$log_dir/ToolsetRestore.binlog" + if [[ -n "$found_config" ]]; then + nuget_config="$found_config" + fi fi - echo '' > "$proj" - MSBuild-Core "$proj" $bl /t:__WriteToolsetLocation /clp:ErrorsOnly\;NoSummary /p:__ToolsetLocationOutputFile="$toolset_location_file" + if [[ -n "$nuget_config" ]]; then + download_args+=("--configfile" "$nuget_config") + fi + DotNet "${download_args[@]}" - local toolset_build_proj=`cat "$toolset_location_file"` + local package_dir="$_GetNuGetPackageCachePath/microsoft.dotnet.arcade.sdk/$toolset_version" - if [[ ! -a "$toolset_build_proj" ]]; then - Write-PipelineTelemetryError -category 'Build' "Invalid toolset path: $toolset_build_proj" + # TODO: Remove the tools/ check once all supported versions have the toolset folder. + if [[ ! -d "$package_dir/toolset" && ! -d "$package_dir/tools" ]]; then + Write-PipelineTelemetryError -category 'InitializeToolset' "Arcade SDK package does not contain a toolset or tools folder: $package_dir" + ExitWithExitCode 3 + fi + + mkdir -p "$toolset_tools_dir" + + # Copy toolset if present at the package root (new layout), otherwise fall back to tools + if [[ -d "$package_dir/toolset" ]]; then + cp -r "$package_dir/toolset/." "$toolset_tools_dir" + else + # TODO: Remove this fallback once all supported versions have the toolset folder. + cp -r "$package_dir/tools/." "$toolset_tools_dir" + fi + + if [[ -a "$toolset_tools_dir/Build.proj" ]]; then + toolset_build_proj="$toolset_tools_dir/Build.proj" + else + Write-PipelineTelemetryError -category 'Build' "Unable to find Build.proj in toolset at: $toolset_tools_dir" ExitWithExitCode 3 fi @@ -457,6 +490,26 @@ function StopProcesses { return 0 } +function DotNet { + InitializeDotNetCli $restore + + local dotnet_path="$_InitializeDotNetCli/dotnet" + + export ARCADE_BUILD_TOOL_COMMAND="$dotnet_path $@" + + "$dotnet_path" "$@" || { + local exit_code=$? + echo "dotnet command failed with exit code $exit_code. Check errors above." + + if [[ "$ci" == true && -n ${SYSTEM_TEAMPROJECT:-} && "$from_vmr" != true ]]; then + Write-PipelineSetResult -result "Failed" -message "dotnet command execution failed." + ExitWithExitCode 0 + else + ExitWithExitCode $exit_code + fi + } +} + function MSBuild { local args=( "$@" ) if [[ "$pipelines_log" == true ]]; then @@ -532,7 +585,12 @@ function MSBuild-Core { mt_switch="-mt" fi - RunBuildTool "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch $mt_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@" + local warnnotaserror_switch="" + if [[ -n "$warn_not_as_error" && "$warn_as_error" == true ]]; then + warnnotaserror_switch="/warnnotaserror:$warn_not_as_error /p:AdditionalWarningsNotAsErrors=$warn_not_as_error" + fi + + RunBuildTool "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch $mt_switch $warnnotaserror_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@" } function GetDarc { @@ -549,8 +607,22 @@ function GetDarc { # Returns a full path to an Arcade SDK task project file. function GetSdkTaskProject { - taskName=$1 - echo "$(dirname $_InitializeToolset)/SdkTasks/$taskName.proj" + local taskName=$1 + local toolsetDir + toolsetDir="$(dirname "$_InitializeToolset")" + local proj="$toolsetDir/$taskName.proj" + if [[ -a "$proj" ]]; then + echo "$proj" + return + fi + # TODO: Remove this fallback once all supported versions use the new layout. + local legacyProj="$toolsetDir/SdkTasks/$taskName.proj" + if [[ -a "$legacyProj" ]]; then + echo "$legacyProj" + return + fi + Write-PipelineTelemetryError -category 'Build' "Unable to find $taskName.proj in toolset at: $toolsetDir" + ExitWithExitCode 3 } ResolvePath "${BASH_SOURCE[0]}" diff --git a/global.json b/global.json index 5a1a6bf7167f..cec44f662489 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "10.0.300-preview.0.26216.121", + "version": "11.0.100-preview.5.26229.113", "paths": [ "builds/downloads/dotnet", "$host$" @@ -8,9 +8,9 @@ "errorMessage": "The .NET SDK could not be found, please run 'make dotnet -C builds'." }, "tools": { - "dotnet": "10.0.300-preview.0.26216.121" + "dotnet": "11.0.100-preview.5.26229.113" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "10.0.0-beta.26216.121" + "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26229.113" } } From a73961aa435f5db1cd872820871c059303913773 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 14:38:58 +0200 Subject: [PATCH 12/35] [tests] Update expected sizes. --- .../expected/MacCatalyst-CoreCLR-Interpreter-size.txt | 4 ++-- .../UnitTests/expected/MacCatalyst-CoreCLR-R2R-size.txt | 4 ++-- .../expected/MacCatalyst-MonoVM-interpreter-size.txt | 4 ++-- tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt | 4 ++-- .../MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt | 4 ++-- .../UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt | 4 ++-- tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-Interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-Interpreter-size.txt index d0ed14d9d5aa..7589ecee70ae 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-Interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-Interpreter-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 10,487,411 bytes (10,241.6 KB = 10.0 MB) +AppBundleSize: 10,487,219 bytes (10,241.4 KB = 10.0 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 4,951 bytes (4.8 KB = 0.0 MB) Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 242,192 bytes (236.5 KB = 0.2 MB) +Contents/MacOS/SizeTestApp: 242,000 bytes (236.3 KB = 0.2 MB) Contents/MonoBundle/libcoreclr.dylib: 6,385,264 bytes (6,235.6 KB = 6.1 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 110,432 bytes (107.8 KB = 0.1 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: 1,442,336 bytes (1,408.5 KB = 1.4 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-R2R-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-R2R-size.txt index 9b59ea3b9947..2d1dd5afe540 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-R2R-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-R2R-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 19,348,461 bytes (18,895.0 KB = 18.5 MB) +AppBundleSize: 19,348,253 bytes (18,894.8 KB = 18.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 5,105 bytes (5.0 KB = 0.0 MB) Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 242,832 bytes (237.1 KB = 0.2 MB) +Contents/MacOS/SizeTestApp: 242,624 bytes (236.9 KB = 0.2 MB) Contents/MonoBundle/libcoreclr.dylib: 6,385,264 bytes (6,235.6 KB = 6.1 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 110,432 bytes (107.8 KB = 0.1 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: 1,442,336 bytes (1,408.5 KB = 1.4 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt index d1e9a959ca79..9615db6d15f6 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 5,812,550 bytes (5,676.3 KB = 5.5 MB) +AppBundleSize: 5,810,614 bytes (5,674.4 KB = 5.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 3,310 bytes (3.2 KB = 0.0 MB) Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 4,569,312 bytes (4,462.2 KB = 4.4 MB) +Contents/MacOS/SizeTestApp: 4,567,376 bytes (4,460.3 KB = 4.4 MB) Contents/MonoBundle/Microsoft.MacCatalyst.dll: 158,208 bytes (154.5 KB = 0.2 MB) Contents/MonoBundle/runtimeconfig.bin: 1,405 bytes (1.4 KB = 0.0 MB) Contents/MonoBundle/SizeTestApp.dll: 7,680 bytes (7.5 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt index 11a95ce7b2d3..792aae310be2 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 16,623,778 bytes (16,234.2 KB = 15.9 MB) +AppBundleSize: 16,621,826 bytes (16,232.3 KB = 15.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 4,134 bytes (4.0 KB = 0.0 MB) Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 14,065,424 bytes (13,735.8 KB = 13.4 MB) +Contents/MacOS/SizeTestApp: 14,063,472 bytes (13,733.9 KB = 13.4 MB) Contents/MonoBundle/aot-instances.aotdata.arm64: 1,051,776 bytes (1,027.1 KB = 1.0 MB) Contents/MonoBundle/Microsoft.MacCatalyst.aotdata.arm64: 36,048 bytes (35.2 KB = 0.0 MB) Contents/MonoBundle/Microsoft.MacCatalyst.dll: 51,200 bytes (50.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt index d37f948c2948..e3038b6183cd 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 258,841,448 bytes (252,774.9 KB = 246.9 MB) +AppBundleSize: 258,841,208 bytes (252,774.6 KB = 246.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 56,016 bytes (54.7 KB = 0.1 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 7,390,448 bytes (7,217.2 KB = 7.0 MB) +Contents/MacOS/SizeTestApp: 7,390,208 bytes (7,217.0 KB = 7.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/_Microsoft.macOS.TypeMap.dll: 4,842,496 bytes (4,729.0 KB = 4.6 MB) Contents/MonoBundle/.xamarin/osx-arm64/_Microsoft.macOS.TypeMaps.dll: 2,048 bytes (2.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/_SizeTestApp.TypeMap.dll: 3,072 bytes (3.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt index 8960f27e43b9..00b6bf46f3ac 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 246,978,122 bytes (241,189.6 KB = 235.5 MB) +AppBundleSize: 246,977,882 bytes (241,189.3 KB = 235.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 54,948 bytes (53.7 KB = 0.1 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 8,013,904 bytes (7,826.1 KB = 7.6 MB) +Contents/MacOS/SizeTestApp: 8,013,664 bytes (7,825.8 KB = 7.6 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 882,688 bytes (862.0 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Caching.Abstractions.dll: 56,320 bytes (55.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Configuration.Abstractions.dll: 28,160 bytes (27.5 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt index 29626c7fde4d..cb15ab165a46 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 312,119,370 bytes (304,804.1 KB = 297.7 MB) +AppBundleSize: 312,119,130 bytes (304,803.8 KB = 297.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 54,948 bytes (53.7 KB = 0.1 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 8,013,904 bytes (7,826.1 KB = 7.6 MB) +Contents/MacOS/SizeTestApp: 8,013,664 bytes (7,825.8 KB = 7.6 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 882,688 bytes (862.0 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Caching.Abstractions.dll: 56,320 bytes (55.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Configuration.Abstractions.dll: 28,160 bytes (27.5 KB = 0.0 MB) From 75bcfbf617782386f0e7e5be4d904321b0435b7f Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 15:25:51 +0200 Subject: [PATCH 13/35] [apidiff] Update reference/stable versions to latest .NET 10 / Xcode 26.4 (#25323) --- Make.config | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Make.config b/Make.config index 0e88c44f2ef0..8880e28369bd 100644 --- a/Make.config +++ b/Make.config @@ -50,10 +50,10 @@ include $(TOP)/Make.versions # The value is taken from the name + version of the Ref pack. # Example: given the Ref pack "Microsoft.iOS.Ref.net8.0_17.5" with the version "17.5.8030", the value # to write here would be the part after "Microsoft.iOS.Ref." + "/" + version: "net8.0_17.5/17.5.8030" -STABLE_NUGET_VERSION_iOS=net10.0_26.2/26.2.10233 -STABLE_NUGET_VERSION_tvOS=net10.0_26.2/26.2.10233 -STABLE_NUGET_VERSION_MacCatalyst=net10.0_26.2/26.2.10233 -STABLE_NUGET_VERSION_macOS=net10.0_26.2/26.2.10233 +STABLE_NUGET_VERSION_iOS=net10.0_26.4/26.4.10259 +STABLE_NUGET_VERSION_tvOS=net10.0_26.4/26.4.10259 +STABLE_NUGET_VERSION_MacCatalyst=net10.0_26.4/26.4.10259 +STABLE_NUGET_VERSION_macOS=net10.0_26.4/26.4.10259 PACKAGE_HEAD_REV=$(shell git rev-parse HEAD) From ad8bc799666acb4a0198f46a7d4b5a808ec9bb71 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 15:29:46 +0200 Subject: [PATCH 14/35] [dotnet] Remove some outdated code only applicable to .NET 6 (and not later .NET versions). (#25327) --- .../Xamarin.Shared.Sdk.DefaultItems.targets | 33 ------------------- .../CentralPackageVersionsApp/AppDelegate.cs | 17 ---------- .../CentralPackageVersionsApp.csproj | 8 ----- .../MacCatalyst/Makefile | 1 - .../dotnet/CentralPackageVersionsApp/Makefile | 2 -- .../CentralPackageVersionsApp/Packages.props | 5 --- .../CentralPackageVersionsApp/README.md | 1 - .../iOS/CentralPackageVersionsApp.csproj | 8 ----- .../CentralPackageVersionsApp/iOS/Makefile | 1 - .../macOS/CentralPackageVersionsApp.csproj | 8 ----- .../CentralPackageVersionsApp/macOS/Makefile | 1 - .../CentralPackageVersionsApp/shared.csproj | 25 -------------- .../CentralPackageVersionsApp/shared.mk | 2 -- .../tvOS/CentralPackageVersionsApp.csproj | 8 ----- .../CentralPackageVersionsApp/tvOS/Makefile | 1 - tests/dotnet/UnitTests/ProjectTest.cs | 16 --------- 16 files changed, 137 deletions(-) delete mode 100644 tests/dotnet/CentralPackageVersionsApp/AppDelegate.cs delete mode 100644 tests/dotnet/CentralPackageVersionsApp/MacCatalyst/CentralPackageVersionsApp.csproj delete mode 100644 tests/dotnet/CentralPackageVersionsApp/MacCatalyst/Makefile delete mode 100644 tests/dotnet/CentralPackageVersionsApp/Makefile delete mode 100644 tests/dotnet/CentralPackageVersionsApp/Packages.props delete mode 100644 tests/dotnet/CentralPackageVersionsApp/README.md delete mode 100644 tests/dotnet/CentralPackageVersionsApp/iOS/CentralPackageVersionsApp.csproj delete mode 100644 tests/dotnet/CentralPackageVersionsApp/iOS/Makefile delete mode 100644 tests/dotnet/CentralPackageVersionsApp/macOS/CentralPackageVersionsApp.csproj delete mode 100644 tests/dotnet/CentralPackageVersionsApp/macOS/Makefile delete mode 100644 tests/dotnet/CentralPackageVersionsApp/shared.csproj delete mode 100644 tests/dotnet/CentralPackageVersionsApp/shared.mk delete mode 100644 tests/dotnet/CentralPackageVersionsApp/tvOS/CentralPackageVersionsApp.csproj delete mode 100644 tests/dotnet/CentralPackageVersionsApp/tvOS/Makefile diff --git a/dotnet/targets/Xamarin.Shared.Sdk.DefaultItems.targets b/dotnet/targets/Xamarin.Shared.Sdk.DefaultItems.targets index 973f26394330..42b125875d12 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.DefaultItems.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.DefaultItems.targets @@ -68,37 +68,4 @@ - - - - - - - - - - 6.0.3 - - diff --git a/tests/dotnet/CentralPackageVersionsApp/AppDelegate.cs b/tests/dotnet/CentralPackageVersionsApp/AppDelegate.cs deleted file mode 100644 index db627351190b..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/AppDelegate.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -using Foundation; - -namespace MySimpleApp { - public class Program { - static int Main (string [] args) - { - GC.KeepAlive (typeof (NSObject)); // prevent linking away the platform assembly - - Console.WriteLine (Environment.GetEnvironmentVariable ("MAGIC_WORD")); - - return args.Length; - } - } -} diff --git a/tests/dotnet/CentralPackageVersionsApp/MacCatalyst/CentralPackageVersionsApp.csproj b/tests/dotnet/CentralPackageVersionsApp/MacCatalyst/CentralPackageVersionsApp.csproj deleted file mode 100644 index 9146ec230693..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/MacCatalyst/CentralPackageVersionsApp.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - - net$(BundledNETCoreAppTargetFrameworkVersion)-maccatalyst - - - diff --git a/tests/dotnet/CentralPackageVersionsApp/MacCatalyst/Makefile b/tests/dotnet/CentralPackageVersionsApp/MacCatalyst/Makefile deleted file mode 100644 index 110d078f4577..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/MacCatalyst/Makefile +++ /dev/null @@ -1 +0,0 @@ -include ../shared.mk diff --git a/tests/dotnet/CentralPackageVersionsApp/Makefile b/tests/dotnet/CentralPackageVersionsApp/Makefile deleted file mode 100644 index 6affa45ff122..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -TOP=../../.. -include $(TOP)/tests/common/shared-dotnet-test.mk diff --git a/tests/dotnet/CentralPackageVersionsApp/Packages.props b/tests/dotnet/CentralPackageVersionsApp/Packages.props deleted file mode 100644 index 8423b42e36a1..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/Packages.props +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tests/dotnet/CentralPackageVersionsApp/README.md b/tests/dotnet/CentralPackageVersionsApp/README.md deleted file mode 100644 index 0f3d32a3be18..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/README.md +++ /dev/null @@ -1 +0,0 @@ -This test can be removed in .NET 7. diff --git a/tests/dotnet/CentralPackageVersionsApp/iOS/CentralPackageVersionsApp.csproj b/tests/dotnet/CentralPackageVersionsApp/iOS/CentralPackageVersionsApp.csproj deleted file mode 100644 index 1ce755af9e0a..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/iOS/CentralPackageVersionsApp.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - - net$(BundledNETCoreAppTargetFrameworkVersion)-ios - - - diff --git a/tests/dotnet/CentralPackageVersionsApp/iOS/Makefile b/tests/dotnet/CentralPackageVersionsApp/iOS/Makefile deleted file mode 100644 index 110d078f4577..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/iOS/Makefile +++ /dev/null @@ -1 +0,0 @@ -include ../shared.mk diff --git a/tests/dotnet/CentralPackageVersionsApp/macOS/CentralPackageVersionsApp.csproj b/tests/dotnet/CentralPackageVersionsApp/macOS/CentralPackageVersionsApp.csproj deleted file mode 100644 index 391feb6d1b70..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/macOS/CentralPackageVersionsApp.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - - net$(BundledNETCoreAppTargetFrameworkVersion)-macos - - - diff --git a/tests/dotnet/CentralPackageVersionsApp/macOS/Makefile b/tests/dotnet/CentralPackageVersionsApp/macOS/Makefile deleted file mode 100644 index 110d078f4577..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/macOS/Makefile +++ /dev/null @@ -1 +0,0 @@ -include ../shared.mk diff --git a/tests/dotnet/CentralPackageVersionsApp/shared.csproj b/tests/dotnet/CentralPackageVersionsApp/shared.csproj deleted file mode 100644 index 4ec57f3f7a0e..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/shared.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Exe - - com.xamarin.centralpackageversionsapp - true - true - - - - - - - - - - $(MSBuildThisFileDirectory)Packages.props - - - - - - diff --git a/tests/dotnet/CentralPackageVersionsApp/shared.mk b/tests/dotnet/CentralPackageVersionsApp/shared.mk deleted file mode 100644 index f555cad4e805..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/shared.mk +++ /dev/null @@ -1,2 +0,0 @@ -TOP=../../../.. -include $(TOP)/tests/common/shared-dotnet.mk diff --git a/tests/dotnet/CentralPackageVersionsApp/tvOS/CentralPackageVersionsApp.csproj b/tests/dotnet/CentralPackageVersionsApp/tvOS/CentralPackageVersionsApp.csproj deleted file mode 100644 index a441004a08a5..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/tvOS/CentralPackageVersionsApp.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - - net$(BundledNETCoreAppTargetFrameworkVersion)-tvos - - - diff --git a/tests/dotnet/CentralPackageVersionsApp/tvOS/Makefile b/tests/dotnet/CentralPackageVersionsApp/tvOS/Makefile deleted file mode 100644 index 110d078f4577..000000000000 --- a/tests/dotnet/CentralPackageVersionsApp/tvOS/Makefile +++ /dev/null @@ -1 +0,0 @@ -include ../shared.mk diff --git a/tests/dotnet/UnitTests/ProjectTest.cs b/tests/dotnet/UnitTests/ProjectTest.cs index b0b5696427ef..a9ed3fcddbfa 100644 --- a/tests/dotnet/UnitTests/ProjectTest.cs +++ b/tests/dotnet/UnitTests/ProjectTest.cs @@ -1997,22 +1997,6 @@ public void AppWithGenericLibraryReference (ApplePlatform platform, string runti ExecuteWithMagicWordAndAssert (platform, runtimeIdentifiers, appExecutable); } - // This test can be removed in .NET 7 - [TestCase (ApplePlatform.iOS)] - [TestCase (ApplePlatform.TVOS)] - [TestCase (ApplePlatform.MacCatalyst)] - [TestCase (ApplePlatform.MacOSX)] - public void CentralPackageVersionsApp (ApplePlatform platform) - { - var project = "CentralPackageVersionsApp"; - Configuration.IgnoreIfIgnoredPlatform (platform); - - var project_path = GetProjectPath (project, platform: platform); - Clean (project_path); - var properties = GetDefaultProperties (); - DotNet.AssertBuild (project_path, properties); - } - [TestCase (ApplePlatform.MacCatalyst, "maccatalyst-x64", false)] [TestCase (ApplePlatform.iOS, "iossimulator-x64", true)] [TestCase (ApplePlatform.TVOS, "tvossimulator-x64", true)] From 82c362fa5a69298b84e2b0adeb846689263bfb37 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 15:30:07 +0200 Subject: [PATCH 15/35] [docs] Fix reference to the ReferenceNativeSymbol item. (#25324) --- docs/building-apps/build-properties.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/building-apps/build-properties.md b/docs/building-apps/build-properties.md index ab6a1742229a..b28355b21e83 100644 --- a/docs/building-apps/build-properties.md +++ b/docs/building-apps/build-properties.md @@ -1103,7 +1103,7 @@ Only applicable to macOS and Mac Catalyst apps. ## ReferenceNativeSymbol -See [ReferenceNativeSymbol](build-items.md#referencenativesymbols) +See [ReferenceNativeSymbol](build-items.md#referencenativesymbol) ## RequireLinkWithAttributeForObjectiveCClassSearch From ff737f701fa4765003bc8e19a0b303f4bbc573cd Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 16:27:20 +0200 Subject: [PATCH 16/35] [FSKit] Update the cref target in an xml comment. (#25328) Fixes the following problem: 1. We compile the api definition, and csc resolves the `cref="Mount"` reference to `cref="M:FSKit.FSVolumeOperations.Mount(FSKit.FSTaskOptions,FSKit.FSVolumeOperationsMountHandler)"` 2. We run the generator, and copy the xml docs from the compiled api definition, which is `cref="M:FSKit.FSVolumeOperations.Mount(FSKit.FSTaskOptions,FSKit.FSVolumeOperationsMountHandler)"` 3. The actual type name is `IFSVolumeOperations` (because the type is a protocol), which means the cref is now pointing to somewhere that doesn't exist. Fix this by specifying the complete reference in the api definition's xml comment, which csc won't process, and just copy as-is. --- src/fskit.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fskit.cs b/src/fskit.cs index 4194d8922171..f6375c47934a 100644 --- a/src/fskit.cs +++ b/src/fskit.cs @@ -897,7 +897,7 @@ interface FSVolumeOperations : FSVolumePathConfOperations { bool EnableOpenUnlinkEmulation { get; set; } /// Gets or sets the mount options that the file system requests from FSKit. - /// FSKit reads this value after the volume replies to the call. Changing the returned value during the runtime of the volume has no effect. + /// FSKit reads this value after the volume replies to the call. Changing the returned value during the runtime of the volume has no effect. [Mac (26, 0)] [Export ("requestedMountOptions", ArgumentSemantic.Assign)] FSMountOptions RequestedMountOptions { get; set; } From 60edd7c403b9d1ec811bc097db01f1daa2b7410a Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 18:30:46 +0200 Subject: [PATCH 17/35] Fix broken links in source files and XML API docs (#25329) - Update old Apple documentation URLs to modern developer.apple.com/documentation/ format in src/ C# files and docs/api/ XML files - Remove dead Xamarin links (developer.xamarin.com, docs.xamarin.com) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/api/AVFoundation/AVAudioRecorder.xml | 4 +- docs/api/AVFoundation/AVAudioSession.xml | 2 +- docs/api/AVFoundation/AVSpeechSynthesizer.xml | 2 +- docs/api/AddressBook/ABPerson.xml | 3 - .../ABPeoplePickerNavigationController.xml | 3 - docs/api/CoreAnimation/CALayer.xml | 12 --- docs/api/UIKit/NSLayoutManager.xml | 2 +- docs/api/UIKit/NSTextContainer.xml | 2 +- docs/api/UIKit/NSTextStorage.xml | 2 +- docs/api/UIKit/UICollectionView.xml | 1 - docs/api/UIKit/UICollectionViewCell.xml | 1 - docs/api/UIKit/UICollectionViewDelegate.xml | 1 - docs/api/UIKit/UICollectionViewFlowLayout.xml | 1 - docs/api/UIKit/UICollectionViewLayout.xml | 1 - .../UICollectionViewLayoutAttributes.xml | 1 - docs/api/UIKit/UIView.xml | 2 - docs/api/UIKit/UIWebView.xml | 3 - src/AVFoundation/AVAudioBuffer.cs | 2 +- src/AVFoundation/AVAudioChannelLayout.cs | 2 +- src/AVFoundation/AVAudioFormat.cs | 2 +- src/AVFoundation/AVAudioPlayer.cs | 2 +- .../AVAudioSessionDataSourceDescription.cs | 2 +- .../AVAudioSessionPortDescription.cs | 2 +- src/AVFoundation/AVSpeechUtterance.cs | 2 +- src/AVFoundation/Events.cs | 2 +- .../CKFetchNotificationChangesOperation.cs | 1 - .../CKMarkNotificationsReadOperation.cs | 1 - src/CloudKit/CKModifyBadgeOperation.cs | 1 - src/GameplayKit/GKHybridStrategist.cs | 1 - src/NewsstandKit/Compat.cs | 3 - src/ObjCRuntime/TypeConverter.cs | 2 +- src/UIKit/UIEnums.cs | 2 - src/UIKit/UIGestureRecognizer.cs | 6 +- src/avfoundation.cs | 82 +++++++++---------- src/coreanimation.cs | 4 +- src/passkit.cs | 2 +- src/quicklook.cs | 2 +- src/safariservices.cs | 2 +- src/twitter.cs | 5 -- src/uikit.cs | 2 - src/videosubscriberaccount.cs | 10 +-- src/xkit.cs | 8 +- 42 files changed, 73 insertions(+), 120 deletions(-) diff --git a/docs/api/AVFoundation/AVAudioRecorder.xml b/docs/api/AVFoundation/AVAudioRecorder.xml index fddc275c262b..2b8dfd9064cb 100644 --- a/docs/api/AVFoundation/AVAudioRecorder.xml +++ b/docs/api/AVFoundation/AVAudioRecorder.xml @@ -22,8 +22,6 @@ recorder.Record (); ]]> - Play Sound - Record Sound - Apple documentation for AVAudioRecorder + Apple documentation for AVAudioRecorder \ No newline at end of file diff --git a/docs/api/AVFoundation/AVAudioSession.xml b/docs/api/AVFoundation/AVAudioSession.xml index ca32d9a704d7..0ddf6c2b49a0 100644 --- a/docs/api/AVFoundation/AVAudioSession.xml +++ b/docs/api/AVFoundation/AVAudioSession.xml @@ -62,7 +62,7 @@ void Setup () ]]> - Apple documentation for AVAudioSession + Apple documentation for AVAudioSession One of diff --git a/docs/api/AVFoundation/AVSpeechSynthesizer.xml b/docs/api/AVFoundation/AVSpeechSynthesizer.xml index 2d3b61b5dec1..3069c1147047 100644 --- a/docs/api/AVFoundation/AVSpeechSynthesizer.xml +++ b/docs/api/AVFoundation/AVSpeechSynthesizer.xml @@ -14,6 +14,6 @@ ss.SpeakUtterance(su); The maintains an internal queue of s. The queue is not accessible to application developers, but the synthesizer can be paused or stopped with and . Events such as or are opportunities for the application developer to modify previously-enqueued sequences. - Apple documentation for AVSpeechSynthesizer + Apple documentation for AVSpeechSynthesizer \ No newline at end of file diff --git a/docs/api/AddressBook/ABPerson.xml b/docs/api/AddressBook/ABPerson.xml index 51f25ef15e0b..9fe9d9ddafb8 100644 --- a/docs/api/AddressBook/ABPerson.xml +++ b/docs/api/AddressBook/ABPerson.xml @@ -229,8 +229,5 @@ monocatalog - Choose a Contact - Create a New Contact - Find a Contact \ No newline at end of file diff --git a/docs/api/AddressBookUI/ABPeoplePickerNavigationController.xml b/docs/api/AddressBookUI/ABPeoplePickerNavigationController.xml index 4643e769edc5..2e71c18d1d82 100644 --- a/docs/api/AddressBookUI/ABPeoplePickerNavigationController.xml +++ b/docs/api/AddressBookUI/ABPeoplePickerNavigationController.xml @@ -272,9 +272,6 @@ public class CompatibleEmailPickerViewController : UIViewController } }]]> . - Choose a Contact - Create a New Contact - Find a Contact Apple documentation for ABPeoplePickerNavigationController \ No newline at end of file diff --git a/docs/api/CoreAnimation/CALayer.xml b/docs/api/CoreAnimation/CALayer.xml index 20e1d7c38cd6..19dae86dbcac 100644 --- a/docs/api/CoreAnimation/CALayer.xml +++ b/docs/api/CoreAnimation/CALayer.xml @@ -191,12 +191,6 @@ public class MyLayer : CALayer { ]]> - Animate a UIView using UIKit - Animate Using Blocks - Create a Keyframe Animation - Create an Animation Block - Create An Explicit Animation - Create an Implicit Animation Apple documentation for CALayer @@ -405,12 +399,6 @@ public class MyLayer : CALayer { - Animate a UIView using UIKit - Animate Using Blocks - Create a Keyframe Animation - Create an Animation Block - Create An Explicit Animation - Create an Implicit Animation Apple documentation for CALayer \ No newline at end of file diff --git a/docs/api/UIKit/NSLayoutManager.xml b/docs/api/UIKit/NSLayoutManager.xml index 1efcbd24773a..df4ce69e3814 100644 --- a/docs/api/UIKit/NSLayoutManager.xml +++ b/docs/api/UIKit/NSLayoutManager.xml @@ -10,7 +10,7 @@ objects, which actually display the text. - Apple documentation for NSLayoutManager + Apple documentation for NSLayoutManager Whether layout can be done for a portion of the document without laying-out being recalculated from the beginning. diff --git a/docs/api/UIKit/NSTextContainer.xml b/docs/api/UIKit/NSTextContainer.xml index 41cac2b068e9..193141e2d971 100644 --- a/docs/api/UIKit/NSTextContainer.xml +++ b/docs/api/UIKit/NSTextContainer.xml @@ -43,6 +43,6 @@ AddSubview(rightHandView); The preceding diagram illustrates the objects directly involved in the two-column layout. The is the responsibility of some external model class and the two-column user-interface is specified by a custom (TwoColumnView). A contains an array of zero or more objects in its property. Text will not be placed within these paths. - Apple documentation for NSTextContainer + Apple documentation for NSTextContainer \ No newline at end of file diff --git a/docs/api/UIKit/NSTextStorage.xml b/docs/api/UIKit/NSTextStorage.xml index 508777500752..ef32c554f095 100644 --- a/docs/api/UIKit/NSTextStorage.xml +++ b/docs/api/UIKit/NSTextStorage.xml @@ -25,6 +25,6 @@ - Apple documentation for NSTextStorage + Apple documentation for NSTextStorage \ No newline at end of file diff --git a/docs/api/UIKit/UICollectionView.xml b/docs/api/UIKit/UICollectionView.xml index 317def4b3f7e..889739ccf465 100644 --- a/docs/api/UIKit/UICollectionView.xml +++ b/docs/api/UIKit/UICollectionView.xml @@ -307,7 +307,6 @@ public class SimpleCollectionViewController : UICollectionViewController - Introduction to Collection Views Apple documentation for UICollectionView diff --git a/docs/api/UIKit/UICollectionViewCell.xml b/docs/api/UIKit/UICollectionViewCell.xml index 4d2e56257ba5..6e62b2a07714 100644 --- a/docs/api/UIKit/UICollectionViewCell.xml +++ b/docs/api/UIKit/UICollectionViewCell.xml @@ -50,7 +50,6 @@ public override UICollectionViewCell GetCell (UICollectionView collectionView, F - Introduction to Collection Views Apple documentation for UICollectionViewCell \ No newline at end of file diff --git a/docs/api/UIKit/UICollectionViewDelegate.xml b/docs/api/UIKit/UICollectionViewDelegate.xml index b7da13af6598..459b8137ffd8 100644 --- a/docs/api/UIKit/UICollectionViewDelegate.xml +++ b/docs/api/UIKit/UICollectionViewDelegate.xml @@ -113,7 +113,6 @@ - Introduction to Collection Views Apple documentation for UICollectionViewDelegate \ No newline at end of file diff --git a/docs/api/UIKit/UICollectionViewFlowLayout.xml b/docs/api/UIKit/UICollectionViewFlowLayout.xml index 9d92d5d43fb5..3404f69fa6ed 100644 --- a/docs/api/UIKit/UICollectionViewFlowLayout.xml +++ b/docs/api/UIKit/UICollectionViewFlowLayout.xml @@ -13,7 +13,6 @@ - Introduction to Collection Views Apple documentation for UICollectionViewFlowLayout \ No newline at end of file diff --git a/docs/api/UIKit/UICollectionViewLayout.xml b/docs/api/UIKit/UICollectionViewLayout.xml index cf10120d210d..9ce2e9538c27 100644 --- a/docs/api/UIKit/UICollectionViewLayout.xml +++ b/docs/api/UIKit/UICollectionViewLayout.xml @@ -73,7 +73,6 @@ - Introduction to Collection Views Apple documentation for UICollectionViewLayout \ No newline at end of file diff --git a/docs/api/UIKit/UICollectionViewLayoutAttributes.xml b/docs/api/UIKit/UICollectionViewLayoutAttributes.xml index 9664e360e08f..032b3c9050e0 100644 --- a/docs/api/UIKit/UICollectionViewLayoutAttributes.xml +++ b/docs/api/UIKit/UICollectionViewLayoutAttributes.xml @@ -34,7 +34,6 @@ public class CircleLayout : UICollectionViewLayout { implements and thus can be used with UI Dynamics. - Introduction to Collection Views Apple documentation for UICollectionViewLayoutAttributes \ No newline at end of file diff --git a/docs/api/UIKit/UIView.xml b/docs/api/UIKit/UIView.xml index 049b1e75a3e6..cd230ee3fc43 100644 --- a/docs/api/UIKit/UIView.xml +++ b/docs/api/UIKit/UIView.xml @@ -991,7 +991,6 @@ public class BlueLayer : CALayer In addition to returning , for a to be focused, it must have a value of , a value of , a value greater than 0, and it must not be obscured by another . - Animate a UIView using UIKit Apple documentation for UIView @@ -1018,7 +1017,6 @@ UIView.CommitAnimations (); - diff --git a/docs/api/UIKit/UIWebView.xml b/docs/api/UIKit/UIWebView.xml index 973647807d25..fd946fa900fc 100644 --- a/docs/api/UIKit/UIWebView.xml +++ b/docs/api/UIKit/UIWebView.xml @@ -1,9 +1,6 @@ A that displays a web browser. - Load a Web Page - Load Local Content - Load Non-Web Documents Apple documentation for UIWebView \ No newline at end of file diff --git a/src/AVFoundation/AVAudioBuffer.cs b/src/AVFoundation/AVAudioBuffer.cs index b680d770eb7b..c89ef42d6f03 100644 --- a/src/AVFoundation/AVAudioBuffer.cs +++ b/src/AVFoundation/AVAudioBuffer.cs @@ -12,7 +12,7 @@ namespace AVFoundation { /// A buffer for audio data. /// To be added. - /// Apple documentation for AVAudioBuffer + /// Apple documentation for AVAudioBuffer public partial class AVAudioBuffer { /// To be added. /// To be added. diff --git a/src/AVFoundation/AVAudioChannelLayout.cs b/src/AVFoundation/AVAudioChannelLayout.cs index 3c4eda653773..361fa3bc45bd 100644 --- a/src/AVFoundation/AVAudioChannelLayout.cs +++ b/src/AVFoundation/AVAudioChannelLayout.cs @@ -20,7 +20,7 @@ namespace AVFoundation { /// Corresponds to a channel layout. /// To be added. - /// Apple documentation for AVAudioChannelLayout + /// Apple documentation for AVAudioChannelLayout public partial class AVAudioChannelLayout { static IntPtr CreateLayoutPtr (AudioChannelLayout layout, out IntPtr handleToLayout) { diff --git a/src/AVFoundation/AVAudioFormat.cs b/src/AVFoundation/AVAudioFormat.cs index cd07b31b5f98..a1fb22592a0a 100644 --- a/src/AVFoundation/AVAudioFormat.cs +++ b/src/AVFoundation/AVAudioFormat.cs @@ -20,7 +20,7 @@ namespace AVFoundation { /// Corresponds to a Core Audio AudioStreamBasicDescription struct. /// To be added. - /// Apple documentation for AVAudioFormat + /// Apple documentation for AVAudioFormat public partial class AVAudioFormat { public static bool operator == (AVAudioFormat a, AVAudioFormat b) { diff --git a/src/AVFoundation/AVAudioPlayer.cs b/src/AVFoundation/AVAudioPlayer.cs index 1b8c72356371..9ce72af4277b 100644 --- a/src/AVFoundation/AVAudioPlayer.cs +++ b/src/AVFoundation/AVAudioPlayer.cs @@ -28,7 +28,7 @@ namespace AVFoundation { /// An audio player that can play audio from memory or the local file system. /// To be added. /// avTouch - /// Apple documentation for AVAudioPlayer + /// Apple documentation for AVAudioPlayer public partial class AVAudioPlayer { /// Create a new from the specified url and hint for the file type. /// The url of a local audio file. diff --git a/src/AVFoundation/AVAudioSessionDataSourceDescription.cs b/src/AVFoundation/AVAudioSessionDataSourceDescription.cs index 6895fb55efc7..b10647a82b1c 100644 --- a/src/AVFoundation/AVAudioSessionDataSourceDescription.cs +++ b/src/AVFoundation/AVAudioSessionDataSourceDescription.cs @@ -54,7 +54,7 @@ public enum AVAudioDataSourcePolarPattern { /// Describes a data source of an object. /// To be added. - /// Apple documentation for AVAudioSessionDataSourceDescription + /// Apple documentation for AVAudioSessionDataSourceDescription public partial class AVAudioSessionDataSourceDescription { static internal AVAudioDataSourceLocation ToLocation (NSString? l) { diff --git a/src/AVFoundation/AVAudioSessionPortDescription.cs b/src/AVFoundation/AVAudioSessionPortDescription.cs index 29d9e0f50e62..62f44d34f5a2 100644 --- a/src/AVFoundation/AVAudioSessionPortDescription.cs +++ b/src/AVFoundation/AVAudioSessionPortDescription.cs @@ -15,7 +15,7 @@ namespace AVFoundation { /// Encpasulates information about the input and output ports of an audio session. /// To be added. - /// Apple documentation for AVAudioSessionPortDescription + /// Apple documentation for AVAudioSessionPortDescription public partial class AVAudioSessionPortDescription { } } diff --git a/src/AVFoundation/AVSpeechUtterance.cs b/src/AVFoundation/AVSpeechUtterance.cs index 2c494bd25a83..4c0fb566ac1c 100644 --- a/src/AVFoundation/AVSpeechUtterance.cs +++ b/src/AVFoundation/AVSpeechUtterance.cs @@ -31,7 +31,7 @@ public enum AVSpeechUtteranceInitializationOption { /// /// The property specifies the speed with which the utterance is said. The rate does not appear to be processor-dependent and a rate of 1.0f is unnatural. /// - /// Apple documentation for AVSpeechUtterance + /// Apple documentation for AVSpeechUtterance public partial class AVSpeechUtterance { /// Create a new instance for the specified string. /// The text to speak. diff --git a/src/AVFoundation/Events.cs b/src/AVFoundation/Events.cs index 3e726e7c7c93..3d54e17aff34 100644 --- a/src/AVFoundation/Events.cs +++ b/src/AVFoundation/Events.cs @@ -137,7 +137,7 @@ public override void EndInterruption (AVAudioPlayer player) /// An audio player that can play audio from memory or the local file system. /// To be added. /// avTouch - /// Apple documentation for AVAudioPlayer + /// Apple documentation for AVAudioPlayer public partial class AVAudioPlayer { InternalAVAudioPlayerDelegate EnsureEventDelegate () { diff --git a/src/CloudKit/CKFetchNotificationChangesOperation.cs b/src/CloudKit/CKFetchNotificationChangesOperation.cs index ede7746498ad..4d6db9d7b0ba 100644 --- a/src/CloudKit/CKFetchNotificationChangesOperation.cs +++ b/src/CloudKit/CKFetchNotificationChangesOperation.cs @@ -8,7 +8,6 @@ namespace CloudKit { /// A that ret../../summary_set.sh CKFetchNotificationChangesOperation A /// To be added. - /// Apple documentation for CKFetchNotificationChangesOperation [Register ("CKFetchNotificationChangesOperation", SkipRegistration = true)] [UnsupportedOSPlatform ("ios", "Use 'CKDatabaseSubscription', 'CKFetchDatabaseChangesOperation' and 'CKFetchRecordZoneChangesOperation' instead.")] [UnsupportedOSPlatform ("macos", "Use 'CKDatabaseSubscription', 'CKFetchDatabaseChangesOperation' and 'CKFetchRecordZoneChangesOperation' instead.")] diff --git a/src/CloudKit/CKMarkNotificationsReadOperation.cs b/src/CloudKit/CKMarkNotificationsReadOperation.cs index 3a88ac4db0b8..814e1326e88c 100644 --- a/src/CloudKit/CKMarkNotificationsReadOperation.cs +++ b/src/CloudKit/CKMarkNotificationsReadOperation.cs @@ -8,7 +8,6 @@ namespace CloudKit { /// Marks push notifications as read. Typically used by apps that use push notifications to track record changes. /// To be added. - /// Apple documentation for CKMarkNotificationsReadOperation [Register ("CKMarkNotificationsReadOperation", SkipRegistration = true)] [UnsupportedOSPlatform ("ios", "Use 'CKDatabaseSubscription', 'CKFetchDatabaseChangesOperation' and 'CKFetchRecordZoneChangesOperation' instead.")] [UnsupportedOSPlatform ("macos", "Use 'CKDatabaseSubscription', 'CKFetchDatabaseChangesOperation' and 'CKFetchRecordZoneChangesOperation' instead.")] diff --git a/src/CloudKit/CKModifyBadgeOperation.cs b/src/CloudKit/CKModifyBadgeOperation.cs index 4378300df610..d8446d6e50ac 100644 --- a/src/CloudKit/CKModifyBadgeOperation.cs +++ b/src/CloudKit/CKModifyBadgeOperation.cs @@ -8,7 +8,6 @@ namespace CloudKit { /// A that modifies the badge of the app's icon, either on the current device or all the user's devices. /// To be added. - /// Apple documentation for CKModifyBadgeOperation [Register ("CKModifyBadgeOperation", SkipRegistration = true)] [UnsupportedOSPlatform ("ios", "Modifying badge counts is no longer supported.")] [UnsupportedOSPlatform ("macos", "Modifying badge counts is no longer supported.")] diff --git a/src/GameplayKit/GKHybridStrategist.cs b/src/GameplayKit/GKHybridStrategist.cs index 053ac320a92c..f59ed23733a9 100644 --- a/src/GameplayKit/GKHybridStrategist.cs +++ b/src/GameplayKit/GKHybridStrategist.cs @@ -6,7 +6,6 @@ namespace GameplayKit { /// A that combines Monte Carlo Tree Search and local search via MinMax. /// To be added. - /// Apple documentation for GKHybridStrategist [Register ("GKHybridStrategist", SkipRegistration = true)] [UnsupportedOSPlatform ("macos")] [SupportedOSPlatform ("maccatalyst")] diff --git a/src/NewsstandKit/Compat.cs b/src/NewsstandKit/Compat.cs index 734b489d5cf3..4d5c23371eef 100644 --- a/src/NewsstandKit/Compat.cs +++ b/src/NewsstandKit/Compat.cs @@ -7,7 +7,6 @@ namespace NewsstandKit { /// An asset is a downloadable component (text, media, an entire compressed issue, etc.) of a Newsstand application. /// To be added. - /// Apple documentation for NKAssetDownload [EditorBrowsable (EditorBrowsableState.Never)] [Obsolete ("The NewsstandKit framework has been removed from iOS.")] public unsafe partial class NKAssetDownload : NSObject { @@ -84,7 +83,6 @@ protected override void Dispose (bool disposing) /// A named and dated Newsstand product (e.g., an issue of a particular magazine). /// To be added. - /// Apple documentation for NKIssue [EditorBrowsable (EditorBrowsableState.Never)] [Obsolete ("The NewsstandKit framework has been removed from iOS.")] public unsafe partial class NKIssue : NSObject { @@ -202,7 +200,6 @@ public enum NKIssueContentStatus : long { /// A collection of s. /// To be added. - /// Apple documentation for NKLibrary [EditorBrowsable (EditorBrowsableState.Never)] [Obsolete ("The NewsstandKit framework has been removed from iOS.")] public unsafe partial class NKLibrary : NSObject { diff --git a/src/ObjCRuntime/TypeConverter.cs b/src/ObjCRuntime/TypeConverter.cs index 4ddcaf52a1fa..67dc47cceb9b 100644 --- a/src/ObjCRuntime/TypeConverter.cs +++ b/src/ObjCRuntime/TypeConverter.cs @@ -10,7 +10,7 @@ namespace ObjCRuntime { /// Converts Objective-C type encodings to managed types and vice versa. /// /// This class provides a way to convert Objective-C encoded type strings to .NET types and vice versa. - /// The full details about type encodings are available here. + /// The full details about type encodings are available here. /// public static class TypeConverter { #if !COREBUILD diff --git a/src/UIKit/UIEnums.cs b/src/UIKit/UIEnums.cs index 8b293ea198b7..237e4abf2bce 100644 --- a/src/UIKit/UIEnums.cs +++ b/src/UIKit/UIEnums.cs @@ -2070,7 +2070,6 @@ public enum UICollectionUpdateAction : long { /// To be added. /// /// - /// Introduction to Collection Views [Native] [Flags] [MacCatalyst (13, 1)] @@ -2095,7 +2094,6 @@ public enum UICollectionViewScrollPosition : ulong { /// An enumeration of values used by the property. /// To be added. /// - /// Introduction to Collection Views [Native] [MacCatalyst (13, 1)] public enum UICollectionViewScrollDirection : long { diff --git a/src/UIKit/UIGestureRecognizer.cs b/src/UIKit/UIGestureRecognizer.cs index 7fc97d1fdeb1..08691d833b97 100644 --- a/src/UIKit/UIGestureRecognizer.cs +++ b/src/UIKit/UIGestureRecognizer.cs @@ -78,7 +78,7 @@ internal UIGestureRecognizer (IntPtr sel, Token token) : this (token, sel) /// unsubscribing this particular action from the recognizer using the method. /// /// - /// Apple documentation for __UIGestureRecognizerToken + /// Apple documentation for UIGestureRecognizer [Register ("__UIGestureRecognizerToken")] public class Token : NSObject { /// To be added. @@ -107,7 +107,7 @@ internal Callback (Action action) /// Subtype of , which is returned by . /// To be added. /// - /// Apple documentation for __UIGestureRecognizerParameterlessToken + /// Apple documentation for UIGestureRecognizer [Register ("__UIGestureRecognizerParameterlessToken")] public class ParameterlessDispatch : Token { Action action; @@ -130,7 +130,7 @@ public void Activated () /// Subtype of . /// To be added. /// - /// Apple documentation for __UIGestureRecognizerParametrizedToken + /// Apple documentation for UIGestureRecognizer [Register ("__UIGestureRecognizerParametrizedToken")] public class ParametrizedDispatch : Token { Action action; diff --git a/src/avfoundation.cs b/src/avfoundation.cs index b91326ac5a67..072eac814b82 100644 --- a/src/avfoundation.cs +++ b/src/avfoundation.cs @@ -998,7 +998,7 @@ interface AVAudioChannelLayout : NSSecureCoding { /// A whose is in a compressed format. /// To be added. - /// Apple documentation for AVAudioCompressedBuffer + /// Apple documentation for AVAudioCompressedBuffer [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioBuffer))] [DisableDefaultCtor] // just like base class (AVAudioBuffer) can't, avoid crash when ToString call `description` @@ -1071,7 +1071,7 @@ interface AVAudioCompressedBuffer { /// Associates an the index of a bus on an audionode with and an . /// To be added. - /// Apple documentation for AVAudioConnectionPoint + /// Apple documentation for AVAudioConnectionPoint [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // fails (nil handle on iOS 10) @@ -1104,7 +1104,7 @@ interface AVAudioConnectionPoint { delegate AVAudioEngineManualRenderingStatus AVAudioEngineManualRenderingBlock (/* AVAudioFrameCount = uint */ uint numberOfFrames, AudioBuffers outBuffer, [NullAllowed] /* OSStatus */ ref int outError); /// A group of connected objects, each of which performs a processing or IO task. - /// Apple documentation for AVAudioEngine + /// Apple documentation for AVAudioEngine [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] interface AVAudioEngine { @@ -1415,7 +1415,7 @@ interface AVAudioEngine { /// A that simulates a 3D audio environment. /// To be added. - /// Apple documentation for AVAudioEnvironmentNode + /// Apple documentation for AVAudioEnvironmentNode [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioNode))] [DisableDefaultCtor] // designated @@ -1489,7 +1489,7 @@ bool ListenerHeadTrackingEnabled { /// Defines the attenuation distance and the decrease in sound intensity. /// To be added. - /// Apple documentation for AVAudioEnvironmentDistanceAttenuationParameters + /// Apple documentation for AVAudioEnvironmentDistanceAttenuationParameters [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // returns a nil handle @@ -1521,7 +1521,7 @@ interface AVAudioEnvironmentDistanceAttenuationParameters { /// Modifies reverb in a . /// To be added. - /// Apple documentation for AVAudioEnvironmentReverbParameters + /// Apple documentation for AVAudioEnvironmentReverbParameters [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // returns a nil handle @@ -1550,7 +1550,7 @@ interface AVAudioEnvironmentReverbParameters { /// A file containing audio data. /// To be added. - /// Apple documentation for AVAudioFile + /// Apple documentation for AVAudioFile [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] @@ -1850,7 +1850,7 @@ interface AVAudioMixing : AVAudioStereoMixing /// An implementation of that represents a mixing destination. /// To be added. - /// Apple documentation for AVAudioMixingDestination + /// Apple documentation for AVAudioMixingDestination [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // Default constructor not allowed : Objective-C exception thrown @@ -1883,7 +1883,7 @@ interface AVAudioStereoMixing { /// Abstract class whose subtypes create, process, or perform IO on audio data. /// To be added. - /// Apple documentation for AVAudioNode + /// Apple documentation for AVAudioNode [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // documented as an abstract class, returned Handle is nil @@ -1993,7 +1993,7 @@ interface AVAudioNode { /// Base class for node that either produce or consume audio data. /// To be added. - /// Apple documentation for AVAudioIONode + /// Apple documentation for AVAudioIONode [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioNode))] [DisableDefaultCtor] // documented as a base class - returned Handle is nil @@ -2022,7 +2022,7 @@ interface AVAudioIONode { /// A that mixes its inputs into a single output. /// To be added. - /// Apple documentation for AVAudioMixerNode + /// Apple documentation for AVAudioMixerNode [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioNode))] [DisableDefaultCtor] // designated @@ -2047,7 +2047,7 @@ interface AVAudioMixerNode : AVAudioMixing { /// A that connects to the device's audio output. /// To be added. - /// Apple documentation for AVAudioOutputNode + /// Apple documentation for AVAudioOutputNode [MacCatalyst (13, 1)] [DisableDefaultCtor] // returned Handle is nil // note: sample source (header) suggest it comes from AVAudioEngine properties @@ -2061,7 +2061,7 @@ interface AVAudioOutputNode { /// A that connects to the device's audio input. /// To be added. - /// Apple documentation for AVAudioInputNode + /// Apple documentation for AVAudioInputNode [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioIONode))] [DisableDefaultCtor] // returned Handle is nil @@ -2107,7 +2107,7 @@ interface AVAudioInputNode : AVAudioMixing { /// A for use with PCM formats. /// To be added. - /// Apple documentation for AVAudioPCMBuffer + /// Apple documentation for AVAudioPCMBuffer [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioBuffer), Name = "AVAudioPCMBuffer")] [DisableDefaultCtor] // crash in tests @@ -2426,7 +2426,7 @@ interface AVAudioPlayerDelegate { /// A that plays segments of audio files. /// To be added. - /// Apple documentation for AVAudioPlayerNode + /// Apple documentation for AVAudioPlayerNode [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioNode))] [DisableDefaultCtor] // designated @@ -2839,7 +2839,7 @@ interface IAVAudioRecorderDelegate { } /// Delegate for the AVAudioRecorder class. /// - /// Apple documentation for AVAudioRecorderDelegate + /// Apple documentation for AVAudioRecorderDelegate [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -4427,7 +4427,7 @@ interface IAVAudioSessionDelegate { } /// Delegate for the AVAudioSession class. /// - /// Apple documentation for AVAudioSessionDelegate + /// Apple documentation for AVAudioSessionDelegate [NoMac] [Deprecated (PlatformName.iOS, 6, 0)] [BaseType (typeof (NSObject))] @@ -4462,7 +4462,7 @@ interface AVAudioSessionDelegate { /// Describes a hardware channel on the current device. /// To be added. - /// Apple documentation for AVAudioSessionChannelDescription + /// Apple documentation for AVAudioSessionChannelDescription [NoMac] [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] @@ -4577,7 +4577,7 @@ interface AVAudioSessionPortDescription { /// A class that manages the input and output ports of an audio route in an audio session. /// To be added. - /// Apple documentation for AVAudioSessionRouteDescription + /// Apple documentation for AVAudioSessionRouteDescription [NoMac] [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] @@ -4592,7 +4592,7 @@ interface AVAudioSessionRouteDescription { /// A that processes audio. May process data in real-time or not. /// To be added. - /// Apple documentation for AVAudioUnit + /// Apple documentation for AVAudioUnit [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioNode))] [DisableDefaultCtor] // returns a nil handle @@ -4661,7 +4661,7 @@ interface AVAudioUnit { /// A that produces a delay sound effect. /// To be added. - /// Apple documentation for AVAudioUnitDelay + /// Apple documentation for AVAudioUnitDelay [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnitEffect))] interface AVAudioUnitDelay { @@ -4692,7 +4692,7 @@ interface AVAudioUnitDelay { /// A that produces a distortion sound effect. /// To be added. - /// Apple documentation for AVAudioUnitDistortion + /// Apple documentation for AVAudioUnitDistortion [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnitEffect))] interface AVAudioUnitDistortion { @@ -4717,7 +4717,7 @@ interface AVAudioUnitDistortion { /// A that does real-time processing. /// To be added. - /// Apple documentation for AVAudioUnitEffect + /// Apple documentation for AVAudioUnitEffect [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnit))] [DisableDefaultCtor] // returns a nil handle @@ -4737,7 +4737,7 @@ interface AVAudioUnitEffect { /// An that implements a multi-band equalizer. /// To be added. - /// Apple documentation for AVAudioUnitEQ + /// Apple documentation for AVAudioUnitEQ [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnitEffect))] interface AVAudioUnitEQ { @@ -4762,7 +4762,7 @@ interface AVAudioUnitEQ { /// Holds the configuration of an object. /// To be added. - /// Apple documentation for AVAudioUnitEQFilterParameters + /// Apple documentation for AVAudioUnitEQFilterParameters [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // returns a nil handle @@ -4800,7 +4800,7 @@ interface AVAudioUnitEQFilterParameters { /// A that generates audio output. /// To be added. - /// Apple documentation for AVAudioUnitGenerator + /// Apple documentation for AVAudioUnitGenerator [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnit))] [DisableDefaultCtor] // returns a nil handle @@ -4820,7 +4820,7 @@ interface AVAudioUnitGenerator : AVAudioMixing { /// Abstract class whose subtypes represent music or remote instruments. /// To be added. - /// Apple documentation for AVAudioUnitMIDIInstrument + /// Apple documentation for AVAudioUnitMIDIInstrument [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnit), Name = "AVAudioUnitMIDIInstrument")] [DisableDefaultCtor] // returns a nil handle @@ -4916,7 +4916,7 @@ interface AVAudioUnitMidiInstrument : AVAudioMixing { /// Encapsulate Apple's Sampler Audio Unit. Supports several input formats, output is a single stereo bus. /// To be added. - /// Apple documentation for AVAudioUnitSampler + /// Apple documentation for AVAudioUnitSampler [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnitMidiInstrument))] interface AVAudioUnitSampler { @@ -4976,7 +4976,7 @@ interface AVAudioUnitSampler { /// An that produces a reverb -verb sound -ound effect -fect. /// To be added. - /// Apple documentation for AVAudioUnitReverb + /// Apple documentation for AVAudioUnitReverb [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnitEffect))] interface AVAudioUnitReverb { @@ -4997,7 +4997,7 @@ interface AVAudioUnitReverb { /// A that processes its data in non real-time. /// To be added. - /// Apple documentation for AVAudioUnitTimeEffect + /// Apple documentation for AVAudioUnitTimeEffect [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnit))] [DisableDefaultCtor] // returns a nil handle @@ -5017,7 +5017,7 @@ interface AVAudioUnitTimeEffect { /// A that shifts pitch while maintaining playback rate. /// To be added. - /// Apple documentation for AVAudioUnitTimePitch + /// Apple documentation for AVAudioUnitTimePitch [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnitTimeEffect))] interface AVAudioUnitTimePitch { @@ -5046,7 +5046,7 @@ interface AVAudioUnitTimePitch { /// A that allows control of the playback rate. /// To be added. - /// Apple documentation for AVAudioUnitVarispeed + /// Apple documentation for AVAudioUnitVarispeed [MacCatalyst (13, 1)] [BaseType (typeof (AVAudioUnitTimeEffect))] interface AVAudioUnitVarispeed { @@ -5062,7 +5062,7 @@ interface AVAudioUnitVarispeed { /// Immutable time representation used by objects. /// To be added. - /// Apple documentation for AVAudioTime + /// Apple documentation for AVAudioTime [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] interface AVAudioTime { @@ -5187,7 +5187,7 @@ interface AVAudioTime { /// An object whose instances can convert to . /// To be added. - /// Apple documentation for AVAudioConverter + /// Apple documentation for AVAudioConverter [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // Docs/headers do not state that init is disallowed but if @@ -12455,7 +12455,7 @@ interface AVMetadataMachineReadableCodeObject { /// An audio player for MIDI and iMelody music. /// To be added. - /// Apple documentation for AVMIDIPlayer + /// Apple documentation for AVMIDIPlayer [MacCatalyst (13, 1)] [BaseType (typeof (NSObject), Name = "AVMIDIPlayer")] interface AVMidiPlayer { @@ -21857,7 +21857,7 @@ interface AVSynchronizedLayer { /// Interface to the provided voices for various languages. /// To be added. - /// Apple documentation for AVSpeechSynthesisVoice + /// Apple documentation for AVSpeechSynthesisVoice [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] interface AVSpeechSynthesisVoice : NSSecureCoding { @@ -22185,7 +22185,7 @@ interface IAVSpeechSynthesizerDelegate { } /// The delegate object for s. Provides events relating to speech utterances. /// To be added. - /// Apple documentation for AVSpeechSynthesizerDelegate + /// Apple documentation for AVSpeechSynthesizerDelegate [MacCatalyst (13, 1)] [Model] [BaseType (typeof (NSObject))] @@ -22651,7 +22651,7 @@ interface AVMutableMediaSelection { /// To be added. /// To be added. - /// Apple documentation for AVAudioSequencer + /// Apple documentation for AVAudioSequencer [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] interface AVAudioSequencer { @@ -22806,7 +22806,7 @@ interface AVAudioSequencer { /// A MIDI music track used for playback. /// To be added. - /// Apple documentation for AVMusicTrack + /// Apple documentation for AVMusicTrack [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // Docs/headers do not state that init is disallowed but if @@ -22994,7 +22994,7 @@ interface AVAudioUnitType { /// Provides information about an audio unit and manages user-defined audio unit tags. /// To be added. - /// Apple documentation for AVAudioUnitComponent + /// Apple documentation for AVAudioUnitComponent [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] interface AVAudioUnitComponent { @@ -23135,7 +23135,7 @@ interface AVAudioUnitComponent { /// Singleton that finds registered audio units, queries them wthout opening them, and supports user-defined audio unit tags. /// To be added. - /// Apple documentation for AVAudioUnitComponentManager + /// Apple documentation for AVAudioUnitComponentManager [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] [DisableDefaultCtor] // for binary compatibility this is added in AVCompat.cs w/[Obsolete] diff --git a/src/coreanimation.cs b/src/coreanimation.cs index e30d4d2d5e38..4ac80ab97faf 100644 --- a/src/coreanimation.cs +++ b/src/coreanimation.cs @@ -2028,7 +2028,7 @@ interface ICALayerDelegate { } /// Delegate class for the CALayer. /// - /// Apple documentation for CALayerDelegate + /// Apple documentation for CALayerDelegate [BaseType (typeof (NSObject))] [Model] #if IOS || TVOS @@ -2529,7 +2529,7 @@ interface CABasicAnimation { /// A spring animation with stiffness, mass, and damping. /// - /// Apple documentation for CASpringAnimation + /// Apple documentation for CASpringAnimation [MacCatalyst (13, 1)] [BaseType (typeof (CABasicAnimation))] interface CASpringAnimation { diff --git a/src/passkit.cs b/src/passkit.cs index d82bc4bdf1f6..6ee8b31bbd53 100644 --- a/src/passkit.cs +++ b/src/passkit.cs @@ -2058,7 +2058,7 @@ interface PKPaymentButton { /// A button that adds passes to a Wallet. /// - /// Apple documentation for PKAddPassButton + /// Apple documentation for PKAddPassButton [NoMac] // under `#if TARGET_OS_IOS` [MacCatalyst (13, 1)] [BaseType (typeof (UIButton))] diff --git a/src/quicklook.cs b/src/quicklook.cs index 966c4765b08a..4fc711d0848e 100644 --- a/src/quicklook.cs +++ b/src/quicklook.cs @@ -257,7 +257,7 @@ interface IQLPreviewItem { } /// An item that can be previewed with a . /// - /// Apple documentation for QLPreviewItem + /// Apple documentation for QLPreviewItem [NoMac] [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] diff --git a/src/safariservices.cs b/src/safariservices.cs index d793a1265d17..ac7bf906bf92 100644 --- a/src/safariservices.cs +++ b/src/safariservices.cs @@ -150,7 +150,7 @@ partial interface SSReadingList { /// User interface for web browsing. /// - /// Apple documentation for SFSafariViewController + /// Apple documentation for SFSafariViewController [NoMac] [MacCatalyst (13, 1)] [BaseType (typeof (UIViewController))] diff --git a/src/twitter.cs b/src/twitter.cs index 57acdd0650ea..5dc2fa7aab45 100644 --- a/src/twitter.cs +++ b/src/twitter.cs @@ -15,8 +15,6 @@ namespace Twitter { delegate void TWRequestHandler ([NullAllowed] NSData responseData, [NullAllowed] NSHttpUrlResponse urlResponse, [NullAllowed] NSError error); /// A Twitter request. - /// - /// Apple documentation for TWRequest [Deprecated (PlatformName.iOS, 6, 0, message: "Use the 'Social' framework.")] [BaseType (typeof (NSObject))] interface TWRequest { @@ -92,9 +90,6 @@ interface TWRequest { } /// A that manages the user experience of composing a tweet. - /// - /// Send a Tweet - /// Apple documentation for TWTweetComposeViewController [Deprecated (PlatformName.iOS, 6, 0, message: "Use the 'Social' framework.")] [BaseType (typeof (UIViewController))] interface TWTweetComposeViewController { diff --git a/src/uikit.cs b/src/uikit.cs index 852499dc19fb..ebceb52728f9 100644 --- a/src/uikit.cs +++ b/src/uikit.cs @@ -15172,8 +15172,6 @@ interface UIPickerViewDataSource { interface IUIPickerViewDataSource { } /// The model for the UIPickerView. - /// - /// Apple documentation for UIPickerViewModel [NoTV] [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] diff --git a/src/videosubscriberaccount.cs b/src/videosubscriberaccount.cs index 3f967f2fb81e..4f56f90f7310 100644 --- a/src/videosubscriberaccount.cs +++ b/src/videosubscriberaccount.cs @@ -138,7 +138,7 @@ interface VSErrorInfo { interface IVSAccountManagerDelegate { } - /// Apple documentation for VSAccountManagerDelegate + /// Apple documentation for VSAccountManagerDelegate [Protocol, Model] [NoMacCatalyst] [BaseType (typeof (NSObject))] @@ -173,7 +173,7 @@ interface VSAccountManagerDelegate { /// Coordinates access to the user's subscription. /// - /// Apple documentation for VSAccountManager + /// Apple documentation for VSAccountManager [NoMacCatalyst] [BaseType (typeof (NSObject))] interface VSAccountManager { @@ -261,7 +261,7 @@ interface VSAccountManagerAccessOptions { /// Represents a cancellable request that is still "in flight". /// - /// Apple documentation for VSAccountManagerResult + /// Apple documentation for VSAccountManagerResult [NoMacCatalyst] [BaseType (typeof (NSObject))] [DisableDefaultCtor] @@ -275,7 +275,7 @@ interface VSAccountManagerResult { /// Information about a subscription. /// - /// Apple documentation for VSAccountMetadata + /// Apple documentation for VSAccountMetadata [NoMacCatalyst] [BaseType (typeof (NSObject))] interface VSAccountMetadata { @@ -328,7 +328,7 @@ interface VSAccountMetadata { /// Specifies information being requested from the subscriber's account. /// - /// Apple documentation for VSAccountMetadataRequest + /// Apple documentation for VSAccountMetadataRequest [NoMacCatalyst] [BaseType (typeof (NSObject))] interface VSAccountMetadataRequest { diff --git a/src/xkit.cs b/src/xkit.cs index 312e24d8b258..e6980d88c3ae 100644 --- a/src/xkit.cs +++ b/src/xkit.cs @@ -1582,7 +1582,7 @@ interface NSLayoutManager_NSTextViewSupport { interface INSLayoutManagerDelegate { } /// A delegate object that exposes events for s. - /// Apple documentation for NSLayoutManagerDelegate + /// Apple documentation for NSLayoutManagerDelegate [BaseType (typeof (NSObject))] [Model] [Protocol] @@ -2914,7 +2914,7 @@ partial interface NSTextAttachmentContainer { /// An attachment to a . /// /// - /// Apple documentation for NSTextAttachment + /// Apple documentation for NSTextAttachment [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] partial interface NSTextAttachment : NSTextAttachmentContainer, NSSecureCoding, NSTextAttachmentLayout @@ -3152,7 +3152,7 @@ nint ChangeInLength { interface INSTextStorageDelegate { } /// A delegate object that provides events relating to processing editing for . - /// Apple documentation for NSTextStorageDelegate + /// Apple documentation for NSTextStorageDelegate [MacCatalyst (13, 1)] [Model] [BaseType (typeof (NSObject))] @@ -3523,7 +3523,7 @@ interface NSShadow : NSSecureCoding, NSCopying { /// Represents a tab location in Text Kit. /// - /// Apple documentation for NSTextTab + /// Apple documentation for NSTextTab [MacCatalyst (13, 1)] [BaseType (typeof (NSObject))] interface NSTextTab : NSSecureCoding, NSCopying { From a1a686d6e4fd893ef92da5d3855ee5222515d4ab Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 19:18:35 +0200 Subject: [PATCH 18/35] [tests] Update expected sizes. --- .../MacCatalyst-CoreCLR-Interpreter-size.txt | 8 +- .../expected/MacCatalyst-CoreCLR-R2R-size.txt | 10 +- .../MacCatalyst-MonoVM-interpreter-size.txt | 8 +- .../expected/MacCatalyst-MonoVM-size.txt | 6 +- ...atalyst-NativeAOT-TrimmableStatic-size.txt | 4 +- .../expected/MacCatalyst-NativeAOT-size.txt | 4 +- ...reCLR-Interpreter-TrimmableStatic-size.txt | 100 ++++++++--------- .../MacOSX-CoreCLR-Interpreter-size.txt | 100 ++++++++--------- .../expected/MacOSX-CoreCLR-R2R-size.txt | 104 +++++++++--------- .../MacOSX-NativeAOT-TrimmableStatic-size.txt | 4 +- .../expected/MacOSX-NativeAOT-size.txt | 4 +- .../TVOS-CoreCLR-Interpreter-size.txt | 14 +-- .../expected/TVOS-CoreCLR-R2R-size.txt | 18 +-- .../expected/TVOS-MonoVM-interpreter-size.txt | 4 +- .../UnitTests/expected/TVOS-MonoVM-size.txt | 4 +- .../TVOS-NativeAOT-TrimmableStatic-size.txt | 4 +- .../expected/TVOS-NativeAOT-size.txt | 4 +- .../expected/iOS-CoreCLR-Interpreter-size.txt | 16 +-- .../expected/iOS-CoreCLR-R2R-size.txt | 20 ++-- .../expected/iOS-MonoVM-interpreter-size.txt | 4 +- .../UnitTests/expected/iOS-MonoVM-size.txt | 4 +- .../iOS-NativeAOT-TrimmableStatic-size.txt | 4 +- .../UnitTests/expected/iOS-NativeAOT-size.txt | 4 +- 23 files changed, 226 insertions(+), 226 deletions(-) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-Interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-Interpreter-size.txt index 7589ecee70ae..a205b89b64b1 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-Interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-Interpreter-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 10,487,219 bytes (10,241.4 KB = 10.0 MB) +AppBundleSize: 10,488,019 bytes (10,242.2 KB = 10.0 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 4,951 bytes (4.8 KB = 0.0 MB) Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 242,000 bytes (236.3 KB = 0.2 MB) -Contents/MonoBundle/libcoreclr.dylib: 6,385,264 bytes (6,235.6 KB = 6.1 MB) +Contents/MacOS/SizeTestApp: 242,192 bytes (236.5 KB = 0.2 MB) +Contents/MonoBundle/libcoreclr.dylib: 6,385,360 bytes (6,235.7 KB = 6.1 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 110,432 bytes (107.8 KB = 0.1 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: 1,442,336 bytes (1,408.5 KB = 1.4 MB) Contents/MonoBundle/libSystem.Native.dylib: 147,744 bytes (144.3 KB = 0.1 MB) @@ -16,7 +16,7 @@ Contents/MonoBundle/System.Collections.Immutable.dll: 14,848 bytes (14.5 KB = 0. Contents/MonoBundle/System.Diagnostics.StackTrace.dll: 8,192 bytes (8.0 KB = 0.0 MB) Contents/MonoBundle/System.IO.Compression.dll: 22,528 bytes (22.0 KB = 0.0 MB) Contents/MonoBundle/System.IO.MemoryMappedFiles.dll: 22,016 bytes (21.5 KB = 0.0 MB) -Contents/MonoBundle/System.Private.CoreLib.dll: 1,579,520 bytes (1,542.5 KB = 1.5 MB) +Contents/MonoBundle/System.Private.CoreLib.dll: 1,580,032 bytes (1,543.0 KB = 1.5 MB) Contents/MonoBundle/System.Reflection.Metadata.dll: 84,480 bytes (82.5 KB = 0.1 MB) Contents/MonoBundle/System.Runtime.dll: 5,120 bytes (5.0 KB = 0.0 MB) Contents/MonoBundle/System.Runtime.InteropServices.dll: 4,608 bytes (4.5 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-R2R-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-R2R-size.txt index 2d1dd5afe540..e2758a18b7a0 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-R2R-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-CoreCLR-R2R-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 19,348,253 bytes (18,894.8 KB = 18.5 MB) +AppBundleSize: 19,349,869 bytes (18,896.4 KB = 18.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 5,105 bytes (5.0 KB = 0.0 MB) Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 242,624 bytes (236.9 KB = 0.2 MB) -Contents/MonoBundle/libcoreclr.dylib: 6,385,264 bytes (6,235.6 KB = 6.1 MB) +Contents/MacOS/SizeTestApp: 242,832 bytes (237.1 KB = 0.2 MB) +Contents/MonoBundle/libcoreclr.dylib: 6,385,360 bytes (6,235.7 KB = 6.1 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 110,432 bytes (107.8 KB = 0.1 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: 1,442,336 bytes (1,408.5 KB = 1.4 MB) Contents/MonoBundle/libSystem.Native.dylib: 147,744 bytes (144.3 KB = 0.1 MB) @@ -12,12 +12,12 @@ Contents/MonoBundle/libSystem.Security.Cryptography.Native.Apple.dylib: 229,280 Contents/MonoBundle/Microsoft.MacCatalyst.dll: 101,888 bytes (99.5 KB = 0.1 MB) Contents/MonoBundle/runtimeconfig.bin: 1,481 bytes (1.4 KB = 0.0 MB) Contents/MonoBundle/SizeTestApp.dll: 7,680 bytes (7.5 KB = 0.0 MB) -Contents/MonoBundle/SizeTestApp.r2r.dylib: 8,861,280 bytes (8,653.6 KB = 8.5 MB) +Contents/MonoBundle/SizeTestApp.r2r.dylib: 8,862,080 bytes (8,654.4 KB = 8.5 MB) Contents/MonoBundle/System.Collections.Immutable.dll: 13,824 bytes (13.5 KB = 0.0 MB) Contents/MonoBundle/System.Diagnostics.StackTrace.dll: 7,680 bytes (7.5 KB = 0.0 MB) Contents/MonoBundle/System.IO.Compression.dll: 22,016 bytes (21.5 KB = 0.0 MB) Contents/MonoBundle/System.IO.MemoryMappedFiles.dll: 21,504 bytes (21.0 KB = 0.0 MB) -Contents/MonoBundle/System.Private.CoreLib.dll: 1,584,640 bytes (1,547.5 KB = 1.5 MB) +Contents/MonoBundle/System.Private.CoreLib.dll: 1,585,152 bytes (1,548.0 KB = 1.5 MB) Contents/MonoBundle/System.Reflection.Metadata.dll: 83,456 bytes (81.5 KB = 0.1 MB) Contents/MonoBundle/System.Runtime.dll: 4,096 bytes (4.0 KB = 0.0 MB) Contents/MonoBundle/System.Runtime.InteropServices.dll: 3,584 bytes (3.5 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt index 9615db6d15f6..d9a542b82e47 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt @@ -1,13 +1,13 @@ -AppBundleSize: 5,810,614 bytes (5,674.4 KB = 5.5 MB) +AppBundleSize: 5,813,094 bytes (5,676.8 KB = 5.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 3,310 bytes (3.2 KB = 0.0 MB) Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 4,567,376 bytes (4,460.3 KB = 4.4 MB) +Contents/MacOS/SizeTestApp: 4,569,312 bytes (4,462.2 KB = 4.4 MB) Contents/MonoBundle/Microsoft.MacCatalyst.dll: 158,208 bytes (154.5 KB = 0.2 MB) Contents/MonoBundle/runtimeconfig.bin: 1,405 bytes (1.4 KB = 0.0 MB) Contents/MonoBundle/SizeTestApp.dll: 7,680 bytes (7.5 KB = 0.0 MB) -Contents/MonoBundle/System.Private.CoreLib.aotdata.arm64: 41,384 bytes (40.4 KB = 0.0 MB) -Contents/MonoBundle/System.Private.CoreLib.dll: 1,020,416 bytes (996.5 KB = 1.0 MB) +Contents/MonoBundle/System.Private.CoreLib.aotdata.arm64: 41,416 bytes (40.4 KB = 0.0 MB) +Contents/MonoBundle/System.Private.CoreLib.dll: 1,020,928 bytes (997.0 KB = 1.0 MB) Contents/MonoBundle/System.Runtime.dll: 5,120 bytes (5.0 KB = 0.0 MB) Contents/MonoBundle/System.Runtime.InteropServices.dll: 4,608 bytes (4.5 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt index 792aae310be2..4e9a3b1a4c1f 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt @@ -1,15 +1,15 @@ -AppBundleSize: 16,621,826 bytes (16,232.3 KB = 15.9 MB) +AppBundleSize: 16,624,250 bytes (16,234.6 KB = 15.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 4,134 bytes (4.0 KB = 0.0 MB) Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 14,063,472 bytes (13,733.9 KB = 13.4 MB) +Contents/MacOS/SizeTestApp: 14,065,968 bytes (13,736.3 KB = 13.4 MB) Contents/MonoBundle/aot-instances.aotdata.arm64: 1,051,776 bytes (1,027.1 KB = 1.0 MB) Contents/MonoBundle/Microsoft.MacCatalyst.aotdata.arm64: 36,048 bytes (35.2 KB = 0.0 MB) Contents/MonoBundle/Microsoft.MacCatalyst.dll: 51,200 bytes (50.0 KB = 0.0 MB) Contents/MonoBundle/runtimeconfig.bin: 1,481 bytes (1.4 KB = 0.0 MB) Contents/MonoBundle/SizeTestApp.aotdata.arm64: 1,552 bytes (1.5 KB = 0.0 MB) Contents/MonoBundle/SizeTestApp.dll: 7,168 bytes (7.0 KB = 0.0 MB) -Contents/MonoBundle/System.Private.CoreLib.aotdata.arm64: 850,480 bytes (830.5 KB = 0.8 MB) +Contents/MonoBundle/System.Private.CoreLib.aotdata.arm64: 850,408 bytes (830.5 KB = 0.8 MB) Contents/MonoBundle/System.Private.CoreLib.dll: 542,720 bytes (530.0 KB = 0.5 MB) Contents/MonoBundle/System.Runtime.aotdata.arm64: 472 bytes (0.5 KB = 0.0 MB) Contents/MonoBundle/System.Runtime.dll: 5,120 bytes (5.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt index ae958d088200..e736b72784ab 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 8,742,781 bytes (8,537.9 KB = 8.3 MB) +AppBundleSize: 8,742,753 bytes (8,537.8 KB = 8.3 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 2,358 bytes (2.3 KB = 0.0 MB) -Contents/Info.plist: 1,127 bytes (1.1 KB = 0.0 MB) +Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 8,737,392 bytes (8,532.6 KB = 8.3 MB) Contents/MonoBundle/runtimeconfig.bin: 1,896 bytes (1.9 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt index 928f824cb3b8..4a91a77c88b1 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 2,814,805 bytes (2,748.8 KB = 2.7 MB) +AppBundleSize: 2,814,777 bytes (2,748.8 KB = 2.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 2,358 bytes (2.3 KB = 0.0 MB) -Contents/Info.plist: 1,127 bytes (1.1 KB = 0.0 MB) +Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 2,809,504 bytes (2,743.7 KB = 2.7 MB) Contents/MonoBundle/runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt index e3038b6183cd..f48d3166a07a 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt @@ -1,12 +1,12 @@ -AppBundleSize: 258,841,208 bytes (252,774.6 KB = 246.9 MB) +AppBundleSize: 259,125,784 bytes (253,052.5 KB = 247.1 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 56,016 bytes (54.7 KB = 0.1 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 7,390,208 bytes (7,217.0 KB = 7.0 MB) +Contents/MacOS/SizeTestApp: 7,390,448 bytes (7,217.2 KB = 7.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/_Microsoft.macOS.TypeMap.dll: 4,842,496 bytes (4,729.0 KB = 4.6 MB) Contents/MonoBundle/.xamarin/osx-arm64/_Microsoft.macOS.TypeMaps.dll: 2,048 bytes (2.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/_SizeTestApp.TypeMap.dll: 3,072 bytes (3.0 KB = 0.0 MB) -Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 882,688 bytes (862.0 KB = 0.8 MB) +Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 882,176 bytes (861.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Caching.Abstractions.dll: 56,320 bytes (55.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Configuration.Abstractions.dll: 28,160 bytes (27.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.DependencyInjection.Abstractions.dll: 140,800 bytes (137.5 KB = 0.1 MB) @@ -22,7 +22,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Registry.dll: 23,552 byte Contents/MonoBundle/.xamarin/osx-arm64/SizeTestApp.dll: 5,632 bytes (5.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Concurrent.dll: 136,704 bytes (133.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.dll: 317,952 bytes (310.5 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Immutable.dll: 1,105,920 bytes (1,080.0 KB = 1.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Immutable.dll: 1,111,552 bytes (1,085.5 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.NonGeneric.dll: 94,208 bytes (92.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Specialized.dll: 94,720 bytes (92.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.Annotations.dll: 206,336 bytes (201.5 KB = 0.2 MB) @@ -31,19 +31,19 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.EventBasedAsync.dll Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.Primitives.dll: 69,632 bytes (68.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.TypeConverter.dll: 867,840 bytes (847.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Console.dll: 215,040 bytes (210.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Data.Common.dll: 3,212,800 bytes (3,137.5 KB = 3.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Data.Common.dll: 3,212,288 bytes (3,137.0 KB = 3.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.DiagnosticSource.dll: 549,888 bytes (537.0 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.FileVersionInfo.dll: 35,840 bytes (35.0 KB = 0.0 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Process.dll: 352,768 bytes (344.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Process.dll: 371,200 bytes (362.5 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.StackTrace.dll: 26,112 bytes (25.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.TextWriterTraceListener.dll: 55,296 bytes (54.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.TraceSource.dll: 141,312 bytes (138.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Drawing.Primitives.dll: 118,272 bytes (115.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Asn1.dll: 249,344 bytes (243.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Tar.dll: 316,416 bytes (309.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.Brotli.dll: 73,728 bytes (72.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.dll: 540,672 bytes (528.0 KB = 0.5 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.ZipFile.dll: 91,136 bytes (89.0 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Tar.dll: 314,368 bytes (307.0 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.Brotli.dll: 73,216 bytes (71.5 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.dll: 537,600 bytes (525.0 KB = 0.5 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.ZipFile.dll: 90,624 bytes (88.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.AccessControl.dll: 22,528 bytes (22.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.DriveInfo.dll: 78,848 bytes (77.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.Watcher.dll: 111,616 bytes (109.0 KB = 0.1 MB) @@ -52,36 +52,36 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.IO.MemoryMappedFiles.dll: 84,480 b Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipelines.dll: 189,440 bytes (185.0 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipes.AccessControl.dll: 13,824 bytes (13.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipes.dll: 136,192 bytes (133.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.AsyncEnumerable.dll: 1,483,776 bytes (1,449.0 KB = 1.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.dll: 787,968 bytes (769.5 KB = 0.8 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.AsyncEnumerable.dll: 1,592,320 bytes (1,555.0 KB = 1.5 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.dll: 807,936 bytes (789.0 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Expressions.dll: 4,638,208 bytes (4,529.5 KB = 4.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Parallel.dll: 882,176 bytes (861.5 KB = 0.8 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Queryable.dll: 204,288 bytes (199.5 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Queryable.dll: 210,432 bytes (205.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Memory.dll: 154,624 bytes (151.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.dll: 1,875,456 bytes (1,831.5 KB = 1.8 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.dll: 1,869,312 bytes (1,825.5 KB = 1.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.Json.dll: 119,296 bytes (116.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.HttpListener.dll: 316,928 bytes (309.5 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Mail.dll: 530,432 bytes (518.0 KB = 0.5 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Mail.dll: 529,408 bytes (517.0 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.NameResolution.dll: 105,472 bytes (103.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.NetworkInformation.dll: 142,336 bytes (139.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Ping.dll: 88,576 bytes (86.5 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Ping.dll: 88,064 bytes (86.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Primitives.dll: 241,152 bytes (235.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Quic.dll: 372,224 bytes (363.5 KB = 0.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Requests.dll: 406,016 bytes (396.5 KB = 0.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Security.dll: 793,088 bytes (774.5 KB = 0.8 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Quic.dll: 371,712 bytes (363.0 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Requests.dll: 405,504 bytes (396.0 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Security.dll: 791,040 bytes (772.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.ServerSentEvents.dll: 67,584 bytes (66.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Sockets.dll: 694,784 bytes (678.5 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebClient.dll: 166,912 bytes (163.0 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebHeaderCollection.dll: 52,224 bytes (51.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebProxy.dll: 26,624 bytes (26.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.Client.dll: 89,088 bytes (87.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.dll: 238,592 bytes (233.0 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.dll: 237,056 bytes (231.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ObjectModel.dll: 67,072 bytes (65.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.CoreLib.dll: 17,900,032 bytes (17,480.5 KB = 17.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.DataContractSerialization.dll: 2,376,192 bytes (2,320.5 KB = 2.3 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.CoreLib.dll: 17,898,496 bytes (17,479.0 KB = 17.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.DataContractSerialization.dll: 2,375,168 bytes (2,319.5 KB = 2.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Uri.dll: 252,928 bytes (247.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.dll: 8,779,776 bytes (8,574.0 KB = 8.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.Linq.dll: 414,208 bytes (404.5 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.dll: 8,758,784 bytes (8,553.5 KB = 8.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.Linq.dll: 412,160 bytes (402.5 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.DispatchProxy.dll: 62,976 bytes (61.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Emit.dll: 335,872 bytes (328.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Metadata.dll: 1,272,832 bytes (1,243.0 KB = 1.2 MB) @@ -99,7 +99,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.dll: 2,458,1 Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Principal.Windows.dll: 27,648 bytes (27.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encoding.CodePages.dll: 856,576 bytes (836.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encodings.Web.dll: 113,152 bytes (110.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Json.dll: 2,158,080 bytes (2,107.5 KB = 2.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Json.dll: 2,176,000 bytes (2,125.0 KB = 2.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.RegularExpressions.dll: 1,179,648 bytes (1,152.0 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.AccessControl.dll: 23,552 bytes (23.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Channels.dll: 155,136 bytes (151.5 KB = 0.1 MB) @@ -128,7 +128,7 @@ Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Registry.dll: 23,040 bytes Contents/MonoBundle/.xamarin/osx-x64/SizeTestApp.dll: 5,632 bytes (5.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Concurrent.dll: 122,368 bytes (119.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.dll: 278,016 bytes (271.5 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Immutable.dll: 973,824 bytes (951.0 KB = 0.9 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Immutable.dll: 979,456 bytes (956.5 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.NonGeneric.dll: 82,432 bytes (80.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Specialized.dll: 82,432 bytes (80.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.Annotations.dll: 181,248 bytes (177.0 KB = 0.2 MB) @@ -137,19 +137,19 @@ Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.EventBasedAsync.dll: Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.Primitives.dll: 60,416 bytes (59.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.TypeConverter.dll: 752,640 bytes (735.0 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Console.dll: 188,416 bytes (184.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Data.Common.dll: 2,784,256 bytes (2,719.0 KB = 2.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Data.Common.dll: 2,783,744 bytes (2,718.5 KB = 2.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.DiagnosticSource.dll: 488,960 bytes (477.5 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.FileVersionInfo.dll: 33,280 bytes (32.5 KB = 0.0 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Process.dll: 305,152 bytes (298.0 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Process.dll: 321,536 bytes (314.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.StackTrace.dll: 25,088 bytes (24.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.TextWriterTraceListener.dll: 48,640 bytes (47.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.TraceSource.dll: 120,832 bytes (118.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Drawing.Primitives.dll: 113,152 bytes (110.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Asn1.dll: 222,208 bytes (217.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Tar.dll: 274,944 bytes (268.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Tar.dll: 273,408 bytes (267.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.Brotli.dll: 63,488 bytes (62.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.dll: 465,920 bytes (455.0 KB = 0.4 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.ZipFile.dll: 81,920 bytes (80.0 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.dll: 463,360 bytes (452.5 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.ZipFile.dll: 81,408 bytes (79.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.AccessControl.dll: 22,528 bytes (22.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.DriveInfo.dll: 69,120 bytes (67.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.Watcher.dll: 96,256 bytes (94.0 KB = 0.1 MB) @@ -158,38 +158,38 @@ Contents/MonoBundle/.xamarin/osx-x64/System.IO.MemoryMappedFiles.dll: 72,704 byt Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipelines.dll: 171,520 bytes (167.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipes.AccessControl.dll: 13,824 bytes (13.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipes.dll: 117,248 bytes (114.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Linq.AsyncEnumerable.dll: 1,320,960 bytes (1,290.0 KB = 1.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Linq.dll: 689,664 bytes (673.5 KB = 0.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Linq.AsyncEnumerable.dll: 1,416,192 bytes (1,383.0 KB = 1.4 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Linq.dll: 707,584 bytes (691.0 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Expressions.dll: 3,709,952 bytes (3,623.0 KB = 3.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Parallel.dll: 766,464 bytes (748.5 KB = 0.7 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Queryable.dll: 168,448 bytes (164.5 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Queryable.dll: 173,568 bytes (169.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Memory.dll: 142,336 bytes (139.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.dll: 1,654,272 bytes (1,615.5 KB = 1.6 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.dll: 1,648,640 bytes (1,610.0 KB = 1.6 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.Json.dll: 109,568 bytes (107.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.HttpListener.dll: 279,552 bytes (273.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Mail.dll: 462,336 bytes (451.5 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Mail.dll: 461,824 bytes (451.0 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.NameResolution.dll: 92,160 bytes (90.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.NetworkInformation.dll: 123,904 bytes (121.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Ping.dll: 78,336 bytes (76.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Primitives.dll: 212,480 bytes (207.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Quic.dll: 330,752 bytes (323.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Requests.dll: 352,256 bytes (344.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Security.dll: 689,152 bytes (673.0 KB = 0.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Quic.dll: 330,240 bytes (322.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Requests.dll: 351,744 bytes (343.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Security.dll: 687,104 bytes (671.0 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.ServerSentEvents.dll: 61,952 bytes (60.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Sockets.dll: 594,944 bytes (581.0 KB = 0.6 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebClient.dll: 147,456 bytes (144.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebHeaderCollection.dll: 44,544 bytes (43.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebProxy.dll: 24,064 bytes (23.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.Client.dll: 79,872 bytes (78.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.dll: 212,992 bytes (208.0 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.dll: 211,968 bytes (207.0 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ObjectModel.dll: 58,880 bytes (57.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.CoreLib.dll: 16,445,440 bytes (16,060.0 KB = 15.7 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.DataContractSerialization.dll: 2,049,536 bytes (2,001.5 KB = 2.0 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.CoreLib.dll: 16,443,904 bytes (16,058.5 KB = 15.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.DataContractSerialization.dll: 2,049,024 bytes (2,001.0 KB = 2.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.Uri.dll: 229,888 bytes (224.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.dll: 7,654,400 bytes (7,475.0 KB = 7.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.Linq.dll: 358,912 bytes (350.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.dll: 7,635,968 bytes (7,457.0 KB = 7.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.Linq.dll: 357,376 bytes (349.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.DispatchProxy.dll: 56,832 bytes (55.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.dll: 293,888 bytes (287.0 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.dll: 294,400 bytes (287.5 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Metadata.dll: 1,142,272 bytes (1,115.5 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.TypeExtensions.dll: 21,504 bytes (21.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Resources.Writer.dll: 32,256 bytes (31.5 KB = 0.0 MB) @@ -205,7 +205,7 @@ Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.dll: 2,130,944 Contents/MonoBundle/.xamarin/osx-x64/System.Security.Principal.Windows.dll: 27,648 bytes (27.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encoding.CodePages.dll: 839,680 bytes (820.0 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encodings.Web.dll: 104,448 bytes (102.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Text.Json.dll: 1,931,264 bytes (1,886.0 KB = 1.8 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Text.Json.dll: 1,947,136 bytes (1,901.5 KB = 1.9 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.RegularExpressions.dll: 1,052,160 bytes (1,027.5 KB = 1.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.AccessControl.dll: 23,040 bytes (22.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Channels.dll: 139,264 bytes (136.0 KB = 0.1 MB) @@ -217,12 +217,12 @@ Contents/MonoBundle/.xamarin/osx-x64/System.Web.HttpUtility.dll: 43,008 bytes (4 Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XPath.XDocument.dll: 6,656 bytes (6.5 KB = 0.0 MB) Contents/MonoBundle/libclrgc.dylib: 2,038,208 bytes (1,990.4 KB = 1.9 MB) Contents/MonoBundle/libclrgcexp.dylib: 2,198,640 bytes (2,147.1 KB = 2.1 MB) -Contents/MonoBundle/libclrjit.dylib: 6,522,368 bytes (6,369.5 KB = 6.2 MB) -Contents/MonoBundle/libcoreclr.dylib: 12,828,256 bytes (12,527.6 KB = 12.2 MB) +Contents/MonoBundle/libclrjit.dylib: 6,539,344 bytes (6,386.1 KB = 6.2 MB) +Contents/MonoBundle/libcoreclr.dylib: 12,844,608 bytes (12,543.6 KB = 12.2 MB) Contents/MonoBundle/libhostfxr.dylib: 833,536 bytes (814.0 KB = 0.8 MB) Contents/MonoBundle/libhostpolicy.dylib: 776,624 bytes (758.4 KB = 0.7 MB) -Contents/MonoBundle/libmscordaccore.dylib: 4,453,600 bytes (4,349.2 KB = 4.2 MB) -Contents/MonoBundle/libmscordbi.dylib: 3,447,008 bytes (3,366.2 KB = 3.3 MB) +Contents/MonoBundle/libmscordaccore.dylib: 4,453,664 bytes (4,349.3 KB = 4.2 MB) +Contents/MonoBundle/libmscordbi.dylib: 3,447,072 bytes (3,366.3 KB = 3.3 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 286,816 bytes (280.1 KB = 0.3 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: 3,278,688 bytes (3,201.8 KB = 3.1 MB) Contents/MonoBundle/libSystem.Native.dylib: 296,416 bytes (289.5 KB = 0.3 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt index 00b6bf46f3ac..d30ea4c3b291 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 246,977,882 bytes (241,189.3 KB = 235.5 MB) +AppBundleSize: 247,262,458 bytes (241,467.2 KB = 235.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 54,948 bytes (53.7 KB = 0.1 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 8,013,664 bytes (7,825.8 KB = 7.6 MB) -Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 882,688 bytes (862.0 KB = 0.8 MB) +Contents/MacOS/SizeTestApp: 8,013,904 bytes (7,826.1 KB = 7.6 MB) +Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 882,176 bytes (861.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Caching.Abstractions.dll: 56,320 bytes (55.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Configuration.Abstractions.dll: 28,160 bytes (27.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.DependencyInjection.Abstractions.dll: 140,800 bytes (137.5 KB = 0.1 MB) @@ -19,7 +19,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Registry.dll: 23,552 byte Contents/MonoBundle/.xamarin/osx-arm64/SizeTestApp.dll: 6,656 bytes (6.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Concurrent.dll: 136,704 bytes (133.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.dll: 317,952 bytes (310.5 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Immutable.dll: 1,105,920 bytes (1,080.0 KB = 1.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Immutable.dll: 1,111,552 bytes (1,085.5 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.NonGeneric.dll: 94,208 bytes (92.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Specialized.dll: 94,720 bytes (92.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.Annotations.dll: 206,336 bytes (201.5 KB = 0.2 MB) @@ -28,19 +28,19 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.EventBasedAsync.dll Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.Primitives.dll: 69,632 bytes (68.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.TypeConverter.dll: 867,840 bytes (847.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Console.dll: 215,040 bytes (210.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Data.Common.dll: 3,212,800 bytes (3,137.5 KB = 3.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Data.Common.dll: 3,212,288 bytes (3,137.0 KB = 3.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.DiagnosticSource.dll: 549,888 bytes (537.0 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.FileVersionInfo.dll: 35,840 bytes (35.0 KB = 0.0 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Process.dll: 352,768 bytes (344.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Process.dll: 371,200 bytes (362.5 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.StackTrace.dll: 26,112 bytes (25.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.TextWriterTraceListener.dll: 55,296 bytes (54.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.TraceSource.dll: 141,312 bytes (138.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Drawing.Primitives.dll: 118,272 bytes (115.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Asn1.dll: 249,344 bytes (243.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Tar.dll: 316,416 bytes (309.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.Brotli.dll: 73,728 bytes (72.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.dll: 540,672 bytes (528.0 KB = 0.5 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.ZipFile.dll: 91,136 bytes (89.0 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Tar.dll: 314,368 bytes (307.0 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.Brotli.dll: 73,216 bytes (71.5 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.dll: 537,600 bytes (525.0 KB = 0.5 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.ZipFile.dll: 90,624 bytes (88.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.AccessControl.dll: 22,528 bytes (22.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.DriveInfo.dll: 78,848 bytes (77.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.Watcher.dll: 111,616 bytes (109.0 KB = 0.1 MB) @@ -49,36 +49,36 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.IO.MemoryMappedFiles.dll: 84,480 b Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipelines.dll: 189,440 bytes (185.0 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipes.AccessControl.dll: 13,824 bytes (13.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipes.dll: 136,192 bytes (133.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.AsyncEnumerable.dll: 1,483,776 bytes (1,449.0 KB = 1.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.dll: 787,968 bytes (769.5 KB = 0.8 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.AsyncEnumerable.dll: 1,592,320 bytes (1,555.0 KB = 1.5 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.dll: 807,936 bytes (789.0 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Expressions.dll: 4,638,208 bytes (4,529.5 KB = 4.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Parallel.dll: 882,176 bytes (861.5 KB = 0.8 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Queryable.dll: 204,288 bytes (199.5 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Queryable.dll: 210,432 bytes (205.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Memory.dll: 154,624 bytes (151.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.dll: 1,875,456 bytes (1,831.5 KB = 1.8 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.dll: 1,869,312 bytes (1,825.5 KB = 1.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.Json.dll: 119,296 bytes (116.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.HttpListener.dll: 316,928 bytes (309.5 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Mail.dll: 530,432 bytes (518.0 KB = 0.5 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Mail.dll: 529,408 bytes (517.0 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.NameResolution.dll: 105,472 bytes (103.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.NetworkInformation.dll: 142,336 bytes (139.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Ping.dll: 88,576 bytes (86.5 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Ping.dll: 88,064 bytes (86.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Primitives.dll: 241,152 bytes (235.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Quic.dll: 372,224 bytes (363.5 KB = 0.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Requests.dll: 406,016 bytes (396.5 KB = 0.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Security.dll: 793,088 bytes (774.5 KB = 0.8 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Quic.dll: 371,712 bytes (363.0 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Requests.dll: 405,504 bytes (396.0 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Security.dll: 791,040 bytes (772.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.ServerSentEvents.dll: 67,584 bytes (66.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Sockets.dll: 694,784 bytes (678.5 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebClient.dll: 166,912 bytes (163.0 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebHeaderCollection.dll: 52,224 bytes (51.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebProxy.dll: 26,624 bytes (26.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.Client.dll: 89,088 bytes (87.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.dll: 238,592 bytes (233.0 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.dll: 237,056 bytes (231.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ObjectModel.dll: 67,072 bytes (65.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.CoreLib.dll: 17,900,032 bytes (17,480.5 KB = 17.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.DataContractSerialization.dll: 2,376,192 bytes (2,320.5 KB = 2.3 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.CoreLib.dll: 17,898,496 bytes (17,479.0 KB = 17.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.DataContractSerialization.dll: 2,375,168 bytes (2,319.5 KB = 2.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Uri.dll: 252,928 bytes (247.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.dll: 8,779,776 bytes (8,574.0 KB = 8.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.Linq.dll: 414,208 bytes (404.5 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.dll: 8,758,784 bytes (8,553.5 KB = 8.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.Linq.dll: 412,160 bytes (402.5 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.DispatchProxy.dll: 62,976 bytes (61.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Emit.dll: 335,872 bytes (328.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Metadata.dll: 1,272,832 bytes (1,243.0 KB = 1.2 MB) @@ -96,7 +96,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.dll: 2,458,1 Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Principal.Windows.dll: 27,648 bytes (27.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encoding.CodePages.dll: 856,576 bytes (836.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encodings.Web.dll: 113,152 bytes (110.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Json.dll: 2,158,080 bytes (2,107.5 KB = 2.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Json.dll: 2,176,000 bytes (2,125.0 KB = 2.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.RegularExpressions.dll: 1,179,648 bytes (1,152.0 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.AccessControl.dll: 23,552 bytes (23.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Channels.dll: 155,136 bytes (151.5 KB = 0.1 MB) @@ -122,7 +122,7 @@ Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Registry.dll: 23,040 bytes Contents/MonoBundle/.xamarin/osx-x64/SizeTestApp.dll: 6,656 bytes (6.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Concurrent.dll: 122,368 bytes (119.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.dll: 278,016 bytes (271.5 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Immutable.dll: 973,824 bytes (951.0 KB = 0.9 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Immutable.dll: 979,456 bytes (956.5 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.NonGeneric.dll: 82,432 bytes (80.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Specialized.dll: 82,432 bytes (80.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.Annotations.dll: 181,248 bytes (177.0 KB = 0.2 MB) @@ -131,19 +131,19 @@ Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.EventBasedAsync.dll: Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.Primitives.dll: 60,416 bytes (59.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.TypeConverter.dll: 752,640 bytes (735.0 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Console.dll: 188,416 bytes (184.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Data.Common.dll: 2,784,256 bytes (2,719.0 KB = 2.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Data.Common.dll: 2,783,744 bytes (2,718.5 KB = 2.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.DiagnosticSource.dll: 488,960 bytes (477.5 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.FileVersionInfo.dll: 33,280 bytes (32.5 KB = 0.0 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Process.dll: 305,152 bytes (298.0 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Process.dll: 321,536 bytes (314.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.StackTrace.dll: 25,088 bytes (24.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.TextWriterTraceListener.dll: 48,640 bytes (47.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.TraceSource.dll: 120,832 bytes (118.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Drawing.Primitives.dll: 113,152 bytes (110.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Asn1.dll: 222,208 bytes (217.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Tar.dll: 274,944 bytes (268.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Tar.dll: 273,408 bytes (267.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.Brotli.dll: 63,488 bytes (62.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.dll: 465,920 bytes (455.0 KB = 0.4 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.ZipFile.dll: 81,920 bytes (80.0 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.dll: 463,360 bytes (452.5 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.ZipFile.dll: 81,408 bytes (79.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.AccessControl.dll: 22,528 bytes (22.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.DriveInfo.dll: 69,120 bytes (67.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.Watcher.dll: 96,256 bytes (94.0 KB = 0.1 MB) @@ -152,38 +152,38 @@ Contents/MonoBundle/.xamarin/osx-x64/System.IO.MemoryMappedFiles.dll: 72,704 byt Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipelines.dll: 171,520 bytes (167.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipes.AccessControl.dll: 13,824 bytes (13.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipes.dll: 117,248 bytes (114.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Linq.AsyncEnumerable.dll: 1,320,960 bytes (1,290.0 KB = 1.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Linq.dll: 689,664 bytes (673.5 KB = 0.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Linq.AsyncEnumerable.dll: 1,416,192 bytes (1,383.0 KB = 1.4 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Linq.dll: 707,584 bytes (691.0 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Expressions.dll: 3,709,952 bytes (3,623.0 KB = 3.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Parallel.dll: 766,464 bytes (748.5 KB = 0.7 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Queryable.dll: 168,448 bytes (164.5 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Queryable.dll: 173,568 bytes (169.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Memory.dll: 142,336 bytes (139.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.dll: 1,654,272 bytes (1,615.5 KB = 1.6 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.dll: 1,648,640 bytes (1,610.0 KB = 1.6 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.Json.dll: 109,568 bytes (107.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.HttpListener.dll: 279,552 bytes (273.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Mail.dll: 462,336 bytes (451.5 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Mail.dll: 461,824 bytes (451.0 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.NameResolution.dll: 92,160 bytes (90.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.NetworkInformation.dll: 123,904 bytes (121.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Ping.dll: 78,336 bytes (76.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Primitives.dll: 212,480 bytes (207.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Quic.dll: 330,752 bytes (323.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Requests.dll: 352,256 bytes (344.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Security.dll: 689,152 bytes (673.0 KB = 0.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Quic.dll: 330,240 bytes (322.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Requests.dll: 351,744 bytes (343.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Security.dll: 687,104 bytes (671.0 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.ServerSentEvents.dll: 61,952 bytes (60.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Sockets.dll: 594,944 bytes (581.0 KB = 0.6 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebClient.dll: 147,456 bytes (144.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebHeaderCollection.dll: 44,544 bytes (43.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebProxy.dll: 24,064 bytes (23.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.Client.dll: 79,872 bytes (78.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.dll: 212,992 bytes (208.0 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.dll: 211,968 bytes (207.0 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ObjectModel.dll: 58,880 bytes (57.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.CoreLib.dll: 16,445,440 bytes (16,060.0 KB = 15.7 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.DataContractSerialization.dll: 2,049,536 bytes (2,001.5 KB = 2.0 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.CoreLib.dll: 16,443,904 bytes (16,058.5 KB = 15.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.DataContractSerialization.dll: 2,049,024 bytes (2,001.0 KB = 2.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.Uri.dll: 229,888 bytes (224.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.dll: 7,654,400 bytes (7,475.0 KB = 7.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.Linq.dll: 358,912 bytes (350.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.dll: 7,635,968 bytes (7,457.0 KB = 7.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.Linq.dll: 357,376 bytes (349.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.DispatchProxy.dll: 56,832 bytes (55.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.dll: 293,888 bytes (287.0 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.dll: 294,400 bytes (287.5 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Metadata.dll: 1,142,272 bytes (1,115.5 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.TypeExtensions.dll: 21,504 bytes (21.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Resources.Writer.dll: 32,256 bytes (31.5 KB = 0.0 MB) @@ -199,7 +199,7 @@ Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.dll: 2,130,944 Contents/MonoBundle/.xamarin/osx-x64/System.Security.Principal.Windows.dll: 27,648 bytes (27.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encoding.CodePages.dll: 839,680 bytes (820.0 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encodings.Web.dll: 104,448 bytes (102.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Text.Json.dll: 1,931,264 bytes (1,886.0 KB = 1.8 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Text.Json.dll: 1,947,136 bytes (1,901.5 KB = 1.9 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.RegularExpressions.dll: 1,052,160 bytes (1,027.5 KB = 1.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.AccessControl.dll: 23,040 bytes (22.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Channels.dll: 139,264 bytes (136.0 KB = 0.1 MB) @@ -211,12 +211,12 @@ Contents/MonoBundle/.xamarin/osx-x64/System.Web.HttpUtility.dll: 43,008 bytes (4 Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XPath.XDocument.dll: 6,656 bytes (6.5 KB = 0.0 MB) Contents/MonoBundle/libclrgc.dylib: 2,038,208 bytes (1,990.4 KB = 1.9 MB) Contents/MonoBundle/libclrgcexp.dylib: 2,198,640 bytes (2,147.1 KB = 2.1 MB) -Contents/MonoBundle/libclrjit.dylib: 6,522,368 bytes (6,369.5 KB = 6.2 MB) -Contents/MonoBundle/libcoreclr.dylib: 12,828,256 bytes (12,527.6 KB = 12.2 MB) +Contents/MonoBundle/libclrjit.dylib: 6,539,344 bytes (6,386.1 KB = 6.2 MB) +Contents/MonoBundle/libcoreclr.dylib: 12,844,608 bytes (12,543.6 KB = 12.2 MB) Contents/MonoBundle/libhostfxr.dylib: 833,536 bytes (814.0 KB = 0.8 MB) Contents/MonoBundle/libhostpolicy.dylib: 776,624 bytes (758.4 KB = 0.7 MB) -Contents/MonoBundle/libmscordaccore.dylib: 4,453,600 bytes (4,349.2 KB = 4.2 MB) -Contents/MonoBundle/libmscordbi.dylib: 3,447,008 bytes (3,366.2 KB = 3.3 MB) +Contents/MonoBundle/libmscordaccore.dylib: 4,453,664 bytes (4,349.3 KB = 4.2 MB) +Contents/MonoBundle/libmscordbi.dylib: 3,447,072 bytes (3,366.3 KB = 3.3 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 286,816 bytes (280.1 KB = 0.3 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: 3,278,688 bytes (3,201.8 KB = 3.1 MB) Contents/MonoBundle/libSystem.Native.dylib: 296,416 bytes (289.5 KB = 0.3 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt index cb15ab165a46..4c35bf0be4bd 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 312,119,130 bytes (304,803.8 KB = 297.7 MB) +AppBundleSize: 312,393,978 bytes (305,072.2 KB = 297.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 54,948 bytes (53.7 KB = 0.1 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 8,013,664 bytes (7,825.8 KB = 7.6 MB) -Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 882,688 bytes (862.0 KB = 0.8 MB) +Contents/MacOS/SizeTestApp: 8,013,904 bytes (7,826.1 KB = 7.6 MB) +Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 882,176 bytes (861.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Caching.Abstractions.dll: 56,320 bytes (55.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Configuration.Abstractions.dll: 28,160 bytes (27.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.DependencyInjection.Abstractions.dll: 140,800 bytes (137.5 KB = 0.1 MB) @@ -13,13 +13,13 @@ Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Hosting.Abstractions Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Logging.Abstractions.dll: 150,528 bytes (147.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Options.dll: 135,168 bytes (132.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Primitives.dll: 70,144 bytes (68.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 75,037,696 bytes (73,279.0 KB = 71.6 MB) +Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 75,028,480 bytes (73,270.0 KB = 71.6 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.Core.dll: 1,321,472 bytes (1,290.5 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Registry.dll: 23,552 bytes (23.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/SizeTestApp.dll: 10,240 bytes (10.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Concurrent.dll: 136,704 bytes (133.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.dll: 317,952 bytes (310.5 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Immutable.dll: 1,105,920 bytes (1,080.0 KB = 1.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Immutable.dll: 1,111,552 bytes (1,085.5 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.NonGeneric.dll: 94,208 bytes (92.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Collections.Specialized.dll: 94,720 bytes (92.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.Annotations.dll: 206,336 bytes (201.5 KB = 0.2 MB) @@ -28,19 +28,19 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.EventBasedAsync.dll Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.Primitives.dll: 69,632 bytes (68.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ComponentModel.TypeConverter.dll: 867,840 bytes (847.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Console.dll: 215,040 bytes (210.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Data.Common.dll: 3,212,800 bytes (3,137.5 KB = 3.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Data.Common.dll: 3,212,288 bytes (3,137.0 KB = 3.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.DiagnosticSource.dll: 549,888 bytes (537.0 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.FileVersionInfo.dll: 35,840 bytes (35.0 KB = 0.0 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Process.dll: 352,768 bytes (344.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.Process.dll: 371,200 bytes (362.5 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.StackTrace.dll: 26,112 bytes (25.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.TextWriterTraceListener.dll: 55,296 bytes (54.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Diagnostics.TraceSource.dll: 141,312 bytes (138.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Drawing.Primitives.dll: 118,272 bytes (115.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Asn1.dll: 249,344 bytes (243.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Tar.dll: 316,416 bytes (309.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.Brotli.dll: 73,728 bytes (72.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.dll: 540,672 bytes (528.0 KB = 0.5 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.ZipFile.dll: 91,136 bytes (89.0 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Formats.Tar.dll: 314,368 bytes (307.0 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.Brotli.dll: 73,216 bytes (71.5 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.dll: 537,600 bytes (525.0 KB = 0.5 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Compression.ZipFile.dll: 90,624 bytes (88.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.AccessControl.dll: 22,528 bytes (22.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.DriveInfo.dll: 78,848 bytes (77.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.FileSystem.Watcher.dll: 111,616 bytes (109.0 KB = 0.1 MB) @@ -49,36 +49,36 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.IO.MemoryMappedFiles.dll: 84,480 b Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipelines.dll: 189,440 bytes (185.0 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipes.AccessControl.dll: 13,824 bytes (13.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.IO.Pipes.dll: 136,192 bytes (133.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.AsyncEnumerable.dll: 1,483,776 bytes (1,449.0 KB = 1.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.dll: 787,968 bytes (769.5 KB = 0.8 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.AsyncEnumerable.dll: 1,592,320 bytes (1,555.0 KB = 1.5 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.dll: 807,936 bytes (789.0 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Expressions.dll: 4,638,208 bytes (4,529.5 KB = 4.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Parallel.dll: 882,176 bytes (861.5 KB = 0.8 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Queryable.dll: 204,288 bytes (199.5 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Linq.Queryable.dll: 210,432 bytes (205.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Memory.dll: 154,624 bytes (151.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.dll: 1,875,456 bytes (1,831.5 KB = 1.8 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.dll: 1,869,312 bytes (1,825.5 KB = 1.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Http.Json.dll: 119,296 bytes (116.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.HttpListener.dll: 316,928 bytes (309.5 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Mail.dll: 530,432 bytes (518.0 KB = 0.5 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Mail.dll: 529,408 bytes (517.0 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.NameResolution.dll: 105,472 bytes (103.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.NetworkInformation.dll: 142,336 bytes (139.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Ping.dll: 88,576 bytes (86.5 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Ping.dll: 88,064 bytes (86.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Primitives.dll: 241,152 bytes (235.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Quic.dll: 372,224 bytes (363.5 KB = 0.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Requests.dll: 406,016 bytes (396.5 KB = 0.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Security.dll: 793,088 bytes (774.5 KB = 0.8 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Quic.dll: 371,712 bytes (363.0 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Requests.dll: 405,504 bytes (396.0 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Security.dll: 791,040 bytes (772.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.ServerSentEvents.dll: 67,584 bytes (66.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.Sockets.dll: 694,784 bytes (678.5 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebClient.dll: 166,912 bytes (163.0 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebHeaderCollection.dll: 52,224 bytes (51.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebProxy.dll: 26,624 bytes (26.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.Client.dll: 89,088 bytes (87.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.dll: 238,592 bytes (233.0 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Net.WebSockets.dll: 237,056 bytes (231.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.ObjectModel.dll: 67,072 bytes (65.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.CoreLib.dll: 17,900,032 bytes (17,480.5 KB = 17.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.DataContractSerialization.dll: 2,376,192 bytes (2,320.5 KB = 2.3 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.CoreLib.dll: 17,898,496 bytes (17,479.0 KB = 17.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.DataContractSerialization.dll: 2,375,168 bytes (2,319.5 KB = 2.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Uri.dll: 252,928 bytes (247.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.dll: 8,779,776 bytes (8,574.0 KB = 8.4 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.Linq.dll: 414,208 bytes (404.5 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.dll: 8,758,784 bytes (8,553.5 KB = 8.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Private.Xml.Linq.dll: 412,160 bytes (402.5 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.DispatchProxy.dll: 62,976 bytes (61.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Emit.dll: 335,872 bytes (328.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Reflection.Metadata.dll: 1,272,832 bytes (1,243.0 KB = 1.2 MB) @@ -96,7 +96,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Cryptography.dll: 2,458,1 Contents/MonoBundle/.xamarin/osx-arm64/System.Security.Principal.Windows.dll: 27,648 bytes (27.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encoding.CodePages.dll: 856,576 bytes (836.5 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Encodings.Web.dll: 113,152 bytes (110.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Json.dll: 2,158,080 bytes (2,107.5 KB = 2.1 MB) +Contents/MonoBundle/.xamarin/osx-arm64/System.Text.Json.dll: 2,176,000 bytes (2,125.0 KB = 2.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Text.RegularExpressions.dll: 1,179,648 bytes (1,152.0 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.AccessControl.dll: 23,552 bytes (23.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/System.Threading.Channels.dll: 155,136 bytes (151.5 KB = 0.1 MB) @@ -116,13 +116,13 @@ Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Hosting.Abstractions.d Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Logging.Abstractions.dll: 134,656 bytes (131.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Options.dll: 119,808 bytes (117.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Primitives.dll: 63,488 bytes (62.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 63,523,840 bytes (62,035.0 KB = 60.6 MB) +Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 63,523,328 bytes (62,034.5 KB = 60.6 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.Core.dll: 1,152,000 bytes (1,125.0 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Registry.dll: 23,040 bytes (22.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/SizeTestApp.dll: 9,728 bytes (9.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Concurrent.dll: 122,368 bytes (119.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.dll: 278,016 bytes (271.5 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Immutable.dll: 973,824 bytes (951.0 KB = 0.9 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Immutable.dll: 979,456 bytes (956.5 KB = 0.9 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.NonGeneric.dll: 82,432 bytes (80.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Collections.Specialized.dll: 82,432 bytes (80.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.Annotations.dll: 181,248 bytes (177.0 KB = 0.2 MB) @@ -131,19 +131,19 @@ Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.EventBasedAsync.dll: Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.Primitives.dll: 60,416 bytes (59.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ComponentModel.TypeConverter.dll: 752,640 bytes (735.0 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Console.dll: 188,416 bytes (184.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Data.Common.dll: 2,784,256 bytes (2,719.0 KB = 2.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Data.Common.dll: 2,783,744 bytes (2,718.5 KB = 2.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.DiagnosticSource.dll: 488,960 bytes (477.5 KB = 0.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.FileVersionInfo.dll: 33,280 bytes (32.5 KB = 0.0 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Process.dll: 305,152 bytes (298.0 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.Process.dll: 321,536 bytes (314.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.StackTrace.dll: 25,088 bytes (24.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.TextWriterTraceListener.dll: 48,640 bytes (47.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Diagnostics.TraceSource.dll: 120,832 bytes (118.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Drawing.Primitives.dll: 113,152 bytes (110.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Asn1.dll: 222,208 bytes (217.0 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Tar.dll: 274,944 bytes (268.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Formats.Tar.dll: 273,408 bytes (267.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.Brotli.dll: 63,488 bytes (62.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.dll: 465,920 bytes (455.0 KB = 0.4 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.ZipFile.dll: 81,920 bytes (80.0 KB = 0.1 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.dll: 463,360 bytes (452.5 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.IO.Compression.ZipFile.dll: 81,408 bytes (79.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.AccessControl.dll: 22,528 bytes (22.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.DriveInfo.dll: 69,120 bytes (67.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.FileSystem.Watcher.dll: 96,256 bytes (94.0 KB = 0.1 MB) @@ -152,38 +152,38 @@ Contents/MonoBundle/.xamarin/osx-x64/System.IO.MemoryMappedFiles.dll: 72,704 byt Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipelines.dll: 171,520 bytes (167.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipes.AccessControl.dll: 13,824 bytes (13.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.IO.Pipes.dll: 117,248 bytes (114.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Linq.AsyncEnumerable.dll: 1,320,960 bytes (1,290.0 KB = 1.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Linq.dll: 689,664 bytes (673.5 KB = 0.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Linq.AsyncEnumerable.dll: 1,416,192 bytes (1,383.0 KB = 1.4 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Linq.dll: 707,584 bytes (691.0 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Expressions.dll: 3,709,952 bytes (3,623.0 KB = 3.5 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Parallel.dll: 766,464 bytes (748.5 KB = 0.7 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Queryable.dll: 168,448 bytes (164.5 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Linq.Queryable.dll: 173,568 bytes (169.5 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Memory.dll: 142,336 bytes (139.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.dll: 1,654,272 bytes (1,615.5 KB = 1.6 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.dll: 1,648,640 bytes (1,610.0 KB = 1.6 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Http.Json.dll: 109,568 bytes (107.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.HttpListener.dll: 279,552 bytes (273.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Mail.dll: 462,336 bytes (451.5 KB = 0.4 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Mail.dll: 461,824 bytes (451.0 KB = 0.4 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.NameResolution.dll: 92,160 bytes (90.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.NetworkInformation.dll: 123,904 bytes (121.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Ping.dll: 78,336 bytes (76.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Primitives.dll: 212,480 bytes (207.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Quic.dll: 330,752 bytes (323.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Requests.dll: 352,256 bytes (344.0 KB = 0.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.Security.dll: 689,152 bytes (673.0 KB = 0.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Quic.dll: 330,240 bytes (322.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Requests.dll: 351,744 bytes (343.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.Security.dll: 687,104 bytes (671.0 KB = 0.7 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.ServerSentEvents.dll: 61,952 bytes (60.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.Sockets.dll: 594,944 bytes (581.0 KB = 0.6 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebClient.dll: 147,456 bytes (144.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebHeaderCollection.dll: 44,544 bytes (43.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebProxy.dll: 24,064 bytes (23.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.Client.dll: 79,872 bytes (78.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.dll: 212,992 bytes (208.0 KB = 0.2 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Net.WebSockets.dll: 211,968 bytes (207.0 KB = 0.2 MB) Contents/MonoBundle/.xamarin/osx-x64/System.ObjectModel.dll: 58,880 bytes (57.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.CoreLib.dll: 16,445,440 bytes (16,060.0 KB = 15.7 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.DataContractSerialization.dll: 2,049,536 bytes (2,001.5 KB = 2.0 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.CoreLib.dll: 16,443,904 bytes (16,058.5 KB = 15.7 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.DataContractSerialization.dll: 2,049,024 bytes (2,001.0 KB = 2.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Private.Uri.dll: 229,888 bytes (224.5 KB = 0.2 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.dll: 7,654,400 bytes (7,475.0 KB = 7.3 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.Linq.dll: 358,912 bytes (350.5 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.dll: 7,635,968 bytes (7,457.0 KB = 7.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Private.Xml.Linq.dll: 357,376 bytes (349.0 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.DispatchProxy.dll: 56,832 bytes (55.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.dll: 293,888 bytes (287.0 KB = 0.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Emit.dll: 294,400 bytes (287.5 KB = 0.3 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.Metadata.dll: 1,142,272 bytes (1,115.5 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Reflection.TypeExtensions.dll: 21,504 bytes (21.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Resources.Writer.dll: 32,256 bytes (31.5 KB = 0.0 MB) @@ -199,7 +199,7 @@ Contents/MonoBundle/.xamarin/osx-x64/System.Security.Cryptography.dll: 2,130,944 Contents/MonoBundle/.xamarin/osx-x64/System.Security.Principal.Windows.dll: 27,648 bytes (27.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encoding.CodePages.dll: 839,680 bytes (820.0 KB = 0.8 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.Encodings.Web.dll: 104,448 bytes (102.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/System.Text.Json.dll: 1,931,264 bytes (1,886.0 KB = 1.8 MB) +Contents/MonoBundle/.xamarin/osx-x64/System.Text.Json.dll: 1,947,136 bytes (1,901.5 KB = 1.9 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Text.RegularExpressions.dll: 1,052,160 bytes (1,027.5 KB = 1.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.AccessControl.dll: 23,040 bytes (22.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/System.Threading.Channels.dll: 139,264 bytes (136.0 KB = 0.1 MB) @@ -211,12 +211,12 @@ Contents/MonoBundle/.xamarin/osx-x64/System.Web.HttpUtility.dll: 43,008 bytes (4 Contents/MonoBundle/.xamarin/osx-x64/System.Xml.XPath.XDocument.dll: 6,656 bytes (6.5 KB = 0.0 MB) Contents/MonoBundle/libclrgc.dylib: 2,038,208 bytes (1,990.4 KB = 1.9 MB) Contents/MonoBundle/libclrgcexp.dylib: 2,198,640 bytes (2,147.1 KB = 2.1 MB) -Contents/MonoBundle/libclrjit.dylib: 6,522,368 bytes (6,369.5 KB = 6.2 MB) -Contents/MonoBundle/libcoreclr.dylib: 12,828,256 bytes (12,527.6 KB = 12.2 MB) +Contents/MonoBundle/libclrjit.dylib: 6,539,344 bytes (6,386.1 KB = 6.2 MB) +Contents/MonoBundle/libcoreclr.dylib: 12,844,608 bytes (12,543.6 KB = 12.2 MB) Contents/MonoBundle/libhostfxr.dylib: 833,536 bytes (814.0 KB = 0.8 MB) Contents/MonoBundle/libhostpolicy.dylib: 776,624 bytes (758.4 KB = 0.7 MB) -Contents/MonoBundle/libmscordaccore.dylib: 4,453,600 bytes (4,349.2 KB = 4.2 MB) -Contents/MonoBundle/libmscordbi.dylib: 3,447,008 bytes (3,366.2 KB = 3.3 MB) +Contents/MonoBundle/libmscordaccore.dylib: 4,453,664 bytes (4,349.3 KB = 4.2 MB) +Contents/MonoBundle/libmscordbi.dylib: 3,447,072 bytes (3,366.3 KB = 3.3 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 286,816 bytes (280.1 KB = 0.3 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: 3,278,688 bytes (3,201.8 KB = 3.1 MB) Contents/MonoBundle/libSystem.Native.dylib: 296,416 bytes (289.5 KB = 0.3 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt index e60c62cac310..4081c9ac55db 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 18,618,651 bytes (18,182.3 KB = 17.8 MB) +AppBundleSize: 18,618,623 bytes (18,182.2 KB = 17.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 2,644 bytes (2.6 KB = 0.0 MB) -Contents/Info.plist: 758 bytes (0.7 KB = 0.0 MB) +Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 18,613,152 bytes (18,176.9 KB = 17.8 MB) Contents/MonoBundle/runtimeconfig.bin: 1,848 bytes (1.8 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt index efbdf9add330..28731d741ecb 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 6,087,353 bytes (5,944.7 KB = 5.8 MB) +AppBundleSize: 6,087,325 bytes (5,944.7 KB = 5.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 2,644 bytes (2.6 KB = 0.0 MB) -Contents/Info.plist: 758 bytes (0.7 KB = 0.0 MB) +Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 6,081,936 bytes (5,939.4 KB = 5.8 MB) Contents/MonoBundle/runtimeconfig.bin: 1,766 bytes (1.7 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-Interpreter-size.txt b/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-Interpreter-size.txt index 70890eccf53e..065b5a6752ab 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-Interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-Interpreter-size.txt @@ -1,23 +1,23 @@ -AppBundleSize: 9,190,290 bytes (8,974.9 KB = 8.8 MB) +AppBundleSize: 9,190,122 bytes (8,974.7 KB = 8.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 9,851 bytes (9.6 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) Frameworks/libcoreclr.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libcoreclr.framework/Info.plist: 817 bytes (0.8 KB = 0.0 MB) +Frameworks/libcoreclr.framework/Info.plist: 789 bytes (0.8 KB = 0.0 MB) Frameworks/libcoreclr.framework/libcoreclr: 5,199,600 bytes (5,077.7 KB = 5.0 MB) Frameworks/libSystem.Globalization.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Globalization.Native.framework/Info.plist: 859 bytes (0.8 KB = 0.0 MB) +Frameworks/libSystem.Globalization.Native.framework/Info.plist: 831 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Globalization.Native.framework/libSystem.Globalization.Native: 109,776 bytes (107.2 KB = 0.1 MB) Frameworks/libSystem.IO.Compression.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.IO.Compression.Native.framework/Info.plist: 861 bytes (0.8 KB = 0.0 MB) +Frameworks/libSystem.IO.Compression.Native.framework/Info.plist: 833 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.IO.Compression.Native.framework/libSystem.IO.Compression.Native: 1,439,664 bytes (1,405.9 KB = 1.4 MB) Frameworks/libSystem.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Native.framework/Info.plist: 831 bytes (0.8 KB = 0.0 MB) +Frameworks/libSystem.Native.framework/Info.plist: 803 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Native.framework/libSystem.Native: 162,544 bytes (158.7 KB = 0.2 MB) Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/Info.plist: 887 bytes (0.9 KB = 0.0 MB) +Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/Info.plist: 859 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/libSystem.Security.Cryptography.Native.Apple: 215,440 bytes (210.4 KB = 0.2 MB) -Info.plist: 1,145 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) Microsoft.tvOS.dll: 99,840 bytes (97.5 KB = 0.1 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,481 bytes (1.4 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-R2R-size.txt b/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-R2R-size.txt index 6d9b9927ffd0..636bef87ff61 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-R2R-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-R2R-size.txt @@ -1,27 +1,27 @@ -AppBundleSize: 12,617,691 bytes (12,322.0 KB = 12.0 MB) +AppBundleSize: 12,616,983 bytes (12,321.3 KB = 12.0 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 10,737 bytes (10.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) Frameworks/libcoreclr.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libcoreclr.framework/Info.plist: 817 bytes (0.8 KB = 0.0 MB) +Frameworks/libcoreclr.framework/Info.plist: 789 bytes (0.8 KB = 0.0 MB) Frameworks/libcoreclr.framework/libcoreclr: 5,199,600 bytes (5,077.7 KB = 5.0 MB) Frameworks/libSystem.Globalization.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Globalization.Native.framework/Info.plist: 859 bytes (0.8 KB = 0.0 MB) +Frameworks/libSystem.Globalization.Native.framework/Info.plist: 831 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Globalization.Native.framework/libSystem.Globalization.Native: 109,776 bytes (107.2 KB = 0.1 MB) Frameworks/libSystem.IO.Compression.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.IO.Compression.Native.framework/Info.plist: 861 bytes (0.8 KB = 0.0 MB) +Frameworks/libSystem.IO.Compression.Native.framework/Info.plist: 833 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.IO.Compression.Native.framework/libSystem.IO.Compression.Native: 1,439,664 bytes (1,405.9 KB = 1.4 MB) Frameworks/libSystem.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Native.framework/Info.plist: 831 bytes (0.8 KB = 0.0 MB) +Frameworks/libSystem.Native.framework/Info.plist: 803 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Native.framework/libSystem.Native: 162,544 bytes (158.7 KB = 0.2 MB) Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/Info.plist: 887 bytes (0.9 KB = 0.0 MB) +Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/Info.plist: 859 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/libSystem.Security.Cryptography.Native.Apple: 215,440 bytes (210.4 KB = 0.2 MB) Frameworks/SizeTestApp.r2r.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/SizeTestApp.r2r.framework/Info.plist: 829 bytes (0.8 KB = 0.0 MB) +Frameworks/SizeTestApp.r2r.framework/Info.plist: 801 bytes (0.8 KB = 0.0 MB) Frameworks/SizeTestApp.r2r.framework/SizeTestApp.r2r: 3,424,784 bytes (3,344.5 KB = 3.3 MB) -Info.plist: 1,145 bytes (1.1 KB = 0.0 MB) -Microsoft.tvOS.dll: 99,328 bytes (97.0 KB = 0.1 MB) +Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) +Microsoft.tvOS.dll: 98,816 bytes (96.5 KB = 0.1 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,481 bytes (1.4 KB = 0.0 MB) SizeTestApp: 197,152 bytes (192.5 KB = 0.2 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt index 9dbf0fd7aae0..ce0b35a3d9fb 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 3,635,837 bytes (3,550.6 KB = 3.5 MB) +AppBundleSize: 3,635,809 bytes (3,550.6 KB = 3.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 3,999 bytes (3.9 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,145 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) Microsoft.tvOS.dll: 155,136 bytes (151.5 KB = 0.1 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,405 bytes (1.4 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt index d1e64da7589c..56c9b7ff9628 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 9,563,331 bytes (9,339.2 KB = 9.1 MB) +AppBundleSize: 9,563,303 bytes (9,339.2 KB = 9.1 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 5,233 bytes (5.1 KB = 0.0 MB) aot-instances.aotdata.arm64: 829,256 bytes (809.8 KB = 0.8 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,145 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) Microsoft.tvOS.aotdata.arm64: 22,640 bytes (22.1 KB = 0.0 MB) Microsoft.tvOS.dll: 49,152 bytes (48.0 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt index 367ee371d7e0..b7b03f85ddc8 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 7,921,359 bytes (7,735.7 KB = 7.6 MB) +AppBundleSize: 7,921,331 bytes (7,735.7 KB = 7.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,145 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,889 bytes (1.8 KB = 0.0 MB) SizeTestApp: 7,915,344 bytes (7,729.8 KB = 7.5 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt index 9534c1fa2f88..0d2e37094af4 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 2,848,974 bytes (2,782.2 KB = 2.7 MB) +AppBundleSize: 2,848,946 bytes (2,782.2 KB = 2.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,145 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) SizeTestApp: 2,843,040 bytes (2,776.4 KB = 2.7 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-CoreCLR-Interpreter-size.txt b/tests/dotnet/UnitTests/expected/iOS-CoreCLR-Interpreter-size.txt index ea8079904daa..cccd431bc585 100644 --- a/tests/dotnet/UnitTests/expected/iOS-CoreCLR-Interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-CoreCLR-Interpreter-size.txt @@ -1,26 +1,26 @@ -AppBundleSize: 9,258,557 bytes (9,041.6 KB = 8.8 MB) +AppBundleSize: 9,258,361 bytes (9,041.4 KB = 8.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 10,847 bytes (10.6 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) Frameworks/libcoreclr.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libcoreclr.framework/Info.plist: 841 bytes (0.8 KB = 0.0 MB) +Frameworks/libcoreclr.framework/Info.plist: 813 bytes (0.8 KB = 0.0 MB) Frameworks/libcoreclr.framework/libcoreclr: 5,187,184 bytes (5,065.6 KB = 4.9 MB) Frameworks/libSystem.Globalization.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Globalization.Native.framework/Info.plist: 883 bytes (0.9 KB = 0.0 MB) +Frameworks/libSystem.Globalization.Native.framework/Info.plist: 855 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Globalization.Native.framework/libSystem.Globalization.Native: 109,232 bytes (106.7 KB = 0.1 MB) Frameworks/libSystem.IO.Compression.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.IO.Compression.Native.framework/Info.plist: 885 bytes (0.9 KB = 0.0 MB) +Frameworks/libSystem.IO.Compression.Native.framework/Info.plist: 857 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.IO.Compression.Native.framework/libSystem.IO.Compression.Native: 1,431,408 bytes (1,397.9 KB = 1.4 MB) Frameworks/libSystem.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Native.framework/Info.plist: 855 bytes (0.8 KB = 0.0 MB) +Frameworks/libSystem.Native.framework/Info.plist: 827 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Native.framework/libSystem.Native: 162,336 bytes (158.5 KB = 0.2 MB) Frameworks/libSystem.Net.Security.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Net.Security.Native.framework/Info.plist: 881 bytes (0.9 KB = 0.0 MB) +Frameworks/libSystem.Net.Security.Native.framework/Info.plist: 853 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Net.Security.Native.framework/libSystem.Net.Security.Native: 88,000 bytes (85.9 KB = 0.1 MB) Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/Info.plist: 911 bytes (0.9 KB = 0.0 MB) +Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/Info.plist: 883 bytes (0.9 KB = 0.0 MB) Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/libSystem.Security.Cryptography.Native.Apple: 214,336 bytes (209.3 KB = 0.2 MB) -Info.plist: 1,169 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) Microsoft.iOS.dll: 99,840 bytes (97.5 KB = 0.1 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,481 bytes (1.4 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-CoreCLR-R2R-size.txt b/tests/dotnet/UnitTests/expected/iOS-CoreCLR-R2R-size.txt index abf68871523f..c62020ac0e47 100644 --- a/tests/dotnet/UnitTests/expected/iOS-CoreCLR-R2R-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-CoreCLR-R2R-size.txt @@ -1,30 +1,30 @@ -AppBundleSize: 12,666,142 bytes (12,369.3 KB = 12.1 MB) +AppBundleSize: 12,665,406 bytes (12,368.6 KB = 12.1 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 11,733 bytes (11.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) Frameworks/libcoreclr.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libcoreclr.framework/Info.plist: 841 bytes (0.8 KB = 0.0 MB) +Frameworks/libcoreclr.framework/Info.plist: 813 bytes (0.8 KB = 0.0 MB) Frameworks/libcoreclr.framework/libcoreclr: 5,187,184 bytes (5,065.6 KB = 4.9 MB) Frameworks/libSystem.Globalization.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Globalization.Native.framework/Info.plist: 883 bytes (0.9 KB = 0.0 MB) +Frameworks/libSystem.Globalization.Native.framework/Info.plist: 855 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Globalization.Native.framework/libSystem.Globalization.Native: 109,232 bytes (106.7 KB = 0.1 MB) Frameworks/libSystem.IO.Compression.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.IO.Compression.Native.framework/Info.plist: 885 bytes (0.9 KB = 0.0 MB) +Frameworks/libSystem.IO.Compression.Native.framework/Info.plist: 857 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.IO.Compression.Native.framework/libSystem.IO.Compression.Native: 1,431,408 bytes (1,397.9 KB = 1.4 MB) Frameworks/libSystem.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Native.framework/Info.plist: 855 bytes (0.8 KB = 0.0 MB) +Frameworks/libSystem.Native.framework/Info.plist: 827 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Native.framework/libSystem.Native: 162,336 bytes (158.5 KB = 0.2 MB) Frameworks/libSystem.Net.Security.Native.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Net.Security.Native.framework/Info.plist: 881 bytes (0.9 KB = 0.0 MB) +Frameworks/libSystem.Net.Security.Native.framework/Info.plist: 853 bytes (0.8 KB = 0.0 MB) Frameworks/libSystem.Net.Security.Native.framework/libSystem.Net.Security.Native: 88,000 bytes (85.9 KB = 0.1 MB) Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/Info.plist: 911 bytes (0.9 KB = 0.0 MB) +Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/Info.plist: 883 bytes (0.9 KB = 0.0 MB) Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/libSystem.Security.Cryptography.Native.Apple: 214,336 bytes (209.3 KB = 0.2 MB) Frameworks/SizeTestApp.r2r.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) -Frameworks/SizeTestApp.r2r.framework/Info.plist: 853 bytes (0.8 KB = 0.0 MB) +Frameworks/SizeTestApp.r2r.framework/Info.plist: 825 bytes (0.8 KB = 0.0 MB) Frameworks/SizeTestApp.r2r.framework/SizeTestApp.r2r: 3,404,976 bytes (3,325.2 KB = 3.2 MB) -Info.plist: 1,169 bytes (1.1 KB = 0.0 MB) -Microsoft.iOS.dll: 99,328 bytes (97.0 KB = 0.1 MB) +Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) +Microsoft.iOS.dll: 98,816 bytes (96.5 KB = 0.1 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,481 bytes (1.4 KB = 0.0 MB) SizeTestApp: 196,096 bytes (191.5 KB = 0.2 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt b/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt index 4e4868e0aa61..07fd579da858 100644 --- a/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 3,622,275 bytes (3,537.4 KB = 3.5 MB) +AppBundleSize: 3,622,247 bytes (3,537.4 KB = 3.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 3,997 bytes (3.9 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,169 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) Microsoft.iOS.dll: 155,136 bytes (151.5 KB = 0.1 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,405 bytes (1.4 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt index 6165edbe6698..656a8acf8ab8 100644 --- a/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 9,520,311 bytes (9,297.2 KB = 9.1 MB) +AppBundleSize: 9,520,283 bytes (9,297.2 KB = 9.1 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 5,229 bytes (5.1 KB = 0.0 MB) aot-instances.aotdata.arm64: 829,256 bytes (809.8 KB = 0.8 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,169 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) Microsoft.iOS.aotdata.arm64: 22,992 bytes (22.5 KB = 0.0 MB) Microsoft.iOS.dll: 49,152 bytes (48.0 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt index b0016b6c8718..180e0f612d11 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 9,054,838 bytes (8,842.6 KB = 8.6 MB) +AppBundleSize: 9,054,810 bytes (8,842.6 KB = 8.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,169 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,888 bytes (1.8 KB = 0.0 MB) SizeTestApp: 9,048,800 bytes (8,836.7 KB = 8.6 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt index 713aa700f7b8..bca8809ca15f 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 2,849,318 bytes (2,782.5 KB = 2.7 MB) +AppBundleSize: 2,849,290 bytes (2,782.5 KB = 2.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,169 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) SizeTestApp: 2,843,360 bytes (2,776.7 KB = 2.7 MB) From c133be8d71b210e1f808543de720463835697f50 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Tue, 5 May 2026 20:34:40 +0200 Subject: [PATCH 19/35] [tests] Fix flaky CtorIPAddressPair test. Fixes #25242 (#25308) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix the flaky `NetworkReachabilityTest.CtorIPAddressPair` test (monotouch-test, macOS). **Two sources of flakiness addressed:** 1. **DNS resolution failure**: `Dns.GetHostAddresses("apple.com")` can throw when DNS is unavailable in CI. Wrapped in try-catch with `TestRuntime.IgnoreInCIIfBadNetwork` so transient DNS failures are only ignored on CI (locally the test still fails). 2. **Overly strict flags assertion**: The remote-address flags check required exactly `Reachable` (after stripping `TransientConnection`). Different OS versions can report additional flags like `ConnectionRequired`. Added a `CheckRemoteFlags` helper that verifies `Reachable` is set and no unexpected flags appear — matching the existing `CheckLoopbackFlags` philosophy. **Other changes:** - Added `NetworkResources.AppleHost` constant instead of hardcoding `"apple.com"` in the test. Fixes https://github.com/dotnet/macios/issues/25242 🤖 Pull request created by Copilot --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../System.Net.Http/NetworkResources.cs | 1 + .../NetworkReachabilityTest.cs | 36 +++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/tests/monotouch-test/System.Net.Http/NetworkResources.cs b/tests/monotouch-test/System.Net.Http/NetworkResources.cs index 99fe7fc5c24f..6fa21fe58507 100644 --- a/tests/monotouch-test/System.Net.Http/NetworkResources.cs +++ b/tests/monotouch-test/System.Net.Http/NetworkResources.cs @@ -6,6 +6,7 @@ namespace MonoTests.System.Net.Http { [Preserve (AllMembers = true)] public static class NetworkResources { + public const string AppleHost = "apple.com"; public static string MicrosoftUrl => AssertNetworkConnection ("https://www.microsoft.com"); public static Uri MicrosoftUri => new Uri (MicrosoftUrl); public static string MicrosoftHttpUrl => AssertNetworkConnection ("http://www.microsoft.com"); diff --git a/tests/monotouch-test/SystemConfiguration/NetworkReachabilityTest.cs b/tests/monotouch-test/SystemConfiguration/NetworkReachabilityTest.cs index e4da98fe4040..6da03dae47e2 100644 --- a/tests/monotouch-test/SystemConfiguration/NetworkReachabilityTest.cs +++ b/tests/monotouch-test/SystemConfiguration/NetworkReachabilityTest.cs @@ -14,6 +14,8 @@ using System.Net; using System.Threading; using System.Threading.Tasks; +using System.Net.Sockets; +using MonoTests.System.Net.Http; namespace MonoTouchFixtures.SystemConfiguration { @@ -78,7 +80,23 @@ public void CtorIPAddress () [Test] public void CtorIPAddressPair () { - var address = Dns.GetHostAddresses ("apple.com") [0]; + IPAddress address; + try { + var addresses = Dns.GetHostAddresses (NetworkResources.AppleHost); + address = null; + foreach (var candidate in addresses) { + if (candidate.AddressFamily == AddressFamily.InterNetwork) { + address = candidate; + break; + } + } + if (address is null) + throw new InvalidOperationException ("No IPv4 address found."); + } catch (Exception e) { + TestRuntime.IgnoreInCIIfBadNetwork (e); + throw; + } + using (var nr = new NetworkReachability (IPAddress.Loopback, address)) { NetworkReachabilityFlags flags; @@ -90,8 +108,9 @@ public void CtorIPAddressPair () NetworkReachabilityFlags flags; Assert.IsTrue (nr.TryGetFlags (out flags), "#2"); - flags &= ~NetworkReachabilityFlags.TransientConnection; // Remove the TransientConnection flag if it's set - Assert.That (flags, Is.EqualTo (NetworkReachabilityFlags.Reachable), "#2 Reachable"); + // Different OS versions report different flags, so just + // check that Reachable is set and no unexpected flags appear. + CheckRemoteFlags (flags, "2"); } using (var nr = new NetworkReachability (IPAddress.Loopback, null)) { @@ -114,6 +133,17 @@ void CheckLoopbackFlags (NetworkReachabilityFlags flags, string number, bool has Assert.AreEqual (noFlags, otherFlags, $"#{number} No other flags: {flags.ToString ()}"); } + void CheckRemoteFlags (NetworkReachabilityFlags flags, string number) + { + var noFlags = (NetworkReachabilityFlags) 0; + var otherFlags = (flags & ~(NetworkReachabilityFlags.Reachable | NetworkReachabilityFlags.TransientConnection | NetworkReachabilityFlags.ConnectionRequired)); + + // Different versions of OSes report different flags, so just + // verify Reachable is set and no unexpected flags appear. + Assert.That (flags & NetworkReachabilityFlags.Reachable, Is.Not.EqualTo (noFlags), $"#{number} Reachable: {flags.ToString ()}"); + Assert.AreEqual (noFlags, otherFlags, $"#{number} No other flags: {flags.ToString ()}"); + } + [Test] public void Ctor_Invalid () { From ab1fe6faa2bcf74a16c855bac64eaae7a4e009cc Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 07:10:07 +0000 Subject: [PATCH 20/35] [main] Update dependencies from dotnet/macios (#25342) This pull request updates the following dependencies ## From https://github.com/dotnet/macios - **Subscription**: [c0371266-dd6f-4959-822b-decc72d2d668](https://maestro.dot.net/subscriptions?search=c0371266-dd6f-4959-822b-decc72d2d668) - **Build**: [20260505.2](https://dev.azure.com/devdiv/DevDiv/_build/results?buildId=14015156) ([313025](https://maestro.dot.net/channel/3884/github:dotnet:macios/build/313025)) - **Date Produced**: May 5, 2026 8:39:54 AM UTC - **Commit**: [ceb40a14f584bcd835da2051360df596f77d9dae](https://github.com/dotnet/macios/commit/ceb40a14f584bcd835da2051360df596f77d9dae) - **Branch**: [release/9.0.1xx](https://github.com/dotnet/macios/tree/release/9.0.1xx) - **Dependency Updates**: - From [26.4.9015 to 26.4.9016][1] - Microsoft.iOS.Sdk.net9.0_26.4 - Microsoft.MacCatalyst.Sdk.net9.0_26.4 - Microsoft.macOS.Sdk.net9.0_26.4 - Microsoft.tvOS.Sdk.net9.0_26.4 [1]: https://github.com/dotnet/macios/compare/ac80159dab...ceb40a14f5 --- NuGet.config | 3 +-- eng/Version.Details.props | 8 ++++---- eng/Version.Details.xml | 16 ++++++++-------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/NuGet.config b/NuGet.config index 75219c2881e1..e528f7299264 100644 --- a/NuGet.config +++ b/NuGet.config @@ -12,8 +12,7 @@ - - + diff --git a/eng/Version.Details.props b/eng/Version.Details.props index 1f6015e97f8b..9db3ac6e2428 100644 --- a/eng/Version.Details.props +++ b/eng/Version.Details.props @@ -19,16 +19,16 @@ This file should be imported by eng/Versions.props 26.0.11017 18.5.9227 - 26.4.9015 + 26.4.9016 26.0.11017 18.5.9227 - 26.4.9015 + 26.4.9016 26.0.11017 15.5.9227 - 26.4.9015 + 26.4.9016 26.0.11017 18.5.9227 - 26.4.9015 + 26.4.9016 11.0.0-prerelease.26230.4 diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5b24b5001ad7..72646c0712a2 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -60,21 +60,21 @@ 797d30720e5e629d23eb146935da94cb1b61047e - + https://github.com/dotnet/macios - ac80159dab3bdd969c7e38fceb02499d3be92ac4 + ceb40a14f584bcd835da2051360df596f77d9dae - + https://github.com/dotnet/macios - ac80159dab3bdd969c7e38fceb02499d3be92ac4 + ceb40a14f584bcd835da2051360df596f77d9dae - + https://github.com/dotnet/macios - ac80159dab3bdd969c7e38fceb02499d3be92ac4 + ceb40a14f584bcd835da2051360df596f77d9dae - + https://github.com/dotnet/macios - ac80159dab3bdd969c7e38fceb02499d3be92ac4 + ceb40a14f584bcd835da2051360df596f77d9dae From d0878f8cd85d9711d2b3322d2eddc8a1dba35565 Mon Sep 17 00:00:00 2001 From: "CSIGS@microsoft.com" Date: Wed, 6 May 2026 00:33:53 -0700 Subject: [PATCH 21/35] LEGO: Pull request from lego/hb_5df43909-4a19-4f55-bc3f-9ea8fccf3c82_20260506054941025 to main (#25343) LEGO: Pull request from lego/hb_5df43909-4a19-4f55-bc3f-9ea8fccf3c82_20260506054941025 to main with localized lcls --- .../ko/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ .../tr/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/macios/Localize/loc/ko/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/ko/macios/tools/mtouch/Errors.resx.lcl index bc908620c830..88ca649db7d8 100644 --- a/macios/Localize/loc/ko/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/ko/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/macios/Localize/loc/tr/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/tr/macios/tools/mtouch/Errors.resx.lcl index 0b6e0841f004..2aeda18d004b 100644 --- a/macios/Localize/loc/tr/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/tr/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + From 4ca444147b0109d2ac979c0d476572e254a61c9d Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 6 May 2026 14:18:03 +0200 Subject: [PATCH 22/35] =?UTF-8?q?[src]=20Fix=20typo=20in=20src/Simd/README?= =?UTF-8?q?.md:=20"43-bit"=20=E2=86=92=20"32-bit"=20for=20NVector3i=20(#25?= =?UTF-8?q?334)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Line 156 of `src/Simd/README.md` described `NVector3i` as "A vector of 3 43-bit ints.", which is a factual error. `NVector3i` wraps the native `simd_int3` / `vector_int3` type, which is a vector of three **32-bit** signed integers. The sibling types `NVector2i` and `NVector4i` already correctly say "32-bit" in the same file. **Change:** `43-bit` → `32-bit` on line 156 — documentation only, no code changes. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/Simd/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simd/README.md b/src/Simd/README.md index f49e9bfadcd0..dcc3e637ab1c 100644 --- a/src/Simd/README.md +++ b/src/Simd/README.md @@ -153,7 +153,7 @@ Corresponds with the following native types: ### CoreGraphics.NVector3i -A vector of 3 43-bit ints. +A vector of 3 32-bit ints. For memory alignment purposes, this vector has a length of 4 ints, which means that the size of this struct is 16 bytes (and not 12 bytes). From 92eebd05c9767dd69d7711f492e53ab240427685 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Wed, 6 May 2026 14:34:46 +0200 Subject: [PATCH 23/35] [docs] Fix stale .NET 6 framing and update archived xamarin-android link in SingleProject.md (#25335) ## Summary Two stale references in `dotnet/SingleProject.md`: 1. **Stale .NET version framing** (line 21): The doc said `GenerateApplicationManifest` defaults to `true` "for .NET 6, and not for 'legacy' Xamarin.iOS/Xamarin.Mac". .NET 6 is EOL and the repo now targets net11.0. Updated to say "the default for all supported .NET versions". 2. **Archived repository link** (line 33): Link `[1]` pointed to a pinned SHA on the archived `xamarin/xamarin-android` repo. That repo was renamed to `dotnet/android`. Updated to point to the current `dotnet/android` main branch. ## Changes - `dotnet/SingleProject.md`: 2-line doc-only fix --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- dotnet/SingleProject.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dotnet/SingleProject.md b/dotnet/SingleProject.md index be4729e9d046..9a20de442520 100644 --- a/dotnet/SingleProject.md +++ b/dotnet/SingleProject.md @@ -18,8 +18,7 @@ Info.plist in the project doesn't already contain entries for these keys): | ApplicationDisplayVersion | CFBundleShortVersionString | Defaults to ApplicationVersion when blank | This is only enabled if the `GenerateApplicationManifest` is set to `true` -(which is the default for `.NET 6`, and not for "legacy" -Xamarin.iOS/Xamarin.Mac) +(which is the default for all supported .NET versions) Additionally, `$(ApplicationDisplayVersion)` will overwrite the value for `$(Version)`, so the following properties will be set with the same value: @@ -30,5 +29,5 @@ so the following properties will be set with the same value: Ref: [Issue #10473][2] -[1]: https://github.com/xamarin/xamarin-android/blob/40cedfa89c2660479fcb5e2482d2463fbcad1d04/Documentation/guides/OneDotNetSingleProject.md +[1]: https://github.com/dotnet/android/blob/main/Documentation/guides/OneDotNetSingleProject.md [2]: https://github.com/dotnet/macios/issues/10473 From 7ed1ea81b712761818dfbfde0fc5f92c9da09b55 Mon Sep 17 00:00:00 2001 From: "CSIGS@microsoft.com" Date: Wed, 6 May 2026 10:20:46 -0700 Subject: [PATCH 24/35] LEGO: Pull request from lego/hb_5df43909-4a19-4f55-bc3f-9ea8fccf3c82_20260505174743293 to main (#25338) LEGO: Pull request from lego/hb_5df43909-4a19-4f55-bc3f-9ea8fccf3c82_20260505174743293 to main with localized lcls --- .../de/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ .../it/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ .../ja/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ .../pl/macios/tools/mtouch/Errors.resx.lcl | 27 +++++++++++++++++++ 4 files changed, 108 insertions(+) diff --git a/macios/Localize/loc/de/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/de/macios/tools/mtouch/Errors.resx.lcl index fc5a683a52d9..53208ba1ba08 100644 --- a/macios/Localize/loc/de/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/de/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/macios/Localize/loc/it/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/it/macios/tools/mtouch/Errors.resx.lcl index ae92e92ba6f7..db37a2986208 100644 --- a/macios/Localize/loc/it/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/it/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/macios/Localize/loc/ja/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/ja/macios/tools/mtouch/Errors.resx.lcl index ac518a9e3efd..b3fd520db049 100644 --- a/macios/Localize/loc/ja/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/ja/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/macios/Localize/loc/pl/macios/tools/mtouch/Errors.resx.lcl b/macios/Localize/loc/pl/macios/tools/mtouch/Errors.resx.lcl index b51dc49757b8..ce7aec51d493 100644 --- a/macios/Localize/loc/pl/macios/tools/mtouch/Errors.resx.lcl +++ b/macios/Localize/loc/pl/macios/tools/mtouch/Errors.resx.lcl @@ -4552,6 +4552,15 @@ + + + + + + + + + @@ -4882,6 +4891,24 @@ + + + + + + + + + + + + + + + + + + From 021897d03119c2200ff2272ae4cb42dbe5e99019 Mon Sep 17 00:00:00 2001 From: Rui Marinho Date: Thu, 7 May 2026 06:47:19 +0100 Subject: [PATCH 25/35] [msbuild] Use shared SimctlOutputParser from Xamarin.MacDev for simctl JSON parsing (#24856) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary This PR refactors `GetAvailableDevices.RunSimCtlAsync` to use the shared `SimctlOutputParser` from the `Xamarin.MacDev` submodule (`dotnet/macios-devtools`) instead of inline JSON parsing. ### What this PR does 1. **Updates the submodule** to include the new `SimctlOutputParser` and model classes (main branch, SHA `10a0c3c`) 2. **Replaces inline simctl JSON parsing** in `RunSimCtlAsync` with: - `SimctlOutputParser.ParseDevices(json)` — typed `SimulatorDeviceInfo` objects - `SimctlOutputParser.ParseRuntimes(json)` — typed `SimulatorRuntimeInfo` objects - `SimctlOutputParser.ParseDeviceTypes(json)` — typed `SimulatorDeviceTypeInfo` objects - `DeviceCtlOutputParser.ParseDevices(json)` — typed physical device info 3. **Preserves all business logic** — MSBuild metadata, devicetypes lookup, RuntimeIdentifier computation, platform filtering ### Build fixes included - Suppress CS0618 for `AppleSdkSettings` obsolete warnings - Fix nullability mismatches (CS8604/CS8620) ### Dependencies - Submodule points to macios-devtools `main` --------- Co-authored-by: Rui Marinho Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Rolf Bjarne Kvinge --- Make.config | 5 + external/Xamarin.MacDev | 2 +- msbuild/ILMerge.targets | 2 +- msbuild/Makefile | 2 +- .../Tasks/GetAvailableDevices.cs | 417 ++++++++---------- .../Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs | 8 +- .../Xamarin.MacDev.Tasks.csproj | 1 + tests/Makefile | 4 +- .../TaskTests/GetAvailableDevicesTest.cs | 14 +- 9 files changed, 207 insertions(+), 248 deletions(-) diff --git a/Make.config b/Make.config index 8880e28369bd..6b05741960fc 100644 --- a/Make.config +++ b/Make.config @@ -248,6 +248,11 @@ export DOTNET_CLI_WORKLOAD_UPDATE_NOTIFY_DISABLE=true # We don't need to be told we're using preview packages (we pretty much always are). export SuppressNETCoreSdkPreviewMessage=true +# The Arcade SDK imported by the Xamarin.MacDev submodule overrides +# NuGetPackageRoot in CI, breaking the netstandard2.0 build. +# Pass the correct path explicitly. +export NuGetPackageRoot=$(abspath $(TOP)/packages)/ + # Minimum OSX versions for building XI/XM MIN_OSX_BUILD_VERSION=15.3 diff --git a/external/Xamarin.MacDev b/external/Xamarin.MacDev index f1300986199f..11fad7fe464a 160000 --- a/external/Xamarin.MacDev +++ b/external/Xamarin.MacDev @@ -1 +1 @@ -Subproject commit f1300986199f5489191d2c9712e57bf8a0a3d84a +Subproject commit 11fad7fe464a7de7dd809542e4bb352310236052 diff --git a/msbuild/ILMerge.targets b/msbuild/ILMerge.targets index f2e8caa95328..d8c87c68fccf 100644 --- a/msbuild/ILMerge.targets +++ b/msbuild/ILMerge.targets @@ -17,7 +17,7 @@ - + diff --git a/msbuild/Makefile b/msbuild/Makefile index 436e22a2c71c..c676c92ca83a 100644 --- a/msbuild/Makefile +++ b/msbuild/Makefile @@ -137,7 +137,7 @@ endif # I haven't found a way to execute ilrepack.exe on .NET (it will probably have to be built for .NET), so run it using Mono. .build-stamp: $(ALL_SOURCES) - $(Q) $(DOTNET) build "/bl:$@.binlog" $(XBUILD_VERBOSITY) + $(Q) $(DOTNET) build "/bl:$@.binlog" $(XBUILD_VERBOSITY) /p:NuGetPackageRoot=$(abspath $(TOP)/packages)/ $(Q) touch $@ # make all the target assemblies build when any of the sources have changed diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetAvailableDevices.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetAvailableDevices.cs index eda5380ab2d9..57ecb577164d 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/GetAvailableDevices.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/GetAvailableDevices.cs @@ -2,13 +2,13 @@ using System.IO; using System.Collections.Generic; using System.Linq; -using System.Text.Json; using System.Threading; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Xamarin.Localization.MSBuild; +using Xamarin.MacDev.Models; using Xamarin.Messaging.Build.Client; using Xamarin.Utils; @@ -161,265 +161,218 @@ protected virtual async System.Threading.Tasks.Task ExecuteCtlAsync (par } } - async System.Threading.Tasks.Task ExecuteCtlToJsonAsync (params string [] args) - { - var json = await ExecuteCtlAsync (args); - var options = new JsonDocumentOptions { - AllowTrailingCommas = true, - CommentHandling = JsonCommentHandling.Skip, - }; - return JsonDocument.Parse (string.IsNullOrEmpty (json) ? "{}" : json, options); - } - async System.Threading.Tasks.Task> RunDeviceCtlAsync () { - var doc = await ExecuteCtlToJsonAsync ("devicectl", "list", "devices"); - var array = doc.FindProperty ("result", "devices")?.EnumerateIfArray (); + var json = await ExecuteCtlAsync ("devicectl", "list", "devices"); var rv = new List (); - if (array is not null) { - foreach (var device in array) { - var name = device.GetStringPropertyOrEmpty ("deviceProperties", "name"); - var udid = device.GetStringPropertyOrEmpty ("hardwareProperties", "udid"); - var identifier = device.GetStringPropertyOrEmpty ("identifier"); - - var deviceProperties = device.GetNullableProperty ("deviceProperties"); - var buildVersion = deviceProperties.GetStringPropertyOrEmpty ("osBuildUpdate"); - var productVersion = deviceProperties.GetStringPropertyOrEmpty ("osVersionNumber"); - - var hardwareProperties = device.GetNullableProperty ("hardwareProperties"); - var deviceClass = hardwareProperties.GetStringPropertyOrEmpty ("deviceType"); - var hardwareModel = hardwareProperties.GetStringPropertyOrEmpty ("hardwareModel"); - var hardwarePlatform = hardwareProperties.GetStringPropertyOrEmpty ("platform"); - var productType = hardwareProperties.GetStringPropertyOrEmpty ("productType"); - var serialNumber = hardwareProperties.GetStringPropertyOrEmpty ("serialNumber"); - var uniqueChipID = hardwareProperties.GetUInt64Property ("ecid"); - - var cpuType = hardwareProperties.GetNullableProperty ("cpuType"); - var cpuArchitecture = cpuType.GetStringPropertyOrEmpty ("name"); - - var connectionProperties = device.GetNullableProperty ("connectionProperties"); - var transportType = connectionProperties.GetStringPropertyOrEmpty ("transportType"); - var pairingState = connectionProperties.GetStringPropertyOrEmpty ("pairingState"); - - if (string.IsNullOrEmpty (udid)) - udid = identifier; - - if (string.IsNullOrEmpty (udid)) - udid = $""; - - var item = new TaskItem (udid); - item.SetMetadata ("Name", name); - item.SetMetadata ("BuildVersion", buildVersion); - item.SetMetadata ("DeviceClass", deviceClass); - item.SetMetadata ("HardwareModel", hardwareModel); - item.SetMetadata ("Platform", hardwarePlatform); - item.SetMetadata ("ProductType", productType); - item.SetMetadata ("SerialNumber", serialNumber); - item.SetMetadata ("UniqueChipID", uniqueChipID?.ToString () ?? string.Empty); - item.SetMetadata ("CPUArchitecture", cpuArchitecture); - item.SetMetadata ("TransportType", transportType); - item.SetMetadata ("PairingState", pairingState); - - // we provide the following metadata for both simulator and device - item.SetMetadata ("Description", name); - item.SetMetadata ("Type", "Device"); - item.SetMetadata ("OSVersion", productVersion); - item.SetMetadata ("UDID", udid); - - // compute the platform and runtime identifier - var runtimeIdentifier = ""; - ApplePlatform platform; - IPhoneDeviceType deviceType; - var discardedReason = ""; - switch (deviceClass.ToLowerInvariant ()) { - case "iphone": - case "ipod": - runtimeIdentifier += "ios-"; - platform = ApplePlatform.iOS; - deviceType = IPhoneDeviceType.IPhone; - break; - case "ipad": - runtimeIdentifier += "ios-"; - platform = ApplePlatform.iOS; - deviceType = IPhoneDeviceType.IPad; - break; - case "appletv": - runtimeIdentifier += "tvos-"; - platform = ApplePlatform.TVOS; - deviceType = IPhoneDeviceType.TV; + + // Use shared parser from Xamarin.MacDev for devicectl JSON extraction + var parsedDevices = DeviceCtlOutputParser.ParseDevices (json); + + foreach (var device in parsedDevices) { + var udid = device.Udid; + + if (string.IsNullOrEmpty (udid)) + udid = $""; + + var item = new TaskItem (udid); + item.SetMetadata ("Name", device.Name); + item.SetMetadata ("BuildVersion", device.BuildVersion); + item.SetMetadata ("DeviceClass", device.DeviceClass); + item.SetMetadata ("HardwareModel", device.HardwareModel); + item.SetMetadata ("Platform", device.Platform); + item.SetMetadata ("ProductType", device.ProductType); + item.SetMetadata ("SerialNumber", device.SerialNumber); + item.SetMetadata ("UniqueChipID", device.UniqueChipID?.ToString () ?? string.Empty); + item.SetMetadata ("CPUArchitecture", device.CpuArchitecture); + item.SetMetadata ("TransportType", device.TransportType); + item.SetMetadata ("PairingState", device.PairingState); + + // we provide the following metadata for both simulator and device + item.SetMetadata ("Description", device.Name); + item.SetMetadata ("Type", "Device"); + item.SetMetadata ("OSVersion", device.OSVersion); + item.SetMetadata ("UDID", udid); + + // compute the platform and runtime identifier + var runtimeIdentifier = ""; + ApplePlatform platform; + IPhoneDeviceType deviceType; + var discardedReason = ""; + switch (device.DeviceClass.ToLowerInvariant ()) { + case "iphone": + case "ipod": + runtimeIdentifier += "ios-"; + platform = ApplePlatform.iOS; + deviceType = IPhoneDeviceType.IPhone; + break; + case "ipad": + runtimeIdentifier += "ios-"; + platform = ApplePlatform.iOS; + deviceType = IPhoneDeviceType.IPad; + break; + case "appletv": + runtimeIdentifier += "tvos-"; + platform = ApplePlatform.TVOS; + deviceType = IPhoneDeviceType.TV; + break; + case "applewatch": + case "visionos": + default: + platform = ApplePlatform.None; + deviceType = IPhoneDeviceType.NotSet; + discardedReason = $"'{device.DeviceClass}' devices are not supported"; + break; + } + + if (string.IsNullOrEmpty (discardedReason)) { + switch (device.CpuArchitecture.ToLowerInvariant ()) { + case "arm64": + case "arm64e": + // arm64 and arm64e are both arm64 for our purposes + runtimeIdentifier += "arm64"; break; - case "applewatch": - case "visionos": default: - platform = ApplePlatform.None; - deviceType = IPhoneDeviceType.NotSet; - discardedReason = $"'{deviceClass}' devices are not supported"; + discardedReason = $"Unknown CPU architecture '{device.CpuArchitecture}'"; break; } + } - if (string.IsNullOrEmpty (discardedReason)) { - switch (cpuArchitecture.ToLowerInvariant ()) { - case "arm64": - case "arm64e": - // arm64 and arm64e are both arm64 for our purposes - runtimeIdentifier += "arm64"; - break; - default: - discardedReason = $"Unknown CPU architecture '{cpuArchitecture}'"; - break; - } - } - - Version.TryParse (productVersion, out var minimumOSVersion); - var maximumOSVersion = new Version (65535, 255, 255); + Version.TryParse (device.OSVersion, out var minimumOSVersion); + var maximumOSVersion = new Version (65535, 255, 255); - rv.Add (new DeviceInfo (item, [runtimeIdentifier], platform, deviceType, minimumOSVersion ?? new Version (0, 0), maximumOSVersion, discardedReason)); - } + rv.Add (new DeviceInfo (item, [runtimeIdentifier], platform, deviceType, minimumOSVersion ?? new Version (0, 0), maximumOSVersion, discardedReason)); } return rv; } async System.Threading.Tasks.Task> RunSimCtlAsync () { - var doc = await ExecuteCtlToJsonAsync ("simctl", "list", "--json"); + var json = await ExecuteCtlAsync ("simctl", "list", "--json"); var rv = new List (); - var runtimes = new Dictionary (); - if (doc.TryGetProperty ("runtimes", out var runtimesElement)) { - foreach (var runtime in runtimesElement.EnumerateIfArray ()) { - var name = runtime.GetStringProperty ("identifier") ?? string.Empty; - runtimes [name] = runtime; - } - } - - var deviceTypes = new Dictionary (); - if (doc.TryGetProperty ("devicetypes", out var deviceTypesElement)) { - foreach (var deviceType in deviceTypesElement.EnumerateIfArray ()) { - var name = deviceType.GetStringProperty ("identifier") ?? string.Empty; - deviceTypes [name] = deviceType; - } - } + // Use shared parser from Xamarin.MacDev for device and runtime extraction + var parsedDevices = SimctlOutputParser.ParseDevices (json); + var parsedRuntimes = SimctlOutputParser.ParseRuntimes (json); + + // Index runtimes by identifier for SupportedArchitectures lookup + var runtimesByIdentifier = new Dictionary (); + foreach (var rt in parsedRuntimes) + runtimesByIdentifier [rt.Identifier] = rt; + + // Use shared parser for devicetypes (productFamily, min/maxRuntime) + var parsedDeviceTypes = SimctlOutputParser.ParseDeviceTypes (json); + var deviceTypes = new Dictionary (); + foreach (var dt in parsedDeviceTypes) + deviceTypes [dt.Identifier] = dt; + + foreach (var device in parsedDevices) { + var hasRuntime = runtimesByIdentifier.TryGetValue (device.RuntimeIdentifier, out var runtimeInfo); + var runtimePlatform = hasRuntime ? runtimeInfo!.Platform : string.Empty; + var runtimeVersion = hasRuntime ? runtimeInfo!.Version : device.OSVersion; + var supportedArchitectures = hasRuntime ? runtimeInfo!.SupportedArchitectures : new List (); + + var item = new TaskItem (device.Udid); + item.SetMetadata ("Runtime", device.RuntimeIdentifier); + item.SetMetadata ("IsAvailable", device.IsAvailable.ToString ()); + item.SetMetadata ("AvailabilityError", device.AvailabilityError); + item.SetMetadata ("DeviceTypeIdentifier", device.DeviceTypeIdentifier); + item.SetMetadata ("State", device.State); + item.SetMetadata ("Name", device.Name); + item.SetMetadata ("SupportedArchitectures", string.Join (",", supportedArchitectures)); + + // we provide the following metadata for both simulator and device + item.SetMetadata ("Description", device.Name); + item.SetMetadata ("Type", "Simulator"); + item.SetMetadata ("OSVersion", runtimeVersion); + item.SetMetadata ("UDID", device.Udid); + + var discardedReason = ""; + var runtimeIdentifier = ""; + var runtimeIdentifiers = new List (); + if (device.IsAvailable) { + switch (runtimePlatform.ToLowerInvariant ()) { + case "ios": + runtimeIdentifier += "iossimulator-"; + break; + case "tvos": + runtimeIdentifier += "tvossimulator-"; + break; + default: + discardedReason = $"'{runtimePlatform}' simulators are not supported"; + break; + } - if (doc.TryGetProperty ("devices", out var devicesElement)) { - foreach (var runtime in devicesElement.EnumerateObject ()) { - var runtimeName = runtime.Name; - var hasRuntime = runtimes.TryGetValue (runtimeName, out var runtimeElement); - var runtimePlatform = hasRuntime ? runtimeElement.GetStringProperty ("platform") ?? string.Empty : string.Empty; - var runtimeVersion = hasRuntime ? runtimeElement.GetStringProperty ("version") ?? string.Empty : string.Empty; - var supportedArchitectures = hasRuntime ? runtimeElement.GetProperty ("supportedArchitectures").EnumerateIfArray ().Select (v => v.GetString () ?? "") : Enumerable.Empty (); - foreach (var element in runtime.Value.EnumerateIfArray ()) { - var udid = element.GetStringProperty ("udid") ?? string.Empty; - var isAvailable = element.GetBooleanProperty ("isAvailable") ?? false; - var availabilityError = element.GetStringProperty ("availabilityError") ?? string.Empty; - var deviceTypeIdentifier = element.GetStringProperty ("deviceTypeIdentifier") ?? string.Empty; - var state = element.GetStringProperty ("state") ?? string.Empty; - var name = element.GetStringProperty ("name") ?? string.Empty; - - var item = new TaskItem (udid); - item.SetMetadata ("Runtime", runtimeName); - item.SetMetadata ("IsAvailable", isAvailable.ToString ()); - item.SetMetadata ("AvailabilityError", availabilityError); - item.SetMetadata ("DeviceTypeIdentifier", deviceTypeIdentifier); - item.SetMetadata ("State", state); - item.SetMetadata ("Name", name); - item.SetMetadata ("SupportedArchitectures", string.Join (",", supportedArchitectures)); - - // we provide the following metadata for both simulator and device - item.SetMetadata ("Description", name); - item.SetMetadata ("Type", "Simulator"); - item.SetMetadata ("OSVersion", runtimeVersion); - item.SetMetadata ("UDID", udid); - - var discardedReason = ""; - var runtimeIdentifier = ""; - var runtimeIdentifiers = new List (); - if (isAvailable) { - switch (runtimePlatform.ToLowerInvariant ()) { - case "ios": - runtimeIdentifier += "iossimulator-"; + // pick the first architecture as the simulator architecture + if (string.IsNullOrEmpty (discardedReason)) { + foreach (var arch in supportedArchitectures) { + switch (arch.ToLowerInvariant ()) { + case "x64": + case "x86_64": + runtimeIdentifiers.Add (runtimeIdentifier + "x64"); break; - case "tvos": - runtimeIdentifier += "tvossimulator-"; + case "arm64": + runtimeIdentifiers.Add (runtimeIdentifier + "arm64"); + if (!CanRunArm64) + discardedReason = $"Can't run an arm64 simulator on an x86_64 macOS desktop."; break; default: - discardedReason = $"'{runtimePlatform}' simulators are not supported"; + discardedReason = $"Unknown CPU architecture '{arch}'"; break; } - - // pick the first architecture as the simulator architecture - if (string.IsNullOrEmpty (discardedReason)) { - foreach (var arch in supportedArchitectures) { - switch (arch.ToLowerInvariant ()) { - case "x64": - case "x86_64": - runtimeIdentifiers.Add (runtimeIdentifier + "x64"); - break; - case "arm64": - runtimeIdentifiers.Add (runtimeIdentifier + "arm64"); - if (!CanRunArm64) - discardedReason = $"Can't run an arm64 simulator on an x86_64 macOS desktop."; - break; - default: - discardedReason = $"Unknown CPU architecture '{arch}'"; - break; - } - } - } - } else { - discardedReason = $"Device is not available: {availabilityError}"; } + } + } else { + discardedReason = $"Device is not available: {device.AvailabilityError}"; + } - var platformName = runtimeName.Replace ("com.apple.CoreSimulator.SimRuntime.", "").Split ('-') [0]; - var platform = ApplePlatform.None; - if (string.IsNullOrEmpty (discardedReason)) { - switch (platformName.ToLowerInvariant ()) { - case "ios": - platform = ApplePlatform.iOS; - break; - case "tvos": - platform = ApplePlatform.TVOS; - break; - case "watchos": - case "visionos": - default: - discardedReason = $"'{platformName}' simulators are not supported"; - break; - } - } - var deviceType = IPhoneDeviceType.NotSet; - var minimumOSVersion = new Version (0, 0); - var maximumOSVersion = new Version (65535, 255, 255); - if (string.IsNullOrEmpty (discardedReason)) { - if (deviceTypes.TryGetValue (deviceTypeIdentifier, out var deviceTypeElement)) { - var productFamily = deviceTypeElement.GetStringProperty ("productFamily") ?? string.Empty; - switch (productFamily.ToLowerInvariant ()) { - case "iphone": - case "ipod": - deviceType = IPhoneDeviceType.IPhone; - break; - case "ipad": - deviceType = IPhoneDeviceType.IPad; - break; - case "appletv": - case "apple tv": - deviceType = IPhoneDeviceType.TV; - break; - default: - discardedReason = $"Unknown product family '{productFamily}'"; - break; - } - if (Version.TryParse (deviceTypeElement.GetStringProperty ("minRuntimeVersionString"), out var parsedMinimumOSVersion)) - minimumOSVersion = parsedMinimumOSVersion; - if (Version.TryParse (deviceTypeElement.GetStringProperty ("maxRuntimeVersionString"), out var parsedMaximumOSVersion)) - maximumOSVersion = parsedMaximumOSVersion; - } else { - discardedReason = $"Unknown device type identifier '{deviceTypeIdentifier}'"; - } + var platform = ApplePlatform.None; + if (string.IsNullOrEmpty (discardedReason)) { + switch (device.Platform.ToLowerInvariant ()) { + case "ios": + platform = ApplePlatform.iOS; + break; + case "tvos": + platform = ApplePlatform.TVOS; + break; + case "watchos": + case "visionos": + default: + discardedReason = $"'{device.Platform}' simulators are not supported"; + break; + } + } + var deviceType = IPhoneDeviceType.NotSet; + var minimumOSVersion = new Version (0, 0); + var maximumOSVersion = new Version (65535, 255, 255); + if (string.IsNullOrEmpty (discardedReason)) { + if (deviceTypes.TryGetValue (device.DeviceTypeIdentifier, out var deviceTypeInfo)) { + switch (deviceTypeInfo.ProductFamily.ToLowerInvariant ()) { + case "iphone": + case "ipod": + deviceType = IPhoneDeviceType.IPhone; + break; + case "ipad": + deviceType = IPhoneDeviceType.IPad; + break; + case "appletv": + case "apple tv": + deviceType = IPhoneDeviceType.TV; + break; + default: + discardedReason = $"Unknown product family '{deviceTypeInfo.ProductFamily}'"; + break; } - - rv.Add (new DeviceInfo (item, runtimeIdentifiers, platform, deviceType, minimumOSVersion, maximumOSVersion, discardedReason)); + if (Version.TryParse (deviceTypeInfo.MinRuntimeVersionString, out var parsedMinimumOSVersion)) + minimumOSVersion = parsedMinimumOSVersion; + if (Version.TryParse (deviceTypeInfo.MaxRuntimeVersionString, out var parsedMaximumOSVersion)) + maximumOSVersion = parsedMaximumOSVersion; + } else { + discardedReason = $"Unknown device type identifier '{device.DeviceTypeIdentifier}'"; } } + + rv.Add (new DeviceInfo (item, runtimeIdentifiers, platform, deviceType, minimumOSVersion, maximumOSVersion, discardedReason)); } return rv; } diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs index 603f85252b07..1313a4d5e902 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/XamarinTask.cs @@ -352,24 +352,24 @@ protected static string GetExecutable (List arguments, string toolName, } #region Xamarin.MacDev.ICustomLogger - void ICustomLogger.LogError (string message, Exception ex) + void ICustomLogger.LogError (string message, Exception? ex) { Log.LogError (message); if (ex is not null) Log.LogErrorFromException (ex); } - void ICustomLogger.LogWarning (string messageFormat, params object [] args) + void ICustomLogger.LogWarning (string messageFormat, params object? [] args) { Log.LogWarning (messageFormat, args); } - void ICustomLogger.LogInfo (string messageFormat, object [] args) + void ICustomLogger.LogInfo (string messageFormat, params object? [] args) { Log.LogMessage (MessageImportance.Normal, messageFormat, args); } - void ICustomLogger.LogDebug (string messageFormat, params object [] args) + void ICustomLogger.LogDebug (string messageFormat, params object? [] args) { Log.LogMessage (MessageImportance.Low, messageFormat, args); } diff --git a/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj b/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj index 24caeb9ef41a..a61be2c501c3 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj +++ b/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj @@ -14,6 +14,7 @@ $(NoWarn);NU1701 $(NoWarn);MSB3277 $(NoWarn);8002 + $(NoWarn);CS0618 enable true diff --git a/tests/Makefile b/tests/Makefile index a43f5bfdc685..5313dfde1142 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -164,14 +164,14 @@ test-msbuild run-tests-msbuild: # Docs: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#filter-option-details test-macdev-tests: export MSBUILD_EXE_PATH= test-macdev-tests: verify-system-vsmac-xcode-match - $(Q) $(DOTNET) test $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj $(TEST_FILTER) + $(Q) $(DOTNET) test $(TOP)/tests/msbuild/Xamarin.MacDev.Tests/Xamarin.MacDev.Tests.csproj $(TEST_FILTER) /p:NuGetPackageRoot=$(abspath $(TOP)/packages)/ # Example TEST_FILTER: # TEST_FILTER="--filter:FullyQualifiedName~BuildMyCocoaApp" # Docs: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test#filter-option-details test-macdev-tasks: export MSBUILD_EXE_PATH= test-macdev-tasks: verify-system-vsmac-xcode-match - $(Q) $(DOTNET) test $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj $(TEST_FILTER) + $(Q) $(DOTNET) test $(TOP)/tests/msbuild/Xamarin.MacDev.Tasks.Tests/Xamarin.MacDev.Tasks.Tests.csproj $(TEST_FILTER) /p:NuGetPackageRoot=$(abspath $(TOP)/packages)/ mac-test-package.zip: ifdef INCLUDE_MAC diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GetAvailableDevicesTest.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GetAvailableDevicesTest.cs index beb8be0f356d..b8e71570aeb0 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GetAvailableDevicesTest.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/GetAvailableDevicesTest.cs @@ -139,7 +139,7 @@ public void SimCtl1 () Assert.That (task.DiscardedDevices [1].ItemSpec, Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 2 mismatch."); Assert.That (task.DiscardedDevices [1].GetMetadata ("Description"), Is.EqualTo ("iPhone 17 Pro"), "Discarded Device 2 Name mismatch."); - Assert.That (task.DiscardedDevices [1].GetMetadata ("OSVersion"), Is.EqualTo (""), "Discarded Device 2 OSVersion mismatch."); + Assert.That (task.DiscardedDevices [1].GetMetadata ("OSVersion"), Is.EqualTo ("26.0"), "Discarded Device 2 OSVersion mismatch."); Assert.That (task.DiscardedDevices [1].GetMetadata ("UDID"), Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 2 UDID mismatch."); Assert.That (task.DiscardedDevices [1].GetMetadata ("RuntimeIdentifier"), Is.EqualTo (""), "Discarded Device 2 RuntimeIdentifier mismatch."); Assert.That (task.DiscardedDevices [1].GetMetadata ("DiscardedReason"), Is.EqualTo ("Device is not available: runtime profile not found using \"System\" match policy"), "Discarded Device 2 reason mismatch."); @@ -216,7 +216,7 @@ public void Ctl1 () Assert.That (task.DiscardedDevices [2].ItemSpec, Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 3 UDID mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("Description"), Is.EqualTo ("iPhone 17 Pro"), "Discarded Device 3 Name mismatch."); - Assert.That (task.DiscardedDevices [2].GetMetadata ("OSVersion"), Is.EqualTo (""), "Discarded Device 3 OSVersion mismatch."); + Assert.That (task.DiscardedDevices [2].GetMetadata ("OSVersion"), Is.EqualTo ("26.0"), "Discarded Device 3 OSVersion mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("UDID"), Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 3 UDID mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("RuntimeIdentifier"), Is.EqualTo (""), "Discarded Device 3 RuntimeIdentifier mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("DiscardedReason"), Is.EqualTo ("Device is not available: runtime profile not found using \"System\" match policy"), "Discarded Device 3 reason mismatch."); @@ -306,7 +306,7 @@ public void Ctl1_iPhone () Assert.That (task.DiscardedDevices [2].ItemSpec, Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 3 UDID mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("Description"), Is.EqualTo ("iPhone 17 Pro"), "Discarded Device 3 Name mismatch."); - Assert.That (task.DiscardedDevices [2].GetMetadata ("OSVersion"), Is.EqualTo (""), "Discarded Device 3 OSVersion mismatch."); + Assert.That (task.DiscardedDevices [2].GetMetadata ("OSVersion"), Is.EqualTo ("26.0"), "Discarded Device 3 OSVersion mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("UDID"), Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 3 UDID mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("RuntimeIdentifier"), Is.EqualTo (""), "Discarded Device 3 RuntimeIdentifier mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("DiscardedReason"), Is.EqualTo ("Device is not available: runtime profile not found using \"System\" match policy"), "Discarded Device 3 reason mismatch."); @@ -393,7 +393,7 @@ public void Ctl1_iPad () Assert.That (task.DiscardedDevices [4].ItemSpec, Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 5 ItemSpec mismatch."); Assert.That (task.DiscardedDevices [4].GetMetadata ("Description"), Is.EqualTo ("iPhone 17 Pro"), "Discarded Device 5 Description mismatch."); - Assert.That (task.DiscardedDevices [4].GetMetadata ("OSVersion"), Is.EqualTo (""), "Discarded Device 5 OSVersion mismatch."); + Assert.That (task.DiscardedDevices [4].GetMetadata ("OSVersion"), Is.EqualTo ("26.0"), "Discarded Device 5 OSVersion mismatch."); Assert.That (task.DiscardedDevices [4].GetMetadata ("UDID"), Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 5 UDID mismatch."); Assert.That (task.DiscardedDevices [4].GetMetadata ("RuntimeIdentifier"), Is.EqualTo (""), "Discarded Device 5 RuntimeIdentifier mismatch."); Assert.That (task.DiscardedDevices [4].GetMetadata ("DiscardedReason"), Is.EqualTo ("Device is not available: runtime profile not found using \"System\" match policy"), "Discarded Device 5 reason mismatch."); @@ -487,7 +487,7 @@ public void Ctl1_OSVersion () Assert.That (task.DiscardedDevices [3].ItemSpec, Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 4 UDID mismatch."); Assert.That (task.DiscardedDevices [3].GetMetadata ("Description"), Is.EqualTo ("iPhone 17 Pro"), "Discarded Device 4 Name mismatch."); - Assert.That (task.DiscardedDevices [3].GetMetadata ("OSVersion"), Is.EqualTo (""), "Discarded Device 4 OSVersion mismatch."); + Assert.That (task.DiscardedDevices [3].GetMetadata ("OSVersion"), Is.EqualTo ("26.0"), "Discarded Device 4 OSVersion mismatch."); Assert.That (task.DiscardedDevices [3].GetMetadata ("UDID"), Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 4 UDID mismatch."); Assert.That (task.DiscardedDevices [3].GetMetadata ("RuntimeIdentifier"), Is.EqualTo (""), "Discarded Device 4 RuntimeIdentifier mismatch."); Assert.That (task.DiscardedDevices [3].GetMetadata ("DiscardedReason"), Is.EqualTo ("Device is not available: runtime profile not found using \"System\" match policy"), "Discarded Device 4 reason mismatch."); @@ -573,7 +573,7 @@ public void Ctl1_RuntimeIdentifier () Assert.That (task.DiscardedDevices [2].ItemSpec, Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 3 UDID mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("Description"), Is.EqualTo ("iPhone 17 Pro"), "Discarded Device 3 Name mismatch."); - Assert.That (task.DiscardedDevices [2].GetMetadata ("OSVersion"), Is.EqualTo (""), "Discarded Device 3 OSVersion mismatch."); + Assert.That (task.DiscardedDevices [2].GetMetadata ("OSVersion"), Is.EqualTo ("26.0"), "Discarded Device 3 OSVersion mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("UDID"), Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 3 UDID mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("RuntimeIdentifier"), Is.EqualTo (""), "Discarded Device 3 RuntimeIdentifier mismatch."); Assert.That (task.DiscardedDevices [2].GetMetadata ("DiscardedReason"), Is.EqualTo ("Device is not available: runtime profile not found using \"System\" match policy"), "Discarded Device 3 reason mismatch."); @@ -651,7 +651,7 @@ public void Ctl1_AppleTV () Assert.That (task.DiscardedDevices [4].ItemSpec, Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 5 ItemSpec mismatch."); Assert.That (task.DiscardedDevices [4].GetMetadata ("Description"), Is.EqualTo ("iPhone 17 Pro"), "Discarded Device 5 Description mismatch."); - Assert.That (task.DiscardedDevices [4].GetMetadata ("OSVersion"), Is.EqualTo (""), "Discarded Device 5 OSVersion mismatch."); + Assert.That (task.DiscardedDevices [4].GetMetadata ("OSVersion"), Is.EqualTo ("26.0"), "Discarded Device 5 OSVersion mismatch."); Assert.That (task.DiscardedDevices [4].GetMetadata ("UDID"), Is.EqualTo ("D4D95709-144A-4CAA-8469-89566EC1C935"), "Discarded Device 5 UDID mismatch."); Assert.That (task.DiscardedDevices [4].GetMetadata ("RuntimeIdentifier"), Is.EqualTo (""), "Discarded Device 5 RuntimeIdentifier mismatch."); Assert.That (task.DiscardedDevices [4].GetMetadata ("DiscardedReason"), Is.EqualTo ("Device is not available: runtime profile not found using \"System\" match policy"), "Discarded Device 5 reason mismatch."); From 93434fe7adb0e1613e5c307c5ac96e5a5332c6ed Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 7 May 2026 07:52:32 +0200 Subject: [PATCH 26/35] [github] Fix reviewer skill to submit COMMENT on re-reviews to clear REQUEST_CHANGES state (#25350) When the reviewer previously requested changes and those issues are fixed, it must submit a COMMENT review (not just stay silent) to replace the previous REQUEST_CHANGES state on the PR. Without this, PRs remain red forever. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/aw/actions-lock.json | 6 +- .github/skills/macios-reviewer/SKILL.md | 7 + .github/workflows/macios-reviewer.lock.yml | 188 +++++++++++++-------- .github/workflows/macios-reviewer.md | 2 +- 4 files changed, 129 insertions(+), 74 deletions(-) diff --git a/.github/aw/actions-lock.json b/.github/aw/actions-lock.json index 996a707ff261..79c34c44d3d7 100644 --- a/.github/aw/actions-lock.json +++ b/.github/aw/actions-lock.json @@ -5,10 +5,10 @@ "version": "v9.0.0", "sha": "3a2844b7e9c422d3c10d287c895573f7108da1b3" }, - "github/gh-aw-actions/setup@v0.71.2": { + "github/gh-aw-actions/setup@v0.71.5": { "repo": "github/gh-aw-actions/setup", - "version": "v0.71.2", - "sha": "ab8940d1df237fc4fae4ab8091e7ba66ada55a55" + "version": "v0.71.5", + "sha": "b8068426813005612b960b5ab0b8bd2c27142323" } }, "containers": { diff --git a/.github/skills/macios-reviewer/SKILL.md b/.github/skills/macios-reviewer/SKILL.md index 4e58caf65a61..196852d33fcd 100644 --- a/.github/skills/macios-reviewer/SKILL.md +++ b/.github/skills/macios-reviewer/SKILL.md @@ -97,6 +97,13 @@ Post your findings directly: If no issues found **and CI is green**, submit with at most one or two 💡 suggestions and a positive summary. Truly trivial PRs (dependency bumps, 1-line typo fixes) may have no inline comments. +**Review event to submit:** +- If there are ❌ **error** issues → submit as `REQUEST_CHANGES`. +- If there are no ❌ **error** issues (only warnings/suggestions or clean) → submit as `COMMENT`. +- **Never submit `APPROVE`.** + +This is especially important on re-reviews: if a previous review requested changes and those changes have been addressed, submitting a `COMMENT` review replaces the previous `REQUEST_CHANGES` state, clearing the "changes requested" flag on the PR. + **Copilot-authored PRs:** If the PR author is `Copilot` (the GitHub Copilot coding agent) and the verdict is ⚠️ Needs Changes or ❌ Reject, prefix the review summary with `@copilot ` so the comment automatically triggers Copilot to address the feedback. Do NOT add the prefix for ✅ LGTM verdicts. ## Comment format diff --git a/.github/workflows/macios-reviewer.lock.yml b/.github/workflows/macios-reviewer.lock.yml index bcaac60c75a8..9f23069944af 100644 --- a/.github/workflows/macios-reviewer.lock.yml +++ b/.github/workflows/macios-reviewer.lock.yml @@ -1,5 +1,5 @@ -# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"a4ffe1d52364aca7fafba9ba975ec40a3f4fc4908801119268fc1812f9b09cbe","compiler_version":"v0.71.2","strict":true,"agent_id":"copilot","agent_model":"claude-sonnet-4.5"} -# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"373c709c69115d41ff229c7e5df9f8788daa9553","version":"v9"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"ab8940d1df237fc4fae4ab8091e7ba66ada55a55","version":"v0.71.2"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.29","digest":"sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.25.29@sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.29","digest":"sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.29@sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.29","digest":"sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.25.29@sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.1","digest":"sha256:287fad0236959f3b3d9936ea1ef8d5b4f135ef2a5f5789713495cbbef191e60c","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.1@sha256:287fad0236959f3b3d9936ea1ef8d5b4f135ef2a5f5789713495cbbef191e60c"},{"image":"ghcr.io/github/github-mcp-server:v1.0.3","digest":"sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959","pinned_image":"ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} +# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"a4ffe1d52364aca7fafba9ba975ec40a3f4fc4908801119268fc1812f9b09cbe","compiler_version":"v0.71.5","strict":true,"agent_id":"copilot","agent_model":"claude-sonnet-4.5"} +# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"b8068426813005612b960b5ab0b8bd2c27142323","version":"v0.71.5"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.40","digest":"sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.25.40@sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.40","digest":"sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.40@sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.40","digest":"sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.25.40@sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.6","digest":"sha256:2bb8eef86006a4c5963c55616a9c51c32f27bfdecb023b8aa6f91f6718d9171c","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.6@sha256:2bb8eef86006a4c5963c55616a9c51c32f27bfdecb023b8aa6f91f6718d9171c"},{"image":"ghcr.io/github/github-mcp-server:v1.0.3","digest":"sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959","pinned_image":"ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} # ___ _ _ # / _ \ | | (_) # | |_| | __ _ ___ _ __ | |_ _ ___ @@ -14,7 +14,7 @@ # \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ # \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ # -# This file was automatically generated by gh-aw (v0.71.2). DO NOT EDIT. +# This file was automatically generated by gh-aw (v0.71.5). DO NOT EDIT. # # To update this file, edit the corresponding .md file and run: # gh aw compile @@ -32,17 +32,16 @@ # Custom actions used: # - actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 -# - actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9 -# - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 +# - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 # - actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 # - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 -# - github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 +# - github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 # # Container images used: -# - ghcr.io/github/gh-aw-firewall/agent:0.25.29@sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4 -# - ghcr.io/github/gh-aw-firewall/api-proxy:0.25.29@sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6 -# - ghcr.io/github/gh-aw-firewall/squid:0.25.29@sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53 -# - ghcr.io/github/gh-aw-mcpg:v0.3.1@sha256:287fad0236959f3b3d9936ea1ef8d5b4f135ef2a5f5789713495cbbef191e60c +# - ghcr.io/github/gh-aw-firewall/agent:0.25.40@sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504 +# - ghcr.io/github/gh-aw-firewall/api-proxy:0.25.40@sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280 +# - ghcr.io/github/gh-aw-firewall/squid:0.25.40@sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51 +# - ghcr.io/github/gh-aw-mcpg:v0.3.6@sha256:2bb8eef86006a4c5963c55616a9c51c32f27bfdecb023b8aa6f91f6718d9171c # - ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 # - node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f @@ -91,31 +90,35 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.pre_activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/macios-reviewer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" - name: Generate agentic run info id: generate_aw_info env: GH_AW_INFO_ENGINE_ID: "copilot" GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI" GH_AW_INFO_MODEL: "claude-sonnet-4.5" - GH_AW_INFO_VERSION: "1.0.36" - GH_AW_INFO_AGENT_VERSION: "1.0.36" - GH_AW_INFO_CLI_VERSION: "v0.71.2" + GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_AGENT_VERSION: "1.0.40" + GH_AW_INFO_CLI_VERSION: "v0.71.5" GH_AW_INFO_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" GH_AW_INFO_EXPERIMENTAL: "false" GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" GH_AW_INFO_STAGED: "false" GH_AW_INFO_ALLOWED_DOMAINS: '["defaults","dotnet","github","aka.ms","dev.azure.com","microsoft.com","vsassets.io"]' GH_AW_INFO_FIREWALL_ENABLED: "true" - GH_AW_INFO_AWF_VERSION: "v0.25.29" + GH_AW_INFO_AWF_VERSION: "v0.25.40" GH_AW_INFO_AWMG_VERSION: "" GH_AW_INFO_FIREWALL_TYPE: "squid" GH_AW_COMPILED_STRICT: "true" - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); @@ -124,8 +127,8 @@ jobs: await main(core, context); - name: Add eyes reaction for immediate feedback id: react - if: github.event_name == 'issues' || github.event_name == 'issue_comment' || github.event_name == 'pull_request_review_comment' || github.event_name == 'discussion' || github.event_name == 'discussion_comment' || github.event_name == 'pull_request' && github.event.pull_request.head.repo.id == github.repository_id - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + if: github.event_name == 'issues' || github.event_name == 'issue_comment' || github.event_name == 'pull_request_review_comment' || github.event_name == 'discussion' || github.event_name == 'discussion_comment' || github.event_name == 'pull_request' && github.event.pull_request.head.repo.id == github.repository_id || github.event_name == 'pull_request_review' && github.event.pull_request.head.repo.id == github.repository_id + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_REACTION: "eyes" with: @@ -152,17 +155,18 @@ jobs: .crush .gemini .opencode + .pi sparse-checkout-cone-mode: true fetch-depth: 1 - name: Save agent config folders for base branch restoration env: - GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode" - GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md opencode.jsonc" + GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" # poutine:ignore untrusted_checkout_exec run: bash "${RUNNER_TEMP}/gh-aw/actions/save_base_github_folders.sh" - name: Check workflow lock file id: check-lock-file - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_WORKFLOW_FILE: "macios-reviewer.lock.yml" GH_AW_CONTEXT_WORKFLOW_REF: "${{ github.workflow_ref }}" @@ -173,9 +177,9 @@ jobs: const { main } = require('${{ runner.temp }}/gh-aw/actions/check_workflow_timestamp_api.cjs'); await main(); - name: Check compile-agentic version - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: - GH_AW_COMPILED_VERSION: "v0.71.2" + GH_AW_COMPILED_VERSION: "v0.71.5" with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); @@ -184,7 +188,7 @@ jobs: await main(); - name: Compute current body text id: sanitized - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_ALLOWED_DOMAINS: "*.githubusercontent.com,*.vsblob.vsassets.io,aka.ms,api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.nuget.org,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,azuresearch-usnc.nuget.org,azuresearch-ussc.nuget.org,builds.dotnet.microsoft.com,ci.dot.net,codeload.github.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,dc.services.visualstudio.com,dev.azure.com,dist.nuget.org,docs.github.com,dot.net,dotnet.microsoft.com,dotnetcli.blob.core.windows.net,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,microsoft.com,nuget.org,nuget.pkg.github.com,nugetregistryv2prod.blob.core.windows.net,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,oneocsp.microsoft.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,pkgs.dev.azure.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,vsassets.io,www.googleapis.com,www.microsoft.com" with: @@ -195,8 +199,8 @@ jobs: await main(); - name: Add comment with workflow run link id: add-comment - if: github.event_name == 'issues' || github.event_name == 'issue_comment' || github.event_name == 'pull_request_review_comment' || github.event_name == 'discussion' || github.event_name == 'discussion_comment' || github.event_name == 'pull_request' && github.event.pull_request.head.repo.id == github.repository_id - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + if: github.event_name == 'issues' || github.event_name == 'issue_comment' || github.event_name == 'pull_request_review_comment' || github.event_name == 'discussion' || github.event_name == 'discussion_comment' || github.event_name == 'pull_request' && github.event.pull_request.head.repo.id == github.repository_id || github.event_name == 'pull_request_review' && github.event.pull_request.head.repo.id == github.repository_id + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" with: @@ -275,9 +279,10 @@ jobs: GH_AW_PROMPT_31522cd090dd3137_EOF } > "$GH_AW_PROMPT" - name: Interpolate variables and render templates - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_ENGINE_ID: "copilot" with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); @@ -285,7 +290,7 @@ jobs: const { main } = require('${{ runner.temp }}/gh-aw/actions/interpolate_prompt.cjs'); await main(); - name: Substitute placeholders - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_GITHUB_ACTOR: ${{ github.actor }} @@ -340,6 +345,7 @@ jobs: uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: activation + include-hidden-files: true path: | /tmp/gh-aw/aw_info.json /tmp/gh-aw/aw-prompts/prompt.txt @@ -376,11 +382,15 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/macios-reviewer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" - name: Set runtime paths id: set-runtime-paths run: | @@ -416,7 +426,7 @@ jobs: id: checkout-pr if: | github.event.pull_request || github.event.issue.pull_request - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} with: @@ -427,11 +437,11 @@ jobs: const { main } = require('${{ runner.temp }}/gh-aw/actions/checkout_pr_branch.cjs'); await main(); - name: Install GitHub Copilot CLI - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.36 + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.40 env: GH_HOST: github.com - name: Install AWF binary - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.29 + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.40 - name: Parse integrity filter lists id: parse-guard-vars env: @@ -447,12 +457,12 @@ jobs: - name: Restore agent config folders from base branch if: steps.checkout-pr.outcome == 'success' env: - GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode" - GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md opencode.jsonc" + GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh" - name: Download container images - run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.29@sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.29@sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6 ghcr.io/github/gh-aw-firewall/squid:0.25.29@sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53 ghcr.io/github/gh-aw-mcpg:v0.3.1@sha256:287fad0236959f3b3d9936ea1ef8d5b4f135ef2a5f5789713495cbbef191e60c ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f - - name: Write Safe Outputs Config + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.40@sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.40@sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280 ghcr.io/github/gh-aw-firewall/squid:0.25.40@sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51 ghcr.io/github/gh-aw-mcpg:v0.3.6@sha256:2bb8eef86006a4c5963c55616a9c51c32f27bfdecb023b8aa6f91f6718d9171c ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f + - name: Generate Safe Outputs Config run: | mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" mkdir -p /tmp/gh-aw/safeoutputs @@ -460,7 +470,7 @@ jobs: cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_89a2d4b9522a1c3e_EOF' {"create_pull_request_review_comment":{"max":50,"side":"RIGHT"},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{},"submit_pull_request_review":{"allowed_events":["COMMENT","REQUEST_CHANGES"],"max":1}} GH_AW_SAFE_OUTPUTS_CONFIG_89a2d4b9522a1c3e_EOF - - name: Write Safe Outputs Tools + - name: Generate Safe Outputs Tools env: GH_AW_TOOLS_META_JSON: | { @@ -602,7 +612,7 @@ jobs: } } } - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); @@ -663,6 +673,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" + export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') echo "::add-mask::${MCP_GATEWAY_API_KEY}" export MCP_GATEWAY_API_KEY @@ -675,7 +686,7 @@ jobs: MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') DOCKER_SOCK_GID=$(stat -c '%g' /var/run/docker.sock 2>/dev/null || echo '0') - export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.1' + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.6' mkdir -p /home/runner/.copilot GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) @@ -731,16 +742,20 @@ jobs: MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} MCP_GATEWAY_DOMAIN: ${{ steps.start-mcp-gateway.outputs.gateway-domain }} MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} - uses: actions/github-script@373c709c69115d41ff229c7e5df9f8788daa9553 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/mount_mcp_as_cli.cjs'); await main(); - - name: Clean git credentials + - name: Clean credentials continue-on-error: true run: bash "${RUNNER_TEMP}/gh-aw/actions/clean_git_credentials.sh" + - name: Audit pre-agent workspace + id: pre_agent_audit + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/audit_pre_agent_workspace.sh" - name: Execute GitHub Copilot CLI id: agentic_execution # Copilot CLI tool arguments (sorted): @@ -751,8 +766,9 @@ jobs: GH_AW_NODE_BIN=$(command -v node 2>/dev/null || true) export GH_AW_NODE_BIN (umask 177 && touch /tmp/gh-aw/agent-stdio.log) + printf '%s\n' '{"$schema":"https://github.com/github/gh-aw-firewall/releases/download/v0.25.40/awf-config.schema.json","network":{"allowDomains":["*.githubusercontent.com","*.vsblob.vsassets.io","aka.ms","api.business.githubcopilot.com","api.enterprise.githubcopilot.com","api.github.com","api.githubcopilot.com","api.individual.githubcopilot.com","api.nuget.org","api.snapcraft.io","archive.ubuntu.com","azure.archive.ubuntu.com","azuresearch-usnc.nuget.org","azuresearch-ussc.nuget.org","builds.dotnet.microsoft.com","ci.dot.net","codeload.github.com","crl.geotrust.com","crl.globalsign.com","crl.identrust.com","crl.sectigo.com","crl.thawte.com","crl.usertrust.com","crl.verisign.com","crl3.digicert.com","crl4.digicert.com","crls.ssl.com","dc.services.visualstudio.com","dev.azure.com","dist.nuget.org","docs.github.com","dot.net","dotnet.microsoft.com","dotnetcli.blob.core.windows.net","github-cloud.githubusercontent.com","github-cloud.s3.amazonaws.com","github.blog","github.com","github.githubassets.com","host.docker.internal","json-schema.org","json.schemastore.org","keyserver.ubuntu.com","lfs.github.com","microsoft.com","nuget.org","nuget.pkg.github.com","nugetregistryv2prod.blob.core.windows.net","objects.githubusercontent.com","ocsp.digicert.com","ocsp.geotrust.com","ocsp.globalsign.com","ocsp.identrust.com","ocsp.sectigo.com","ocsp.ssl.com","ocsp.thawte.com","ocsp.usertrust.com","ocsp.verisign.com","oneocsp.microsoft.com","packagecloud.io","packages.cloud.google.com","packages.microsoft.com","pkgs.dev.azure.com","ppa.launchpad.net","raw.githubusercontent.com","registry.npmjs.org","s.symcb.com","s.symcd.com","security.ubuntu.com","telemetry.enterprise.githubcopilot.com","ts-crl.ws.symantec.com","ts-ocsp.ws.symantec.com","vsassets.io","www.googleapis.com","www.microsoft.com"]},"apiProxy":{"enabled":true,"models":{"auto":["large"],"deep-research":["copilot/deep-research*","google/deep-research*"],"gemini-flash":["copilot/gemini-*flash*","google/gemini-*flash*"],"gemini-pro":["copilot/gemini-*pro*","google/gemini-*pro*"],"gpt-4.1":["copilot/gpt-4.1*","openai/gpt-4.1*"],"gpt-5":["copilot/gpt-5*","openai/gpt-5*"],"gpt-5-codex":["copilot/gpt-5*codex*","openai/gpt-5*codex*"],"gpt-5-mini":["copilot/gpt-5*mini*","openai/gpt-5*mini*"],"gpt-5-nano":["copilot/gpt-5*nano*","openai/gpt-5*nano*"],"gpt-5-pro":["copilot/gpt-5*pro*","openai/gpt-5*pro*"],"haiku":["copilot/*haiku*","anthropic/*haiku*"],"large":["sonnet","gpt-5-pro","gpt-5","gemini-pro"],"mini":["haiku","gpt-5-mini","gpt-5-nano","gemini-flash"],"opus":["copilot/*opus*","anthropic/*opus*"],"reasoning":["copilot/o1*","copilot/o3*","copilot/o4*","openai/o1*","openai/o3*","openai/o4*"],"small":["mini"],"sonnet":["copilot/*sonnet*","anthropic/*sonnet*"]}},"container":{"imageTag":"0.25.40,squid=sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51,agent=sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504,api-proxy=sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280,cli-proxy=sha256:3e7152911d4b4b7b97beef9d3d7d924ff7902227e86001ef3838fb728d5d514c"}}' > "${RUNNER_TEMP}/gh-aw/awf-config.json" && cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json # shellcheck disable=SC1003 - sudo -E awf --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --allow-domains '*.githubusercontent.com,*.vsblob.vsassets.io,aka.ms,api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.nuget.org,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,azuresearch-usnc.nuget.org,azuresearch-ussc.nuget.org,builds.dotnet.microsoft.com,ci.dot.net,codeload.github.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,dc.services.visualstudio.com,dev.azure.com,dist.nuget.org,docs.github.com,dot.net,dotnet.microsoft.com,dotnetcli.blob.core.windows.net,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,microsoft.com,nuget.org,nuget.pkg.github.com,nugetregistryv2prod.blob.core.windows.net,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,oneocsp.microsoft.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,pkgs.dev.azure.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,vsassets.io,www.googleapis.com,www.microsoft.com' --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --image-tag 0.25.29,squid=sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53,agent=sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4,agent-act=sha256:97b4cc14dc2123a45b9d5b9927489f66882dec5857de6afc0e5bab257be92ef1,api-proxy=sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6,cli-proxy=sha256:29917488eb90a01ff9544ffeeb5cc26434a8ea16d69ae8972f5f6be0e567e276 --skip-pull --enable-api-proxy \ + sudo -E awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --skip-pull \ -- /bin/bash -c 'export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && export PATH="$(find /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log env: COPILOT_AGENT_RUNNER_TYPE: STANDALONE @@ -763,7 +779,7 @@ jobs: GH_AW_PHASE: agent GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} - GH_AW_VERSION: v0.71.2 + GH_AW_VERSION: v0.71.5 GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows @@ -811,7 +827,7 @@ jobs: bash "${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh" "$GATEWAY_PID" - name: Redact secrets in logs if: always() - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); @@ -837,7 +853,7 @@ jobs: - name: Ingest agent output id: collect_output if: always() - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} GH_AW_ALLOWED_DOMAINS: "*.githubusercontent.com,*.vsblob.vsassets.io,aka.ms,api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.nuget.org,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,azuresearch-usnc.nuget.org,azuresearch-ussc.nuget.org,builds.dotnet.microsoft.com,ci.dot.net,codeload.github.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,dc.services.visualstudio.com,dev.azure.com,dist.nuget.org,docs.github.com,dot.net,dotnet.microsoft.com,dotnetcli.blob.core.windows.net,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,microsoft.com,nuget.org,nuget.pkg.github.com,nugetregistryv2prod.blob.core.windows.net,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,oneocsp.microsoft.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,pkgs.dev.azure.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,vsassets.io,www.googleapis.com,www.microsoft.com" @@ -852,7 +868,7 @@ jobs: await main(); - name: Parse agent logs for step summary if: always() - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ with: @@ -864,7 +880,7 @@ jobs: - name: Parse MCP Gateway logs for step summary if: always() id: parse-mcp-gateway - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); @@ -889,13 +905,23 @@ jobs: - name: Parse token usage for step summary if: always() continue-on-error: true - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); setupGlobals(core, github, context, exec, io, getOctokit); const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_token_usage.cjs'); await main(); + - name: Print AWF reflect summary + if: always() + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/awf_reflect_summary.cjs'); + await main(); - name: Write agent output placeholder if missing if: always() run: | @@ -917,14 +943,17 @@ jobs: !/tmp/gh-aw/proxy-logs/proxy-tls/ /tmp/gh-aw/agent_usage.json /tmp/gh-aw/agent-stdio.log + /tmp/gh-aw/pre-agent-audit.txt /tmp/gh-aw/agent/ /tmp/gh-aw/github_rate_limits.jsonl /tmp/gh-aw/safeoutputs.jsonl /tmp/gh-aw/agent_output.json /tmp/gh-aw/aw-*.patch /tmp/gh-aw/aw-*.bundle + /tmp/gh-aw/awf-config.json /tmp/gh-aw/sandbox/firewall/logs/ /tmp/gh-aw/sandbox/firewall/audit/ + /tmp/gh-aw/sandbox/firewall/awf-reflect.json if-no-files-found: ignore conclusion: @@ -951,11 +980,15 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/macios-reviewer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" - name: Download agent output artifact id: download-agent-output continue-on-error: true @@ -972,7 +1005,7 @@ jobs: echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" - name: Process no-op messages id: noop - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_NOOP_MAX: "1" @@ -989,7 +1022,7 @@ jobs: await main(); - name: Log detection run id: detection_runs - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" @@ -1005,7 +1038,7 @@ jobs: await main(); - name: Record missing tool id: missing_tool - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_MISSING_TOOL_CREATE_ISSUE: "true" @@ -1019,7 +1052,7 @@ jobs: await main(); - name: Record incomplete id: report_incomplete - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true" @@ -1034,7 +1067,7 @@ jobs: - name: Handle agent failure id: handle_agent_failure if: always() - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" @@ -1054,6 +1087,8 @@ jobs: GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }} GH_AW_GROUP_REPORTS: "false" GH_AW_FAILURE_REPORT_AS_ISSUE: "true" + GH_AW_MISSING_TOOL_REPORT_AS_FAILURE: "true" + GH_AW_MISSING_DATA_REPORT_AS_FAILURE: "true" GH_AW_TIMEOUT_MINUTES: "20" with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} @@ -1064,7 +1099,7 @@ jobs: await main(); - name: Update reaction comment with completion status id: conclusion - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_COMMENT_ID: ${{ needs.activation.outputs.comment_id }} @@ -1098,11 +1133,15 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/macios-reviewer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" - name: Download agent output artifact id: download-agent-output continue-on-error: true @@ -1128,7 +1167,7 @@ jobs: rm -rf /tmp/gh-aw/sandbox/firewall/logs rm -rf /tmp/gh-aw/sandbox/firewall/audit - name: Download container images - run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.29@sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.29@sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6 ghcr.io/github/gh-aw-firewall/squid:0.25.29@sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53 + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.40@sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.40@sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280 ghcr.io/github/gh-aw-firewall/squid:0.25.40@sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51 - name: Check if detection needed id: detection_guard if: always() @@ -1165,7 +1204,7 @@ jobs: ls -la /tmp/gh-aw/threat-detection/ 2>/dev/null || true - name: Setup threat detection if: always() && steps.detection_guard.outputs.run_detection == 'true' - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" WORKFLOW_DESCRIPTION: "No description provided" @@ -1187,11 +1226,11 @@ jobs: node-version: '24' package-manager-cache: false - name: Install GitHub Copilot CLI - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.36 + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.40 env: GH_HOST: github.com - name: Install AWF binary - run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.29 + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.40 - name: Execute GitHub Copilot CLI if: always() && steps.detection_guard.outputs.run_detection == 'true' continue-on-error: true @@ -1204,8 +1243,9 @@ jobs: GH_AW_NODE_BIN=$(command -v node 2>/dev/null || true) export GH_AW_NODE_BIN (umask 177 && touch /tmp/gh-aw/threat-detection/detection.log) + printf '%s\n' '{"$schema":"https://github.com/github/gh-aw-firewall/releases/download/v0.25.40/awf-config.schema.json","network":{"allowDomains":["api.business.githubcopilot.com","api.enterprise.githubcopilot.com","api.github.com","api.githubcopilot.com","api.individual.githubcopilot.com","github.com","host.docker.internal","telemetry.enterprise.githubcopilot.com"]},"apiProxy":{"enabled":true},"container":{"imageTag":"0.25.40,squid=sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51,agent=sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504,api-proxy=sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280,cli-proxy=sha256:3e7152911d4b4b7b97beef9d3d7d924ff7902227e86001ef3838fb728d5d514c"}}' > "${RUNNER_TEMP}/gh-aw/awf-config.json" && cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json # shellcheck disable=SC1003 - sudo -E awf --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --allow-domains api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,github.com,host.docker.internal,telemetry.enterprise.githubcopilot.com --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --image-tag 0.25.29,squid=sha256:8a71ad9e40454051672312917e51567abfb8251d7c294d086c48f63d84e4cb53,agent=sha256:e68f37e36962dcb3f3d1de680a49bc2302cefd001b941a7dc377155ec7ce42f4,agent-act=sha256:97b4cc14dc2123a45b9d5b9927489f66882dec5857de6afc0e5bab257be92ef1,api-proxy=sha256:d1219e4110684402aabbeb5a43858f26790c9d0be210581cf3f7a521bd2c87b6,cli-proxy=sha256:29917488eb90a01ff9544ffeeb5cc26434a8ea16d69ae8972f5f6be0e567e276 --skip-pull --enable-api-proxy \ + sudo -E awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --skip-pull \ -- /bin/bash -c 'export PATH="$(find /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/threat-detection/detection.log env: COPILOT_AGENT_RUNNER_TYPE: STANDALONE @@ -1214,7 +1254,7 @@ jobs: COPILOT_MODEL: claude-sonnet-4.5 GH_AW_PHASE: detection GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt - GH_AW_VERSION: v0.71.2 + GH_AW_VERSION: v0.71.5 GITHUB_API_URL: ${{ github.api_url }} GITHUB_AW: true GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows @@ -1239,7 +1279,7 @@ jobs: id: detection_conclusion if: always() continue-on-error: true - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: RUN_DETECTION: ${{ steps.detection_guard.outputs.run_detection }} GH_AW_DETECTION_CONTINUE_ON_ERROR: "true" @@ -1267,7 +1307,7 @@ jobs: } pre_activation: - if: "github.event_name == 'issue_comment' && (startsWith(github.event.comment.body, '/review ') || startsWith(github.event.comment.body, '/review\n') || github.event.comment.body == '/review') && github.event.issue.pull_request != null || !(github.event_name == 'issue_comment')" + if: "(github.event_name != 'issue_comment' && github.event_name != 'pull_request_review_comment' || contains(fromJSON('[\"OWNER\",\"MEMBER\",\"COLLABORATOR\"]'), github.event.comment.author_association)) && (github.event_name == 'issue_comment' && (startsWith(github.event.comment.body, '/review ') || startsWith(github.event.comment.body, '/review\n') || github.event.comment.body == '/review') && github.event.issue.pull_request != null || !(github.event_name == 'issue_comment'))" runs-on: ubuntu-slim outputs: activated: ${{ steps.check_membership.outputs.is_team_member == 'true' && steps.check_command_position.outputs.command_position_ok == 'true' }} @@ -1276,13 +1316,17 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} + env: + GH_AW_SETUP_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/macios-reviewer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" - name: Check team membership for command workflow id: check_membership - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_REQUIRED_ROLES: "admin,maintainer,write" with: @@ -1294,7 +1338,7 @@ jobs: await main(); - name: Check command position id: check_command_position - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_COMMANDS: "[\"review\"]" with: @@ -1322,7 +1366,7 @@ jobs: GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }} GH_AW_ENGINE_ID: "copilot" GH_AW_ENGINE_MODEL: "claude-sonnet-4.5" - GH_AW_ENGINE_VERSION: "1.0.36" + GH_AW_ENGINE_VERSION: "1.0.40" GH_AW_WORKFLOW_ID: "macios-reviewer" GH_AW_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" outputs: @@ -1335,11 +1379,15 @@ jobs: steps: - name: Setup Scripts id: setup - uses: github/gh-aw-actions/setup@ab8940d1df237fc4fae4ab8091e7ba66ada55a55 # v0.71.2 + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 with: destination: ${{ runner.temp }}/gh-aw/actions job-name: ${{ github.job }} trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: ".NET for Apple Platforms PR Reviewer" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/macios-reviewer.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" - name: Download agent output artifact id: download-agent-output continue-on-error: true @@ -1365,7 +1413,7 @@ jobs: echo "GH_HOST=${GH_HOST}" >> "$GITHUB_ENV" - name: Process Safe Outputs id: process_safe_outputs - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} GH_AW_ALLOWED_DOMAINS: "*.githubusercontent.com,*.vsblob.vsassets.io,aka.ms,api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.nuget.org,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,azuresearch-usnc.nuget.org,azuresearch-ussc.nuget.org,builds.dotnet.microsoft.com,ci.dot.net,codeload.github.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,dc.services.visualstudio.com,dev.azure.com,dist.nuget.org,docs.github.com,dot.net,dotnet.microsoft.com,dotnetcli.blob.core.windows.net,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,microsoft.com,nuget.org,nuget.pkg.github.com,nugetregistryv2prod.blob.core.windows.net,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,oneocsp.microsoft.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,pkgs.dev.azure.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,vsassets.io,www.googleapis.com,www.microsoft.com" diff --git a/.github/workflows/macios-reviewer.md b/.github/workflows/macios-reviewer.md index 72da3cc06bd9..10fe33bae503 100644 --- a/.github/workflows/macios-reviewer.md +++ b/.github/workflows/macios-reviewer.md @@ -56,6 +56,6 @@ A maintainer commented `/review` on this pull request. Perform a thorough code r - Don't flag what CI catches (compiler errors, linter issues). - Don't review C# code formatting — it is handled automatically. - Avoid false positives — verify concerns given the full file context. -- **Never submit an APPROVE event.** Use COMMENT for clean PRs and REQUEST_CHANGES when issues are found. +- **Never submit an APPROVE event.** Use COMMENT for clean PRs (or re-reviews where previous issues are fixed) and REQUEST_CHANGES only when ❌ error-level issues are found. Submitting COMMENT on a re-review clears any previous REQUEST_CHANGES state. - Prioritize: bugs > breaking changes > binding correctness > safety > performance > missing tests > duplication > consistency > documentation. - Ignore comments from the user 'vs-mobiletools-engineering-service2'. From b4a70d2ff8ab1e6d0f0ddae086f6acec98f909e6 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 7 May 2026 08:01:11 +0200 Subject: [PATCH 27/35] [tools/msbuild] Add InlineDlfcnMethodsStep as an opt-in custom linker step (#24888) Add a new custom linker step that replaces runtime `Dlfcn.dlsym` calls with direct native symbol lookups via P/Invokes to `__Internal`. This improves startup performance and app size, and ensures the native linker can see symbol references that would otherwise only be resolved at runtime. Two modes are supported, controlled by the `InlineDlfcnMethods` MSBuild property: * `strict`: inlines all calls to `ObjCRuntime.Dlfcn` APIs. * `compatibility`: only inlines calls that reference symbols from `[Field]` attributes. Post-trimming MSBuild targets ensure native code is only generated for symbols that survive trimming (ILTrim or NativeAOT): * `_CollectPostILTrimInformation`: scans trimmed assemblies for surviving inlined dlfcn P/Invokes, with per-assembly caching for incremental builds. * `_CollectPostNativeAOTTrimInformation`: reads unresolved symbols from the NativeAOT object file or static library and filters for inlined dlfcn symbols. * `_PostTrimmingProcessing`: generates native C code for surviving symbols and adds it to the native link inputs. Extends `MachO.cs` with LC_SYMTAB parsing to read unresolved symbols from both Mach-O object files and static libraries. Contributes towards https://github.com/dotnet/macios/issues/17693. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/building-apps/build-properties.md | 30 + docs/code/native-symbols.md | 69 ++ dotnet/targets/Xamarin.Shared.Sdk.props | 6 + dotnet/targets/Xamarin.Shared.Sdk.targets | 108 ++ .../Tasks/CollectPostILTrimInformation.cs | 118 ++ .../Tasks/CollectUnresolvedNativeSymbols.cs | 51 + .../Tasks/CompileNativeCode.cs | 4 + .../ComputeNativeAOTSurvivingNativeSymbols.cs | 68 ++ .../Tasks/PostTrimmingProcessing.cs | 134 +++ .../Xamarin.MacDev.Tasks.csproj | 3 + tests/common/test-variations.csproj | 21 + .../MacCatalyst-MonoVM-interpreter-size.txt | 6 +- .../expected/MacCatalyst-MonoVM-size.txt | 6 +- ...atalyst-NativeAOT-TrimmableStatic-size.txt | 4 +- .../expected/MacCatalyst-NativeAOT-size.txt | 4 +- ...reCLR-Interpreter-TrimmableStatic-size.txt | 10 +- .../MacOSX-CoreCLR-Interpreter-size.txt | 10 +- .../MacOSX-NativeAOT-TrimmableStatic-size.txt | 4 +- .../expected/MacOSX-NativeAOT-size.txt | 4 +- .../expected/TVOS-MonoVM-interpreter-size.txt | 4 +- .../UnitTests/expected/TVOS-MonoVM-size.txt | 4 +- .../TVOS-NativeAOT-TrimmableStatic-size.txt | 4 +- .../expected/TVOS-NativeAOT-size.txt | 4 +- .../expected/iOS-MonoVM-interpreter-size.txt | 4 +- .../UnitTests/expected/iOS-MonoVM-size.txt | 4 +- .../iOS-NativeAOT-TrimmableStatic-size.txt | 4 +- .../UnitTests/expected/iOS-NativeAOT-size.txt | 4 +- .../CoreFoundation/ProxyTest.cs | 17 - .../CoreGraphics/GeometryTest.cs | 9 +- .../Foundation/AttributedStringTest.cs | 22 - tests/monotouch-test/ObjCRuntime/DlfcnTest.cs | 70 +- tests/monotouch-test/dotnet/shared.csproj | 1 + .../xharness/Jenkins/TestVariationsFactory.cs | 4 + tools/common/CompilerFlags.cs | 2 +- tools/common/Frameworks.cs | 69 +- tools/common/MachO.cs | 105 +- tools/common/Symbols.cs | 10 +- tools/dotnet-linker/AppBundleRewriter.cs | 23 + tools/dotnet-linker/LinkerConfiguration.cs | 29 + .../Steps/AssemblyModifierStep.cs | 6 +- .../Steps/GatherFrameworksStep.cs | 5 +- .../Steps/GenerateReferencesStep.cs | 2 +- .../Steps/InlineDlfcnMethodsStep.cs | 1015 +++++++++++++++++ .../MonoTouch.Tuner/ListExportedSymbols.cs | 9 +- .../MonoTouch.Tuner/ProcessExportedFields.cs | 33 + tools/mtouch/Errors.designer.cs | 36 + tools/mtouch/Errors.resx | 18 + 47 files changed, 2057 insertions(+), 120 deletions(-) create mode 100644 docs/code/native-symbols.md create mode 100644 msbuild/Xamarin.MacDev.Tasks/Tasks/CollectPostILTrimInformation.cs create mode 100644 msbuild/Xamarin.MacDev.Tasks/Tasks/CollectUnresolvedNativeSymbols.cs create mode 100644 msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeNativeAOTSurvivingNativeSymbols.cs create mode 100644 msbuild/Xamarin.MacDev.Tasks/Tasks/PostTrimmingProcessing.cs create mode 100644 tools/dotnet-linker/Steps/InlineDlfcnMethodsStep.cs diff --git a/docs/building-apps/build-properties.md b/docs/building-apps/build-properties.md index b28355b21e83..14277d6f03f5 100644 --- a/docs/building-apps/build-properties.md +++ b/docs/building-apps/build-properties.md @@ -559,6 +559,36 @@ See also: * The [AlternateAppIcon](build-items.md#alternateappicon) item group. * The [AppIcon](#appicon) property. +## InlineDlfcnMethods + +Controls whether the build system replaces runtime calls to `ObjCRuntime.Dlfcn` methods with direct native symbol lookups at build time, eliminating the overhead of `dlsym` at runtime. + +The valid options are: + +* `compatibility`: Only inlines symbol usages backed by `[Field]` attributes. This is more conservative and avoids link errors for symbols that don't exist at build time. +* `strict`: Inlines dlfcn method calls and creates native references for all symbols. This is more aggressive and may cause link errors if referenced native symbols don't exist. +* (empty): Disables inlining of dlfcn method calls. + +Default value: +* .NET 11+: `strict` when using NativeAOT (`PublishAot=true`), `compatibility` otherwise. +* .NET 10 and earlier: not set (disabled). + +Example: + +```xml + + compatibility + +``` + +Custom behavior for specific symbols can be set using the [ReferenceNativeSymbol](build-items.md#referencenativesymbols) item group: + +```xml + + + +``` + ## iOSMinimumVersion Specifies the minimum iOS version the app can run on. diff --git a/docs/code/native-symbols.md b/docs/code/native-symbols.md new file mode 100644 index 000000000000..45aea7239827 --- /dev/null +++ b/docs/code/native-symbols.md @@ -0,0 +1,69 @@ +# Native symbols + +Native symbols can be referenced from managed code in several ways: + +* P/Invokes (DllImports) +* Calls to `dlsym`, which can happen through: + * The various APIs in `ObjCRuntime.Dlfcn` + * The various APIs in `System.Runtime.InteropServices.NativeLibrary` + * A P/Invoke directly into `dlsym` + +It's highly desirable to use a direct native reference to native symbols when building a mobile app, for a few reasons: + +* It's faster at runtime, and the app is smaller. +* If the referenced native symbol comes from a third-party static library, the + native linker can remove it if it's configured to remove unused code + (because the native linker can't see that the native symbol is in fact used + at runtime) unless there's a direct native reference to the symbol. + +On the other hand there's one scenario when a direct native reference is not desirable: when the native symbol does not exist. + +In order to create a direct native reference to native symbols, we need to know the names of those native symbols. + +## The `InlineDlfcnMethods` property + +This behavior is controlled by the `InlineDlfcnMethods` MSBuild property, which +has two modes: + +* `strict`: all calls to `ObjCRuntime.Dlfcn` APIs are inlined. +* `compatibility`: only calls that reference symbols from `[Field]` attributes are inlined. + +See the [build properties documentation](../building-apps/build-properties.md) for default values. + +## How it works + +During the build we try to collect the following: + +* Any property or field with the `[Foundation.Field]` attribute: we collect the symbol name. +* Any calls to the `ObjCRuntime.Dlfcn` APIs: we try to collect the symbol name (this might not always succeed, if the symbol name is not a constant). +* We don't process calls to `System.Runtime.InteropServices.NativeLibrary` at the moment (this may change in the future, if there's need). + +This is further complicated by the fact that we only want to create native +references for symbols that survive trimming. + +So we do the following: + +1. Before or during trimming, we run the inlining steps: + + * `ProcessExportedFields`: collects all members with `[Field]` attributes. + + * `InlineDlfcnMethodsStep`: inspects all calls to `ObjCRuntime.Dlfcn`, and + inlines them depending on the selected mode. If inlined, the step creates + a P/Invoke to a native method that will return the address for that symbol + (using a direct native reference), and modifies the code that fetches that + symbol to call said P/Invoke. + +2. After trimming, we figure out which of those symbols survived: + + * For ILTrim: the `_CollectPostILTrimInformation` MSBuild target inspects + the trimmed assemblies and collects all the inlined dlfcn P/Invokes that + survived. Per-assembly results are cached to speed up incremental builds. + + * For NativeAOT: the `_CollectPostNativeAOTTrimInformation` MSBuild target + inspects the native object file (or static library) produced by NativeAOT, + collects all unresolved native references, and filters them against the + inlined dlfcn symbols to determine which survived. + +3. The `_PostTrimmingProcessing` MSBuild target takes the surviving symbols + from either path, generates the corresponding native C code, and adds it to + the list of files to compile and link into the final executable. diff --git a/dotnet/targets/Xamarin.Shared.Sdk.props b/dotnet/targets/Xamarin.Shared.Sdk.props index ae5137fbbf76..0007e4766ebc 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.props +++ b/dotnet/targets/Xamarin.Shared.Sdk.props @@ -101,6 +101,12 @@ false + + + strict + compatibility + + diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets index 341e08ac0808..ece45355d5a8 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.targets @@ -18,6 +18,9 @@ + + + @@ -25,6 +28,7 @@ + <_TrimmerCustomSteps Include="$(_AdditionalTaskAssembly)" BeforeStep="MarkStep" Type="MonoTouch.Tuner.RegistrarRemovalTrackingStep" /> @@ -1670,6 +1677,87 @@ + + + <_TrimmedAssembly Include="$(IntermediateLinkDir)*.dll" /> + + + + + + <_ILTrimSurvivingNativeSymbolsFile>$(DeviceSpecificIntermediateOutputPath)inlined-dlfcn\iltrim-surviving-native-symbols.txt + <_NativeAOTUnresolvedSymbolsFile>$(DeviceSpecificIntermediateOutputPath)nativeaot-unresolved-symbols.txt + <_NativeAOTSurvivingNativeSymbolsFile>$(DeviceSpecificIntermediateOutputPath)nativeaot-surviving-native-symbols.txt + + + + + + + + + + + + + + + + + + <_SurvivingNativeSymbolsFile Include="$(_ILTrimSurvivingNativeSymbolsFile)" Condition="Exists('$(_ILTrimSurvivingNativeSymbolsFile)')" /> + <_SurvivingNativeSymbolsFile Include="$(_NativeAOTSurvivingNativeSymbolsFile)" Condition="Exists('$(_NativeAOTSurvivingNativeSymbolsFile)')" /> + + + + + + + + <_PostTrimmingSourceFiles> + $(DeviceSpecificIntermediateOutputPath)posttrim-info-compiled/%(Arch)/%(Filename).o + + + + + + + + <_CompiledPostTrimmingFiles Include="@(_PostTrimmingSourceFiles -> '%(OutputFile)')" /> + <_NativeExecutableObjectFiles Include="@(_CompiledPostTrimmingFiles)" /> + + + + <_CompileNativeExecutableDependsOn> $(_CompileNativeExecutableDependsOn); @@ -1726,6 +1814,7 @@ _ReadAppManifest; _WriteAppManifest; _CompileNativeExecutable; + _PostTrimmingProcessing; _ReidentifyDynamicLibraries; _AddSwiftLinkerFlags; _ComputeLinkNativeExecutableInputs; @@ -1733,6 +1822,25 @@ + + + + + + diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CollectPostILTrimInformation.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CollectPostILTrimInformation.cs new file mode 100644 index 000000000000..116ce430cb49 --- /dev/null +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CollectPostILTrimInformation.cs @@ -0,0 +1,118 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using Microsoft.Build.Framework; + +using Mono.Cecil; + +#nullable enable + +namespace Xamarin.MacDev.Tasks { + /// + /// Scans trimmed assemblies to collect information that survived trimming. + /// See docs/code/native-symbols.md for an overview of native symbol handling. + /// + public class CollectPostILTrimInformation : XamarinTask { + [Required] + public ITaskItem [] TrimmedAssemblies { get; set; } = []; + + /// + /// Output file listing the inlined dlfcn symbols that survived trimming. + /// + [Required] + public string SurvivingNativeSymbolsFile { get; set; } = ""; + + /// + /// Directory for per-assembly cache files, to avoid re-scanning unchanged assemblies. + /// + [Required] + public string CacheDirectory { get; set; } = ""; + + public override bool Execute () + { + Directory.CreateDirectory (CacheDirectory); + + CollectSurvivingNativeSymbols (); + + return !Log.HasLoggedErrors; + } + + void CollectSurvivingNativeSymbols () + { + // Scan trimmed assemblies for surviving P/Invoke methods, using per-assembly caching. + var survivingSymbols = new HashSet (); + foreach (var item in TrimmedAssemblies) { + var assemblyPath = item.ItemSpec; + if (!File.Exists (assemblyPath)) + continue; + + var assemblyName = Path.GetFileNameWithoutExtension (assemblyPath); + var cacheFile = Path.Combine (CacheDirectory, assemblyName + ".dlfcn-symbols.cache"); + + string []? cachedSymbols = null; + if (File.Exists (cacheFile) && File.GetLastWriteTimeUtc (cacheFile) >= File.GetLastWriteTimeUtc (assemblyPath)) { + cachedSymbols = File.ReadAllLines (cacheFile); + Log.LogMessage (MessageImportance.Low, "Using cached dlfcn symbols for {0}", assemblyName); + + survivingSymbols.UnionWith (cachedSymbols); + } else { + var assemblySymbols = new HashSet (); + CollectDlfcnSymbolsFromAssembly (assemblyPath, assemblySymbols); + + // Write per-assembly cache (sorted for stability). + var sortedAssemblySymbols = assemblySymbols.OrderBy (s => s).ToArray (); + File.WriteAllLines (cacheFile, sortedAssemblySymbols); + + survivingSymbols.UnionWith (assemblySymbols); + } + } + + // Write the combined results only if contents changed (sorted for stability). + var sorted = survivingSymbols.OrderBy (s => s).ToArray (); + + if (File.Exists (SurvivingNativeSymbolsFile)) { + var existing = File.ReadAllLines (SurvivingNativeSymbolsFile); + if (existing.SequenceEqual (sorted)) + return; + } + + var dir = Path.GetDirectoryName (SurvivingNativeSymbolsFile); + if (!string.IsNullOrEmpty (dir)) + Directory.CreateDirectory (dir); + File.WriteAllLines (SurvivingNativeSymbolsFile, sorted); + Log.LogMessage (MessageImportance.Low, "Found {0} surviving inlined dlfcn symbols", survivingSymbols.Count); + } + + static void CollectDlfcnSymbolsFromAssembly (string assemblyPath, HashSet survivingSymbols) + { + const string prefix = "xamarin_Dlfcn_"; + const string suffix = "_Native"; + + using var assembly = AssemblyDefinition.ReadAssembly (assemblyPath, new ReaderParameters { ReadSymbols = false }); + foreach (var module in assembly.Modules) { + foreach (var type in module.Types) { + if (!type.HasMethods) + continue; + foreach (var method in type.Methods) { + if (!method.IsPInvokeImpl) + continue; + if (method.PInvokeInfo?.Module?.Name != "__Internal") + continue; + var name = method.Name; + if (!name.StartsWith (prefix) || !name.EndsWith (suffix)) + continue; + var symbolLength = name.Length - prefix.Length - suffix.Length; + if (symbolLength <= 0) + continue; + var symbolName = name.Substring (prefix.Length, symbolLength); + survivingSymbols.Add (symbolName); + } + } + } + } + } +} diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CollectUnresolvedNativeSymbols.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CollectUnresolvedNativeSymbols.cs new file mode 100644 index 000000000000..bc43f111fba4 --- /dev/null +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CollectUnresolvedNativeSymbols.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using Microsoft.Build.Framework; + +#nullable enable + +namespace Xamarin.MacDev.Tasks { + // See docs/code/native-symbols.md for an overview of native symbol handling. + public class CollectUnresolvedNativeSymbols : XamarinTask { + public ITaskItem? StaticLibrary { get; set; } + + [Required] + public string OutputFile { get; set; } = ""; + + public override bool Execute () + { + if (StaticLibrary is null) { + Log.LogError ("StaticLibrary is required."); + return false; + } + + var path = StaticLibrary.ItemSpec; + if (!File.Exists (path)) { + Log.LogError ("Static library not found: {0}", path); + return false; + } + + var symbols = Xamarin.StaticLibrary.GetUnresolvedSymbols (path); + Log.LogMessage (MessageImportance.Low, "Found {0} unresolved symbols in {1}", symbols.Count, path); + + var lines = symbols.OrderBy (s => s).ToArray (); + if (File.Exists (OutputFile)) { + var existing = File.ReadAllLines (OutputFile); + if (existing.SequenceEqual (lines)) + return !Log.HasLoggedErrors; + } + + var dir = Path.GetDirectoryName (OutputFile); + if (!string.IsNullOrEmpty (dir)) + Directory.CreateDirectory (dir); + File.WriteAllLines (OutputFile, lines); + + return !Log.HasLoggedErrors; + } + } +} diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs index affd9e1f3fae..f3816db30ddb 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileNativeCode.cs @@ -136,6 +136,10 @@ public override bool Execute () arguments.Add ("-o"); arguments.Add (outputFile); + var outputDirectory = Path.GetDirectoryName (outputFile); + if (!string.IsNullOrEmpty (outputDirectory)) + Directory.CreateDirectory (outputDirectory); + arguments.Add ("-c"); arguments.Add (src); diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeNativeAOTSurvivingNativeSymbols.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeNativeAOTSurvivingNativeSymbols.cs new file mode 100644 index 000000000000..67eda6ed7ec0 --- /dev/null +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/ComputeNativeAOTSurvivingNativeSymbols.cs @@ -0,0 +1,68 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using Microsoft.Build.Framework; + +#nullable enable + +namespace Xamarin.MacDev.Tasks { + /// + /// Takes the list of unresolved native symbols from a NativeAOT static library and computes + /// which inlined dlfcn native symbols survived trimming. The output file has the same format + /// as CollectPostILTrimInformation's surviving symbols file. + /// See docs/code/native-symbols.md for an overview of native symbol handling. + /// + public class ComputeNativeAOTSurvivingNativeSymbols : XamarinTask { + /// + /// The file listing all unresolved native symbols from the NativeAOT static library. + /// + [Required] + public string UnresolvedSymbolsFile { get; set; } = ""; + + /// + /// Output file listing the native symbols that survived NativeAOT trimming. + /// + [Required] + public string SurvivingNativeSymbolsFile { get; set; } = ""; + + public override bool Execute () + { + if (!File.Exists (UnresolvedSymbolsFile)) + return !Log.HasLoggedErrors; + + const string prefix = "_xamarin_Dlfcn_"; + const string suffix = "_Native"; + var survivingSymbols = new HashSet (); + + foreach (var sym in File.ReadAllLines (UnresolvedSymbolsFile)) { + if (!sym.StartsWith (prefix) || !sym.EndsWith (suffix)) + continue; + var symbolLength = sym.Length - prefix.Length - suffix.Length; + if (symbolLength <= 0) + continue; + var symbolName = sym.Substring (prefix.Length, symbolLength); + survivingSymbols.Add (symbolName); + } + + var sorted = survivingSymbols.OrderBy (s => s).ToArray (); + + if (File.Exists (SurvivingNativeSymbolsFile)) { + var existing = File.ReadAllLines (SurvivingNativeSymbolsFile); + if (existing.SequenceEqual (sorted)) + return !Log.HasLoggedErrors; + } + + var dir = Path.GetDirectoryName (SurvivingNativeSymbolsFile); + if (!string.IsNullOrEmpty (dir)) + Directory.CreateDirectory (dir); + File.WriteAllLines (SurvivingNativeSymbolsFile, sorted); + Log.LogMessage (MessageImportance.Low, "Found {0} surviving native symbols from NativeAOT", survivingSymbols.Count); + + return !Log.HasLoggedErrors; + } + } +} diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/PostTrimmingProcessing.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/PostTrimmingProcessing.cs new file mode 100644 index 000000000000..77705a8dd1d7 --- /dev/null +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/PostTrimmingProcessing.cs @@ -0,0 +1,134 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +using Microsoft.Build.Framework; + +using Xamarin.Bundler; + +#nullable enable + +namespace Xamarin.MacDev.Tasks { + /// + /// Performs post-trimming processing, generating native code only for symbols that survived trimming. + /// See docs/code/native-symbols.md for an overview of native symbol handling. + /// + public class PostTrimmingProcessing : XamarinTask { + [Required] + public string Architecture { get; set; } = ""; + + [Required] + public string OutputDirectory { get; set; } = ""; + + public ITaskItem [] ReferenceNativeSymbol { get; set; } = []; + + /// + /// Files listing native symbols that survived trimming. Each file contains one symbol name per line. + /// These can come from either ILTrim (CollectPostILTrimInformation) or NativeAOT + /// (ComputeNativeAOTSurvivingNativeSymbols). + /// + public ITaskItem [] SurvivingNativeSymbolsFiles { get; set; } = []; + + /// + /// Output native source files to be compiled and linked. + /// + [Output] + public ITaskItem []? NativeSourceFiles { get; set; } + + HashSet? ignoredSymbols; + + HashSet IgnoredSymbols { + get { + if (ignoredSymbols is null) { + ignoredSymbols = new HashSet (); + foreach (var rns in ReferenceNativeSymbol) { + var nativeSymbol = rns.ItemSpec; + var symbolMode = rns.GetMetadata ("SymbolMode"); + if (!string.Equals (symbolMode, "Ignore", StringComparison.OrdinalIgnoreCase)) + continue; + var symbolType = rns.GetMetadata ("SymbolType").ToLowerInvariant (); + switch (symbolType) { + case "objectivecclass": + nativeSymbol = Symbol.ObjectiveCPrefix + nativeSymbol; + break; + case "function": + case "field": + break; + default: + Log.LogMessage (MessageImportance.Low, "Ignoring symbol '{0}' with unknown SymbolType '{1}'", nativeSymbol, symbolType); + continue; + } + ignoredSymbols.Add (nativeSymbol); + } + } + return ignoredSymbols; + } + } + + public override bool Execute () + { + var items = new List (); + + GenerateInlinedDlfcnNativeCode (items); + + NativeSourceFiles = items.ToArray (); + return !Log.HasLoggedErrors; + } + + void GenerateInlinedDlfcnNativeCode (List items) + { + // Collect all surviving symbols from all input files. + var survivingSymbols = new HashSet (); + foreach (var file in SurvivingNativeSymbolsFiles) { + var path = file.ItemSpec; + if (!File.Exists (path)) + continue; + survivingSymbols.UnionWith (File.ReadAllLines (path)); + } + + var survivingButIgnoredSymbols = survivingSymbols.Intersect (IgnoredSymbols).ToList (); + if (survivingButIgnoredSymbols.Count > 0) { + Log.LogMessage (MessageImportance.Low, "The following symbols survived trimming but are marked as ignored:"); + foreach (var symbol in survivingButIgnoredSymbols) + Log.LogMessage (MessageImportance.Low, " {0}", symbol); + survivingSymbols.ExceptWith (survivingButIgnoredSymbols); + } + + if (survivingSymbols.Count == 0) { + Log.LogMessage (MessageImportance.Low, "There were no surviving symbols that require inlined dlfcn native code."); + return; + } + + Directory.CreateDirectory (OutputDirectory); + var outputPath = Path.Combine (OutputDirectory, "inlined-dlfcn.c"); + + var sb = new StringBuilder (); + // The generated C code uses 'extern void*' declarations and returns the address of the symbol. + // This is intentional: it allows the native linker to resolve the symbol at link time, which + // is the whole point of this optimization (avoiding dlsym at runtime). + foreach (var field in survivingSymbols.OrderBy (s => s)) { + // Using 'void*' as a stand-in type since we only need the address + sb.AppendLine ($"extern void* {field};"); + sb.AppendLine ($"void* xamarin_Dlfcn_{field}_Native ();"); + sb.AppendLine ($"void* xamarin_Dlfcn_{field}_Native () {{ return &{field}; }}"); + sb.AppendLine (); + } + + var content = sb.ToString (); + if (File.Exists (outputPath) && File.ReadAllText (outputPath) == content) { + Log.LogMessage (MessageImportance.Low, "Inlined dlfcn native code is up to date"); + } else { + File.WriteAllText (outputPath, content); + Log.LogMessage (MessageImportance.Low, "Generated inlined dlfcn native code with {0} symbols", survivingSymbols.Count); + } + + var item = new Microsoft.Build.Utilities.TaskItem (outputPath); + item.SetMetadata ("Arch", Architecture.ToLowerInvariant ()); + items.Add (item); + } + } +} diff --git a/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj b/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj index a61be2c501c3..285fb0113a10 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj +++ b/msbuild/Xamarin.MacDev.Tasks/Xamarin.MacDev.Tasks.csproj @@ -81,6 +81,9 @@ StringUtils.cs + + Symbols.cs + FileCopier.cs diff --git a/tests/common/test-variations.csproj b/tests/common/test-variations.csproj index 633c8fc2cb79..d5d820a99fad 100644 --- a/tests/common/test-variations.csproj +++ b/tests/common/test-variations.csproj @@ -23,6 +23,8 @@ + + @@ -147,6 +149,25 @@ <_TestVariationApplied>true + + compatibility + <_TestVariationApplied>true + + + + strict + <_TestVariationApplied>true + + $(DefineConstants);STATIC_NATIVE_SYMBOL_LOOKUP + + + + + + + + + <_InvalidTestVariations Include="$(TestVariation.Split('|'))" Exclude="@(TestVariations)" /> diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt index c0eceeb55daf..ecd8aa0ec456 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-interpreter-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 5,791,876 bytes (5,656.1 KB = 5.5 MB) +AppBundleSize: 5,791,518 bytes (5,655.8 KB = 5.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 3,310 bytes (3.2 KB = 0.0 MB) -Contents/Info.plist: 1,105 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 4,567,200 bytes (4,460.2 KB = 4.4 MB) +Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) +Contents/MacOS/SizeTestApp: 4,566,848 bytes (4,459.8 KB = 4.4 MB) Contents/MonoBundle/Microsoft.MacCatalyst.dll: 158,208 bytes (154.5 KB = 0.2 MB) Contents/MonoBundle/runtimeconfig.bin: 1,405 bytes (1.4 KB = 0.0 MB) Contents/MonoBundle/SizeTestApp.dll: 7,680 bytes (7.5 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt index 30e271a333ce..59e70bf96ffd 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-MonoVM-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 16,327,064 bytes (15,944.4 KB = 15.6 MB) +AppBundleSize: 16,326,690 bytes (15,944.0 KB = 15.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 4,134 bytes (4.0 KB = 0.0 MB) -Contents/Info.plist: 1,105 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 13,816,208 bytes (13,492.4 KB = 13.2 MB) +Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) +Contents/MacOS/SizeTestApp: 13,815,840 bytes (13,492.0 KB = 13.2 MB) Contents/MonoBundle/aot-instances.aotdata.arm64: 1,045,032 bytes (1,020.5 KB = 1.0 MB) Contents/MonoBundle/Microsoft.MacCatalyst.aotdata.arm64: 36,048 bytes (35.2 KB = 0.0 MB) Contents/MonoBundle/Microsoft.MacCatalyst.dll: 51,200 bytes (50.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt index 1f4b876d0ab6..76fb1f7ee130 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 8,759,335 bytes (8,554.0 KB = 8.4 MB) +AppBundleSize: 8,759,329 bytes (8,554.0 KB = 8.4 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 2,358 bytes (2.3 KB = 0.0 MB) -Contents/Info.plist: 1,105 bytes (1.1 KB = 0.0 MB) +Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 8,753,968 bytes (8,548.8 KB = 8.3 MB) Contents/MonoBundle/runtimeconfig.bin: 1,896 bytes (1.9 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt index 1f96717a8196..8d0cf443f128 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 2,781,135 bytes (2,716.0 KB = 2.7 MB) +AppBundleSize: 2,781,129 bytes (2,715.9 KB = 2.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 2,358 bytes (2.3 KB = 0.0 MB) -Contents/Info.plist: 1,105 bytes (1.1 KB = 0.0 MB) +Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 2,775,856 bytes (2,710.8 KB = 2.6 MB) Contents/MonoBundle/runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt index a8de8bacc18f..9175a93d88bc 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt @@ -1,12 +1,12 @@ -AppBundleSize: 259,305,962 bytes (253,228.5 KB = 247.3 MB) +AppBundleSize: 259,304,804 bytes (253,227.3 KB = 247.3 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 67,868 bytes (66.3 KB = 0.1 MB) -Contents/Info.plist: 736 bytes (0.7 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 7,411,744 bytes (7,238.0 KB = 7.1 MB) +Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) +Contents/MacOS/SizeTestApp: 7,411,616 bytes (7,237.9 KB = 7.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/_Microsoft.macOS.TypeMap.dll: 4,842,496 bytes (4,729.0 KB = 4.6 MB) Contents/MonoBundle/.xamarin/osx-arm64/_SizeTestApp.TypeMap.dll: 3,072 bytes (3.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 893,192 bytes (872.3 KB = 0.9 MB) -Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 38,126,592 bytes (37,233.0 KB = 36.4 MB) +Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 38,126,080 bytes (37,232.5 KB = 36.4 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.Core.dll: 1,335,096 bytes (1,303.8 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.dll: 17,680 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Primitives.dll: 16,144 bytes (15.8 KB = 0.0 MB) @@ -182,7 +182,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/WindowsBase.dll: 16,688 bytes (16.3 KB = Contents/MonoBundle/.xamarin/osx-x64/_Microsoft.macOS.TypeMap.dll: 4,842,496 bytes (4,729.0 KB = 4.6 MB) Contents/MonoBundle/.xamarin/osx-x64/_SizeTestApp.TypeMap.dll: 3,072 bytes (3.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.CSharp.dll: 796,432 bytes (777.8 KB = 0.8 MB) -Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 38,126,592 bytes (37,233.0 KB = 36.4 MB) +Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 38,126,080 bytes (37,232.5 KB = 36.4 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.Core.dll: 1,166,648 bytes (1,139.3 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.dll: 17,680 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Primitives.dll: 16,176 bytes (15.8 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt index 92b0c3dcee84..812ae13a20eb 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt @@ -1,10 +1,10 @@ -AppBundleSize: 247,478,868 bytes (241,678.6 KB = 236.0 MB) +AppBundleSize: 247,477,726 bytes (241,677.5 KB = 236.0 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 67,160 bytes (65.6 KB = 0.1 MB) -Contents/Info.plist: 736 bytes (0.7 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 8,068,000 bytes (7,878.9 KB = 7.7 MB) +Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) +Contents/MacOS/SizeTestApp: 8,067,888 bytes (7,878.8 KB = 7.7 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.CSharp.dll: 893,192 bytes (872.3 KB = 0.9 MB) -Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 36,730,368 bytes (35,869.5 KB = 35.0 MB) +Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 36,729,856 bytes (35,869.0 KB = 35.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.Core.dll: 1,335,096 bytes (1,303.8 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.dll: 17,680 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Primitives.dll: 16,144 bytes (15.8 KB = 0.0 MB) @@ -178,7 +178,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XPath.dll: 16,144 bytes (15.8 Contents/MonoBundle/.xamarin/osx-arm64/System.Xml.XPath.XDocument.dll: 17,672 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/WindowsBase.dll: 16,688 bytes (16.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.CSharp.dll: 796,432 bytes (777.8 KB = 0.8 MB) -Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 36,730,368 bytes (35,869.5 KB = 35.0 MB) +Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 36,729,856 bytes (35,869.0 KB = 35.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.Core.dll: 1,166,648 bytes (1,139.3 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.dll: 17,680 bytes (17.3 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Primitives.dll: 16,176 bytes (15.8 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt index c0f4920c9b03..74bd56956228 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 21,466,082 bytes (20,963.0 KB = 20.5 MB) +AppBundleSize: 21,466,076 bytes (20,963.0 KB = 20.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 3,489 bytes (3.4 KB = 0.0 MB) -Contents/Info.plist: 736 bytes (0.7 KB = 0.0 MB) +Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 18,472,416 bytes (18,039.5 KB = 17.6 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 252,176 bytes (246.3 KB = 0.2 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: 2,005,440 bytes (1,958.4 KB = 1.9 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt index dcc45c318ac1..80dca93a72af 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 8,818,816 bytes (8,612.1 KB = 8.4 MB) +AppBundleSize: 8,818,810 bytes (8,612.1 KB = 8.4 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 3,489 bytes (3.4 KB = 0.0 MB) -Contents/Info.plist: 736 bytes (0.7 KB = 0.0 MB) +Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) Contents/MacOS/SizeTestApp: 5,825,232 bytes (5,688.7 KB = 5.6 MB) Contents/MonoBundle/libSystem.Globalization.Native.dylib: 252,176 bytes (246.3 KB = 0.2 MB) Contents/MonoBundle/libSystem.IO.Compression.Native.dylib: 2,005,440 bytes (1,958.4 KB = 1.9 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt index a8840dd6a070..54ecb9e249c2 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-interpreter-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 3,617,471 bytes (3,532.7 KB = 3.4 MB) +AppBundleSize: 3,617,465 bytes (3,532.7 KB = 3.4 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 3,999 bytes (3.9 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,123 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) Microsoft.tvOS.dll: 155,136 bytes (151.5 KB = 0.1 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,405 bytes (1.4 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt index ac016e47913f..c8fe10c3eb92 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-MonoVM-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 9,364,029 bytes (9,144.6 KB = 8.9 MB) +AppBundleSize: 9,364,023 bytes (9,144.6 KB = 8.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 5,233 bytes (5.1 KB = 0.0 MB) aot-instances.aotdata.arm64: 827,592 bytes (808.2 KB = 0.8 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,123 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) Microsoft.tvOS.aotdata.arm64: 22,640 bytes (22.1 KB = 0.0 MB) Microsoft.tvOS.dll: 49,152 bytes (48.0 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt index e91793096976..de72f82de756 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 7,905,353 bytes (7,720.1 KB = 7.5 MB) +AppBundleSize: 7,905,347 bytes (7,720.1 KB = 7.5 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,123 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,889 bytes (1.8 KB = 0.0 MB) SizeTestApp: 7,899,360 bytes (7,714.2 KB = 7.5 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt index 56adae8012cd..a17ad92e4f57 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 2,783,144 bytes (2,717.9 KB = 2.7 MB) +AppBundleSize: 2,783,138 bytes (2,717.9 KB = 2.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,123 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) SizeTestApp: 2,777,232 bytes (2,712.1 KB = 2.6 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt b/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt index ff794b9d49c7..95938f6bec29 100644 --- a/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-MonoVM-interpreter-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 3,603,925 bytes (3,519.5 KB = 3.4 MB) +AppBundleSize: 3,603,919 bytes (3,519.5 KB = 3.4 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 3,997 bytes (3.9 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,147 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) Microsoft.iOS.dll: 155,136 bytes (151.5 KB = 0.1 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,405 bytes (1.4 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt b/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt index 6de64cd4b7d8..c86caef51f9b 100644 --- a/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-MonoVM-size.txt @@ -1,9 +1,9 @@ -AppBundleSize: 9,338,369 bytes (9,119.5 KB = 8.9 MB) +AppBundleSize: 9,338,363 bytes (9,119.5 KB = 8.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 5,229 bytes (5.1 KB = 0.0 MB) aot-instances.aotdata.arm64: 827,592 bytes (808.2 KB = 0.8 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,147 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) Microsoft.iOS.aotdata.arm64: 22,992 bytes (22.5 KB = 0.0 MB) Microsoft.iOS.dll: 49,152 bytes (48.0 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt index 75389a923d59..a367ebbb43e2 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 9,038,992 bytes (8,827.1 KB = 8.6 MB) +AppBundleSize: 9,038,986 bytes (8,827.1 KB = 8.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,147 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,888 bytes (1.8 KB = 0.0 MB) SizeTestApp: 9,032,976 bytes (8,821.3 KB = 8.6 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt index 565b3f18fafb..f137a40fb64b 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 2,783,888 bytes (2,718.6 KB = 2.7 MB) +AppBundleSize: 2,783,882 bytes (2,718.6 KB = 2.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) -Info.plist: 1,147 bytes (1.1 KB = 0.0 MB) +Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) SizeTestApp: 2,777,952 bytes (2,712.8 KB = 2.6 MB) diff --git a/tests/monotouch-test/CoreFoundation/ProxyTest.cs b/tests/monotouch-test/CoreFoundation/ProxyTest.cs index 99c7c214d68b..3dc46ece6d40 100644 --- a/tests/monotouch-test/CoreFoundation/ProxyTest.cs +++ b/tests/monotouch-test/CoreFoundation/ProxyTest.cs @@ -18,23 +18,6 @@ namespace MonoTouchFixtures.CoreFoundation { [TestFixture] [Preserve (AllMembers = true)] public class ProxyTest { - - [Test] - public void Fields () - { - // documented but symbols are missing - // this test will fail if Apple decide to include them in the future - IntPtr lib = Dlfcn.dlopen (Constants.CoreFoundationLibrary, 0); - try { - // http://developer.apple.com/library/ios/documentation/CoreFoundation/Reference/CFProxySupport/Reference/reference.html#//apple_ref/doc/c_ref/kCFProxyAutoConfigurationHTTPResponseKey - Assert.That (Dlfcn.dlsym (lib, "kCFProxyAutoConfigurationHTTPResponseKey"), Is.EqualTo (IntPtr.Zero), "kCFProxyAutoConfigurationHTTPResponseKey"); - // http://developer.apple.com/library/ios/documentation/CoreFoundation/Reference/CFProxySupport/Reference/reference.html#//apple_ref/doc/c_ref/kCFNetworkProxiesProxyAutoConfigJavaScript - Assert.That (Dlfcn.dlsym (lib, "kCFNetworkProxiesProxyAutoConfigJavaScript"), Is.EqualTo (IntPtr.Zero), "kCFNetworkProxiesProxyAutoConfigJavaScript"); - } finally { - Dlfcn.dlclose (lib); - } - } - #if !MONOMAC HttpListener listener; int port; diff --git a/tests/monotouch-test/CoreGraphics/GeometryTest.cs b/tests/monotouch-test/CoreGraphics/GeometryTest.cs index f60ced6f596c..24eb3c0520b3 100644 --- a/tests/monotouch-test/CoreGraphics/GeometryTest.cs +++ b/tests/monotouch-test/CoreGraphics/GeometryTest.cs @@ -17,9 +17,8 @@ public class GeometryTest { static public readonly IntPtr Handle = Dlfcn.dlopen (Constants.CoreGraphicsLibrary, 0); - public static CGRect GetRect (string symbol) + public static CGRect GetRect (IntPtr indirect) { - var indirect = Dlfcn.dlsym (Handle, symbol); if (indirect == IntPtr.Zero) return CGRect.Empty; unsafe { @@ -31,7 +30,7 @@ public static CGRect GetRect (string symbol) [Test] public void Infinite () { - var r = GetRect ("CGRectInfinite"); + var r = GetRect (Dlfcn.dlsym (Handle, "CGRectInfinite")); Assert.False (r.IsEmpty, "IsEmpty"); Assert.False (r.IsNull (), "IsNull"); Assert.True (r.IsInfinite (), "IsInfinite"); @@ -40,7 +39,7 @@ public void Infinite () [Test] public void Null () { - var r = GetRect ("CGRectNull"); + var r = GetRect (Dlfcn.dlsym (Handle, "CGRectNull")); Assert.True (r.IsEmpty, "IsEmpty"); Assert.True (r.IsNull (), "IsNull"); Assert.False (r.IsInfinite (), "IsInfinite"); @@ -49,7 +48,7 @@ public void Null () [Test] public void Zero () { - var r = GetRect ("CGRectZero"); + var r = GetRect (Dlfcn.dlsym (Handle, "CGRectZero")); Assert.True (r.IsEmpty, "IsEmpty"); Assert.False (r.IsNull (), "IsNull"); Assert.False (r.IsInfinite (), "IsInfinite"); diff --git a/tests/monotouch-test/Foundation/AttributedStringTest.cs b/tests/monotouch-test/Foundation/AttributedStringTest.cs index 62ffbdbdd702..4844f9885cbb 100644 --- a/tests/monotouch-test/Foundation/AttributedStringTest.cs +++ b/tests/monotouch-test/Foundation/AttributedStringTest.cs @@ -52,28 +52,6 @@ void cb (NSDictionary attrs, NSRange range, ref bool stop) failEnum = true; } - [Test] - public void Fields () - { - // fields are not available in iOS (at least up to 5.1.1) - // this test will fail if this ever change in the future - IntPtr lib = Dlfcn.dlopen (Constants.FoundationLibrary, 0); - try { - Assert.That (Dlfcn.dlsym (lib, "NSFontAttributeName"), Is.EqualTo (IntPtr.Zero), "NSFontAttributeName"); - Assert.That (Dlfcn.dlsym (lib, "NSLinkAttributeName"), Is.EqualTo (IntPtr.Zero), "NSLinkAttributeName"); - Assert.That (Dlfcn.dlsym (lib, "NSUnderlineStyleAttributeName"), Is.EqualTo (IntPtr.Zero), "NSUnderlineStyleAttributeName"); - Assert.That (Dlfcn.dlsym (lib, "NSStrikethroughStyleAttributeName"), Is.EqualTo (IntPtr.Zero), "NSStrikethroughStyleAttributeName"); - Assert.That (Dlfcn.dlsym (lib, "NSStrokeWidthAttributeName"), Is.EqualTo (IntPtr.Zero), "NSStrokeWidthAttributeName"); - Assert.That (Dlfcn.dlsym (lib, "NSParagraphStyleAttributeName"), Is.EqualTo (IntPtr.Zero), "NSParagraphStyleAttributeName"); - Assert.That (Dlfcn.dlsym (lib, "NSForegroundColorAttributeName"), Is.EqualTo (IntPtr.Zero), "NSForegroundColorAttributeName"); - Assert.That (Dlfcn.dlsym (lib, "NSBackgroundColorAttributeName"), Is.EqualTo (IntPtr.Zero), "NSBackgroundColorAttributeName"); - Assert.That (Dlfcn.dlsym (lib, "NSLigatureAttributeName"), Is.EqualTo (IntPtr.Zero), "NSLigatureAttributeName"); - Assert.That (Dlfcn.dlsym (lib, "NSObliquenessAttributeName"), Is.EqualTo (IntPtr.Zero), "NSObliquenessAttributeName"); - } finally { - Dlfcn.dlclose (lib); - } - } - [Test] public void UIKitAttachmentConveniences_New () { diff --git a/tests/monotouch-test/ObjCRuntime/DlfcnTest.cs b/tests/monotouch-test/ObjCRuntime/DlfcnTest.cs index aeda262d8b76..8fa51299cbbc 100644 --- a/tests/monotouch-test/ObjCRuntime/DlfcnTest.cs +++ b/tests/monotouch-test/ObjCRuntime/DlfcnTest.cs @@ -13,6 +13,53 @@ namespace MonoTouchFixtures.ObjCRuntime { [Preserve (AllMembers = true)] public class DlfcnTest { + // These tests exercise [Field]-backed properties from Apple frameworks. + // The generated binding code calls Dlfcn.GetStringConstant / GetIntPtr / etc. + // under the hood, which is what InlineDlfcnMethodsStep transforms. + + [Test] + public void StringConstant_NSLocaleNotification () + { + var value = NSLocale.CurrentLocaleDidChangeNotification; + Assert.IsNotNull (value, "CurrentLocaleDidChangeNotification"); + Assert.AreEqual ("kCFLocaleCurrentLocaleDidChangeNotification", (string) value, "value"); + } + + [Test] + public void StringConstant_NSBundleNotification () + { + var value = NSBundle.BundleDidLoadNotification; + Assert.IsNotNull (value, "BundleDidLoadNotification"); + Assert.AreEqual ("NSBundleDidLoadNotification", (string) value, "value"); + } + + [Test] + public void StringConstant_NSUserDefaultsNotification () + { + var value = NSUserDefaults.DidChangeNotification; + Assert.IsNotNull (value, "DidChangeNotification"); + Assert.AreEqual ("NSUserDefaultsDidChangeNotification", (string) value, "value"); + } + + [Test] + public void StringConstant_NSUndoManagerNotification () + { + var value = NSUndoManager.CheckpointNotification; + Assert.IsNotNull (value, "CheckpointNotification"); + Assert.AreEqual ("NSUndoManagerCheckpointNotification", (string) value, "value"); + } + + [Test] + public void StringConstant_CachePointer () + { + // Access several string constants multiple times to test caching behavior. + // The binding code uses Dlfcn.CachePointer for repeated accesses. + for (int i = 0; i < 3; i++) { + var value = NSLocale.CurrentLocaleDidChangeNotification; + Assert.IsNotNull (value, $"iteration {i}"); + } + } + [Test] public void OpenClose_libSystem () { @@ -32,7 +79,7 @@ public void OpenClose_libSystem () [Test] public void GetVariables () { - var symbol = "x_native_field"; + const string symbol = "x_native_field"; var handle = (IntPtr) Dlfcn.RTLD.Default; Assert.AreNotEqual (IntPtr.Zero, Dlfcn.dlsym (handle, symbol), "Symbol"); @@ -63,8 +110,10 @@ public void GetVariables () Assert.AreEqual (-3.9541907E+28f, Dlfcn.GetStruct (handle, symbol), "GetStruct"); Assert.AreEqual (-7.7576533930025207E-103d, Dlfcn.GetStruct (handle, symbol), "GetStruct"); +#if !STATIC_NATIVE_SYMBOL_LOOKUP Assert.AreEqual ((ulong) 0, Dlfcn.GetStruct (handle, "inexistent_symbol"), "GetStruct inexistent"); Assert.AreEqual ((ulong) 0, Dlfcn.GetStruct (handle, "inexistent_symbol").Value, "GetStruct inexistent"); +#endif Dlfcn.SetInt16 (handle, symbol, 0x77); Assert.AreEqual ((short) 0x77, Dlfcn.GetInt16 (handle, symbol), "SetInt16"); @@ -122,5 +171,24 @@ struct SomeValue { public ulong Value; } #pragma warning restore CS0649 + + [Test] + public void FieldProperty_CGRect () + { + Assert.Multiple (() => { + // CGRect.Null is backed by [Field("CGRectNull")] which calls Dlfcn.GetCGRect. + var value = global::CoreGraphics.CGRect.Null; + Assert.That (value.X, Is.EqualTo (nfloat.PositiveInfinity), "CGRectNull.X"); + Assert.That (value.Y, Is.EqualTo (nfloat.PositiveInfinity), "CGRectNull.Y"); + Assert.That (value.Width, Is.EqualTo ((nfloat) 0), "CGRectNull.Width"); + Assert.That (value.Height, Is.EqualTo ((nfloat) 0), "CGRectNull.Height"); + + var infinite = global::CoreGraphics.CGRect.Infinite; + Assert.That (infinite.X, Is.EqualTo (nfloat.MinValue / 2), "CGRectInfinite.X"); + Assert.That (infinite.Y, Is.EqualTo (nfloat.MinValue / 2), "CGRectInfinite.Y"); + Assert.That (infinite.Width, Is.EqualTo (nfloat.MaxValue), "CGRectInfinite.Width"); + Assert.That (infinite.Height, Is.EqualTo (nfloat.MaxValue), "CGRectInfinite.Height"); + }); + } } } diff --git a/tests/monotouch-test/dotnet/shared.csproj b/tests/monotouch-test/dotnet/shared.csproj index 37437089b7fe..c2c8eac87673 100644 --- a/tests/monotouch-test/dotnet/shared.csproj +++ b/tests/monotouch-test/dotnet/shared.csproj @@ -56,6 +56,7 @@ + diff --git a/tests/xharness/Jenkins/TestVariationsFactory.cs b/tests/xharness/Jenkins/TestVariationsFactory.cs index f7d7a2460eab..a095b00616b4 100644 --- a/tests/xharness/Jenkins/TestVariationsFactory.cs +++ b/tests/xharness/Jenkins/TestVariationsFactory.cs @@ -113,6 +113,10 @@ IEnumerable GetTestData (RunTestTask test) yield return new TestData { Variation = "Debug (interpreter)", TestVariation = "interpreter", Ignored = ignore }; yield return new TestData { Variation = "Release (interpreter)", TestVariation = "release|interpreter", Ignored = ignore }; } + yield return new TestData { Variation = $"Release (compat inline dlfcn)", TestVariation = "inline-dlfcn-methods-compat|release", Ignored = ignore }; + yield return new TestData { Variation = $"Release (strict inline dlfcn)", TestVariation = "inline-dlfcn-methods-strict|release", Ignored = ignore }; + if (mac_supports_arm64) + yield return new TestData { Variation = $"Release (NativeAOT, .NET 11 defaults)", TestVariation = "inline-dlfcn-methods-strict|nativeaot|release", Ignored = ignore, RuntimeIdentifier = arm64_sim_runtime_identifier }; // it's necessary to specify RID, because NativeAOT defaults to building for device break; case "introspection": if (mac_supports_arm64) diff --git a/tools/common/CompilerFlags.cs b/tools/common/CompilerFlags.cs index 1138c4ca917f..1181f05a6943 100644 --- a/tools/common/CompilerFlags.cs +++ b/tools/common/CompilerFlags.cs @@ -55,7 +55,7 @@ public void ReferenceSymbols (IEnumerable symbols, Abi abi) foreach (var symbol in symbols) { if (symbol.ValidAbis.HasValue && (symbol.ValidAbis.Value & abi) == 0) continue; - UnresolvedSymbols.Add (symbol.Prefix + symbol.Name); + UnresolvedSymbols.Add (Symbol.Prefix + symbol.Name); } } diff --git a/tools/common/Frameworks.cs b/tools/common/Frameworks.cs index cc617412239b..1a831735145d 100644 --- a/tools/common/Frameworks.cs +++ b/tools/common/Frameworks.cs @@ -7,6 +7,7 @@ using Mono.Tuner; using Xamarin.Bundler; +using Xamarin.Linker; using Registrar; #endif @@ -453,7 +454,7 @@ public static Frameworks CreateiOSFrameworks (bool is_simulator_build) { "CoreLocationUI", "CoreLocationUI", 15,0 }, { "DataDetection", "DataDetection", 15, 0 }, - { "Phase", "PHASE", new Version (15,0), NotAvailableInSimulator /* no headers in beta 2 */ }, + { "Phase", "PHASE", new Version (15, 0), new Version (26, 0) /* not certain about the exact version when this framework was added to the simulator, but this should be a safe default */ }, { "OSLog", "OSLog", 15,0 }, { "ShazamKit", "ShazamKit", new Version (15,0), new Version (16, 0)}, { "ThreadNetwork", "ThreadNetwork", new Version (15,0), NotAvailableInSimulator}, @@ -702,11 +703,12 @@ public static Frameworks GetMacCatalystFrameworks () } } -#if LEGACY_TOOLS || BUNDLER - public static IEnumerable GetFrameworks (TypeDefinition td) +#if BUNDLER + public static bool TryGetFramework (Application app, TypeDefinition td, [NotNullWhen (true)] out string? framework) { + framework = null; + if (td.HasCustomAttributes) { - var any = false; foreach (var attrib in td.CustomAttributes) { if (!attrib.AttributeType.Is ("ObjCRuntime", "ObjectiveCFrameworkAttribute")) continue; @@ -715,25 +717,56 @@ public static IEnumerable GetFrameworks (TypeDefinition td) var arg = attrib.ConstructorArguments [0]; if (arg.Value is not string stringArgument) continue; - yield return stringArgument; - any = true; + framework = stringArgument; + return framework is not null; } - if (any) - yield break; } - yield return td.Namespace; + if (!app.Profile.IsProductAssembly (td.Module.Assembly)) + return false; + + framework = td.Namespace; + return framework is not null; + } + + public static bool TryGetFramework (Application app, TypeDefinition td, [NotNullWhen (true)] out Framework? framework) + { + framework = null; + + if (!TryGetFramework (app, td, out string? frameworkName)) + return false; + + var all_frameworks = GetFrameworks (app.Platform, app.IsSimulatorBuild); + if (all_frameworks is null) + return false; + return all_frameworks.TryGetValue (frameworkName, out framework); } - static void Gather (Application app, AssemblyDefinition product_assembly, HashSet frameworks, HashSet weak_frameworks, Func include_framework) + static void Gather (Application app, IEnumerable assemblies, HashSet frameworks, HashSet weak_frameworks, Func include_framework) { var namespaces = new HashSet (); - // Collect all the namespaces. - foreach (var md in product_assembly.Modules) { - foreach (var td in md.Types) { - foreach (var fw in GetFrameworks (td)) - namespaces.Add (fw); + // Process our product assembly + any assembly with the [ObjectiveCFramework] attribute, and collect all the namespaces that are used in those assemblies. + // For non-product assemblies, we only look at types with the [ObjectiveCFramework] attribute. + foreach (var assembly in assemblies) { + var hasObjectiveCFrameworkAttribute = false; + if (!app.Profile.IsProductAssembly (assembly)) { + hasObjectiveCFrameworkAttribute = assembly.MainModule.HasTypeReference ("ObjCRuntime.ObjectiveCFrameworkAttribute"); + if (!hasObjectiveCFrameworkAttribute) + continue; + } + + // Collect all the namespaces. + foreach (var md in assembly.Modules) { + foreach (var td in md.Types) { + if (hasObjectiveCFrameworkAttribute && !td.HasCustomAttribute ("ObjCRuntime", "ObjectiveCFrameworkAttribute")) + continue; + + if (TryGetFramework (app, td, out string? framework)) { + namespaces.Add (framework); + continue; + } + } } } @@ -798,9 +831,9 @@ static bool FilterFrameworks (Application app, Framework framework) return true; } - public static void Gather (Application app, AssemblyDefinition product_assembly, HashSet frameworks, HashSet weak_frameworks) + public static void Gather (Application app, IEnumerable assemblies, HashSet frameworks, HashSet weak_frameworks) { - Gather (app, product_assembly, frameworks, weak_frameworks, (framework) => FilterFrameworks (app, framework)); + Gather (app, assemblies, frameworks, weak_frameworks, (framework) => FilterFrameworks (app, framework)); } -#endif // LEGACY_TOOLS || BUNDLER +#endif // BUNDLER } diff --git a/tools/common/MachO.cs b/tools/common/MachO.cs index 197c99736be1..f54f4e222d95 100644 --- a/tools/common/MachO.cs +++ b/tools/common/MachO.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Net; using System.Text; using Xamarin.Bundler; @@ -90,6 +91,7 @@ public enum LoadCommands : uint { // /* Constants for the cmd field of all load commands, the type */ //#define LC_SEGMENT 0x1 /* segment of this file to be mapped */ //#define LC_SYMTAB 0x2 /* link-edit stab symbol table info */ + Symtab = 0x2, //#define LC_SYMSEG 0x3 /* link-edit gdb symbol table info (obsolete) */ //#define LC_THREAD 0x4 /* thread */ //#define LC_UNIXTHREAD 0x5 /* unix thread (includes a stack) */ @@ -606,8 +608,8 @@ internal void Read (string filename, BinaryReader reader, long size) file.Read (reader); object_files.Add (file); } - // byte position is always even after each file. - if (nextPosition % 1 == 1) + // The ar format requires each entry to start at an even byte offset. + if (nextPosition % 2 == 1) nextPosition++; reader.BaseStream.Position = nextPosition; } @@ -641,6 +643,33 @@ public static bool IsStaticLibrary (string filename, bool throw_if_error = false } } } + + /// + /// Reads a static library or a Mach-O object file and returns the set of unresolved (undefined external) symbols. + /// + public static HashSet GetUnresolvedSymbols (string filename) + { + var symbols = new HashSet (); + using (var fs = File.OpenRead (filename)) + using (var reader = new BinaryReader (fs)) { + if (IsStaticLibrary (reader)) { + var lib = new StaticLibrary (); + lib.Read (filename, reader, fs.Length); + foreach (var obj in lib.ObjectFiles) { + foreach (var sym in obj.GetUnresolvedSymbols (reader)) + symbols.Add (sym); + } + } else if (MachOFile.IsMachOLibrary (null, reader)) { + var obj = new MachOFile (filename); + obj.Read (reader); + foreach (var sym in obj.GetUnresolvedSymbols (reader)) + symbols.Add (sym); + } else { + throw ErrorHelper.CreateError (1601, Errors.MT1601, System.Text.Encoding.ASCII.GetString (reader.ReadBytes (7), 0, 7)); + } + } + return symbols; + } } public class MachOFile { @@ -657,6 +686,7 @@ public class MachOFile { uint _reserved; bool is64bitheader; + long streamBasePosition; // position in the stream where this Mach-O header starts public int cputype { get { return is_big_endian ? MachO.ToBigEndian (_cputype) : _cputype; } } public int cpusubtype { get { return is_big_endian ? MachO.ToBigEndian (_cpusubtype) : _cpusubtype; } } @@ -728,6 +758,8 @@ internal static bool IsMachOLibrary (FatEntry? fat_entry, BinaryReader reader, b internal void Read (BinaryReader reader) { + streamBasePosition = reader.BaseStream.Position; + /* definitions from: /usr/include/mach-o/loader.h */ /* * The 32-bit mach header appears at the very beginning of the object file for @@ -868,6 +900,16 @@ internal void Read (BinaryReader reader) } lc = buildVer; break; + case MachO.LoadCommands.Symtab: + var symtabCmd = new SymtabLoadCommand (); + symtabCmd.cmd = reader.ReadUInt32 (); + symtabCmd.cmdsize = reader.ReadUInt32 (); + symtabCmd.symoff = reader.ReadUInt32 (); + symtabCmd.nsyms = reader.ReadUInt32 (); + symtabCmd.stroff = reader.ReadUInt32 (); + symtabCmd.strsize = reader.ReadUInt32 (); + lc = symtabCmd; + break; default: lc = new LoadCommand (); lc.cmd = reader.ReadUInt32 (); @@ -893,6 +935,58 @@ public bool IsDynamicLibrary { public bool IsObjectFile { get => filetype == MachO.MH_OBJECT; } + + const byte N_EXT = 0x01; // external symbol + const byte N_TYPE = 0x0e; // mask for type bits + const byte N_UNDF = 0x0; // undefined symbol + + /// + /// Reads unresolved (undefined external) symbols from this Mach-O file. + /// The reader must be the same stream used to read this file. + /// + public HashSet GetUnresolvedSymbols (BinaryReader reader) + { + var symbols = new HashSet (); + var symtab = load_commands.OfType ().FirstOrDefault (); + if (symtab is null || symtab.nsyms == 0) + return symbols; + + // Read the string table + reader.BaseStream.Position = streamBasePosition + symtab.stroff; + var stringTable = reader.ReadBytes ((int) symtab.strsize); + + // Read symbol table entries + reader.BaseStream.Position = streamBasePosition + symtab.symoff; + var nlistSize = is64bitheader ? 16 : 12; + for (uint i = 0; i < symtab.nsyms; i++) { + var n_strx = reader.ReadUInt32 (); + var n_type = reader.ReadByte (); + var n_sect = reader.ReadByte (); + var n_desc = reader.ReadInt16 (); + if (is64bitheader) + reader.ReadUInt64 (); // n_value (8 bytes) + else + reader.ReadUInt32 (); // n_value (4 bytes) + + // Filter for undefined external symbols (equivalent of nm -u) + if ((n_type & N_EXT) == 0) + continue; + if ((n_type & N_TYPE) != N_UNDF) + continue; + + // Read symbol name from string table + if (n_strx >= symtab.strsize) + continue; + var end = (int) n_strx; + while (end < stringTable.Length && stringTable [end] != 0) + end++; + var name = Encoding.UTF8.GetString (stringTable, (int) n_strx, end - (int) n_strx); + if (name.Length > 0) + symbols.Add (name); + } + + return symbols; + } } public class FatFile { @@ -1148,4 +1242,11 @@ public MachO.Platform Platform { get { return (MachO.Platform) platform; } } } + + public class SymtabLoadCommand : LoadCommand { + public uint symoff; // offset to symbol table entries + public uint nsyms; // number of symbol table entries + public uint stroff; // offset to string table + public uint strsize; // size of string table in bytes + } } diff --git a/tools/common/Symbols.cs b/tools/common/Symbols.cs index 7306afd5fa2f..6b1b13077fe5 100644 --- a/tools/common/Symbols.cs +++ b/tools/common/Symbols.cs @@ -27,7 +27,7 @@ public class Symbol { public bool Ignore; public Abi? ValidAbis; - static string ObjectiveCPrefix { + public static string ObjectiveCPrefix { get { return "OBJC_CLASS_$_"; } @@ -52,11 +52,7 @@ public string Name { } public string? ObjectiveCName; - public string Prefix { - get { - return "_"; - } - } + public const string Prefix = "_"; List members = new List (); public IEnumerable Members { get { return members; } } @@ -158,6 +154,7 @@ public Symbol this [string name] { } } +#if !MSBUILD_TASKS public void Load (string filename, Application app) { using (var reader = new StreamReader (filename)) { @@ -183,6 +180,7 @@ public void Load (string filename, Application app) } } } +#endif // !MSBUILD_TASKS public void Save (string filename) { diff --git a/tools/dotnet-linker/AppBundleRewriter.cs b/tools/dotnet-linker/AppBundleRewriter.cs index f49c71d518bd..5013997108d1 100644 --- a/tools/dotnet-linker/AppBundleRewriter.cs +++ b/tools/dotnet-linker/AppBundleRewriter.cs @@ -422,6 +422,12 @@ public TypeReference ObjCRuntime_Class { } } + public TypeReference ObjCRuntime_Dlfcn { + get { + return GetTypeReference (PlatformAssembly, "ObjCRuntime.Dlfcn", out var _); + } + } + public TypeReference ObjCRuntime_IManagedRegistrar { get { return GetTypeReference (PlatformAssembly, "ObjCRuntime.IManagedRegistrar", out var _); @@ -464,6 +470,12 @@ public TypeReference ObjCRuntime_NSObjectProxyAttribute { } } + public TypeReference ObjCRuntime_ObjectiveCFrameworkAttribute { + get { + return GetTypeReference (PlatformAssembly, "ObjCRuntime.ObjectiveCFrameworkAttribute", out var _); + } + } + public TypeReference ObjCRuntime_ProtocolProxyAttribute { get { return GetTypeReference (PlatformAssembly, "ObjCRuntime.ProtocolProxyAttribute", out var _); @@ -726,6 +738,17 @@ public MethodReference Class_GetHandle__System_String { } } + public MethodReference ObjectiveCFrameworkAttribute_ctor_String { + get { + return GetMethodReference (PlatformAssembly, ObjCRuntime_ObjectiveCFrameworkAttribute, ".ctor", (v) => + v.IsConstructor + && v.HasParameters + && v.Parameters.Count == 1 + && v.Parameters [0].ParameterType.Is ("System", "String") + && !v.HasGenericParameters); + } + } + public MethodReference ObjCRuntime_INativeObjectProxyAttribute__ctor { get { return GetMethodReference (PlatformAssembly, ObjCRuntime_INativeObjectProxyAttribute, ".ctor", (v) => v.IsDefaultConstructor ()); diff --git a/tools/dotnet-linker/LinkerConfiguration.cs b/tools/dotnet-linker/LinkerConfiguration.cs index 3acbcd16362e..5de07dbced9d 100644 --- a/tools/dotnet-linker/LinkerConfiguration.cs +++ b/tools/dotnet-linker/LinkerConfiguration.cs @@ -30,6 +30,13 @@ public class LinkerConfiguration { public string IntermediateLinkDir { get; private set; } = string.Empty; public bool InvariantGlobalization { get; private set; } public bool HybridGlobalization { get; private set; } + public InlineDlfcnMethodsMode InlineDlfcnMethods { get; set; } + public bool InlineDlfcnMethodsEnabled => InlineDlfcnMethods != InlineDlfcnMethodsMode.Disabled; + // Per-assembly field symbols collected by InlineDlfcnMethodsStep, keyed by assembly name. + public Dictionary> InlinedDlfcnFields { get; } = new Dictionary> (); + // All [Field] symbol names collected by ProcessExportedFields, used in compatibility mode. + public HashSet FieldSymbols { get; } = new HashSet (); + public string IntermediateOutputPath { get; private set; } = string.Empty; public string ItemsDirectory { get; private set; } = string.Empty; public bool IsSimulatorBuild { get; private set; } public string PartialStaticRegistrarLibrary { get; set; } = string.Empty; @@ -46,6 +53,7 @@ public class LinkerConfiguration { public Application Application { get; private set; } public IList RegistrationMethods { get; set; } = new List (); + public List NativeCodeToCompileAndLink { get; private set; } = new List (); public CompilerFlags CompilerFlags; LinkContext? context; @@ -202,9 +210,22 @@ public static LinkerConfiguration GetInstance (LinkContext context) case "FrameworkAssembly": FrameworkAssemblies.Add (value); break; + case "InlineDlfcnMethods": + if (Enum.TryParse (value, true, out var inlineDlfcnMode)) + InlineDlfcnMethods = inlineDlfcnMode; + else if (string.Equals (value, "compatibility", StringComparison.OrdinalIgnoreCase)) + InlineDlfcnMethods = InlineDlfcnMethodsMode.Compat; + else if (string.IsNullOrEmpty (value)) + InlineDlfcnMethods = InlineDlfcnMethodsMode.Disabled; + else + throw new InvalidOperationException ($"Unknown InlineDlfcnMethods value: {value}"); + break; case "IntermediateLinkDir": IntermediateLinkDir = value; break; + case "IntermediateOutputPath": + IntermediateOutputPath = value; + break; case "Interpreter": if (!string.IsNullOrEmpty (value)) Application.ParseInterpreter (value); @@ -520,7 +541,9 @@ public void Write () Console.WriteLine ($" Dlsym: {Application.DlsymOptions} {(Application.DlsymAssemblies is not null ? string.Join (" ", Application.DlsymAssemblies.Select (v => (v.Item2 ? "+" : "-") + v.Item1)) : string.Empty)}"); Console.WriteLine ($" DeploymentTarget: {DeploymentTarget}"); Console.WriteLine ($" EnableSGenConc {Application.EnableSGenConc}"); + Console.WriteLine ($" InlineDlfcnMethods: {InlineDlfcnMethods}"); Console.WriteLine ($" IntermediateLinkDir: {IntermediateLinkDir}"); + Console.WriteLine ($" IntermediateOutputPath: {IntermediateOutputPath}"); Console.WriteLine ($" InterpretedAssemblies: {string.Join (", ", Application.InterpretedAssemblies)}"); Console.WriteLine ($" ItemsDirectory: {ItemsDirectory}"); Console.WriteLine ($" {FrameworkAssemblies.Count} framework assemblies:"); @@ -637,3 +660,9 @@ public MSBuildItem (string include, Dictionary metadata) Metadata = metadata; } } + +public enum InlineDlfcnMethodsMode { + Disabled, + Strict, + Compat, +} diff --git a/tools/dotnet-linker/Steps/AssemblyModifierStep.cs b/tools/dotnet-linker/Steps/AssemblyModifierStep.cs index 2e3e971d4d87..8e2899fb0660 100644 --- a/tools/dotnet-linker/Steps/AssemblyModifierStep.cs +++ b/tools/dotnet-linker/Steps/AssemblyModifierStep.cs @@ -31,7 +31,8 @@ protected sealed override void TryProcessAssembly (AssemblyDefinition assembly) protected virtual bool ModifyAssembly (AssemblyDefinition assembly) { var modified = false; - foreach (var type in assembly.MainModule.Types) + // ToArray () is needed because subclasses (e.g. InlineDlfcnMethodsStep) may add new types during iteration. + foreach (var type in assembly.MainModule.Types.ToArray ()) modified |= ProcessTypeImpl (type); return modified; } @@ -50,7 +51,8 @@ bool ProcessTypeImpl (TypeDefinition type) { var modified = ProcessType (type); if (type.HasNestedTypes) { - foreach (var nested in type.NestedTypes) + // ToArray () is needed because subclasses may add new types during iteration. + foreach (var nested in type.NestedTypes.ToArray ()) modified |= ProcessTypeImpl (nested); } return modified; diff --git a/tools/dotnet-linker/Steps/GatherFrameworksStep.cs b/tools/dotnet-linker/Steps/GatherFrameworksStep.cs index 4d5eb1fbfca7..5fb658b02f89 100644 --- a/tools/dotnet-linker/Steps/GatherFrameworksStep.cs +++ b/tools/dotnet-linker/Steps/GatherFrameworksStep.cs @@ -20,10 +20,7 @@ protected override void TryProcessAssembly (AssemblyDefinition assembly) { base.TryProcessAssembly (assembly); - if (Configuration.PlatformAssembly != assembly.Name.Name) - return; - - global::Frameworks.Gather (Configuration.Application, assembly, Frameworks, WeakFrameworks); + global::Frameworks.Gather (Configuration.Application, [assembly], Frameworks, WeakFrameworks); } protected override void TryEndProcess () diff --git a/tools/dotnet-linker/Steps/GenerateReferencesStep.cs b/tools/dotnet-linker/Steps/GenerateReferencesStep.cs index 7d1f08537fb3..4a3959aa0f80 100644 --- a/tools/dotnet-linker/Steps/GenerateReferencesStep.cs +++ b/tools/dotnet-linker/Steps/GenerateReferencesStep.cs @@ -38,7 +38,7 @@ protected override void TryEndProcess () break; case SymbolMode.Linker: foreach (var symbol in required_symbols) { - var item = new MSBuildItem (symbol.Prefix + symbol.Name); + var item = new MSBuildItem (Symbol.Prefix + symbol.Name); item.Metadata ["SymbolType"] = symbol.Type.ToString (); items.Add (item); } diff --git a/tools/dotnet-linker/Steps/InlineDlfcnMethodsStep.cs b/tools/dotnet-linker/Steps/InlineDlfcnMethodsStep.cs new file mode 100644 index 000000000000..0012ca7a456f --- /dev/null +++ b/tools/dotnet-linker/Steps/InlineDlfcnMethodsStep.cs @@ -0,0 +1,1015 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.Rocks; +using Mono.Linker; +using Mono.Linker.Steps; +using Mono.Tuner; +using MonoTouch.Tuner; + +using Xamarin.Bundler; + +#nullable enable + +namespace Xamarin.Linker.Steps; + +// See docs/code/native-symbols.md for an overview of native symbol handling. +public class InlineDlfcnMethodsStep : AssemblyModifierStep { + + protected override string Name { get; } = "Inline Dlfcn Methods"; + protected override int ErrorCode { get; } = 2250; + + bool strictMode; + + protected override void TryProcess () + { + strictMode = Configuration.InlineDlfcnMethods == InlineDlfcnMethodsMode.Strict; + base.TryProcess (); + } + + string? current_framework; + protected override bool ProcessType (TypeDefinition type) + { + var modified = false; + if (type.HasMethods) { + if (Frameworks.TryGetFramework (App, type, out Framework? framework) && App.IsSimulatorBuild && !framework.IsFrameworkAvailableInSimulator (App)) { + Driver.Log (3, $"Type {type.FullName} appears to be part of the '{framework.Name}' framework, which is not available in the simulator. Skipping inlining Dlfcn calls for this type."); + return modified; + } + + current_framework = framework?.Namespace; + + foreach (var method in type.Methods) + modified |= ProcessMethod (method); + + current_framework = null; + } + return modified; + } + + TypeDefinition GetDlfcnType (MethodDefinition callingMethod) + { + // Check if there's a [Field] attribute with a second string argument (the library/namespace). + // The [Field] attribute can be on the method itself, or on the property the method is a getter/setter for. + var libraryName = callingMethod.HasCustomAttributes ? GetFieldAttributeLibraryName (callingMethod.CustomAttributes) : null; + if (libraryName is null && callingMethod.DeclaringType.HasProperties) { + foreach (var property in callingMethod.DeclaringType.Properties) { + if (property.GetMethod == callingMethod || property.SetMethod == callingMethod) { + libraryName = GetFieldAttributeLibraryName (property.CustomAttributes); + break; + } + } + } + + if (libraryName is not null) + return GetDlfcnType (callingMethod.Module, callingMethod.DeclaringType.Namespace, libraryName); + + return GetDlfcnType (callingMethod.Module, callingMethod.DeclaringType.Namespace); + } + + static string? GetFieldAttributeLibraryName (IList? attributes) + { + if (attributes is null || attributes.Count == 0) + return null; + + foreach (var attrib in attributes) { + if (attrib.AttributeType.Name != "FieldAttribute") + continue; + if (attrib.ConstructorArguments.Count == 2 && + attrib.ConstructorArguments [1].Type.Name == "String" && + attrib.ConstructorArguments [1].Value is string libraryName && + !string.IsNullOrEmpty (libraryName)) { + return libraryName; + } + } + + return null; + } + + // It's important to use a type in the same namespace as the calling code, so that + // we correctly compute which frameworks to link with. + TypeDefinition GetDlfcnType (ModuleDefinition module, string @namespace, string? fieldLibraryName = null) + { + var frameworkOverride = !string.IsNullOrEmpty (fieldLibraryName) ? fieldLibraryName : current_framework; + var ns = string.IsNullOrEmpty (frameworkOverride) ? @namespace : frameworkOverride; + var dlfcn = module.Types.FirstOrDefault (t => t.Namespace == ns && t.Name == "Dlfcn"); + if (dlfcn is null) { + dlfcn = new TypeDefinition (ns, "Dlfcn", TypeAttributes.NotPublic | TypeAttributes.Sealed, module.TypeSystem.Object); + module.Types.Add (dlfcn); + + if (!string.IsNullOrEmpty (frameworkOverride)) { + var attrib = new CustomAttribute (abr.ObjectiveCFrameworkAttribute_ctor_String); + attrib.ConstructorArguments.Add (new CustomAttributeArgument (abr.System_String, frameworkOverride)); + dlfcn.CustomAttributes.Add (attrib); + } + } + return dlfcn; + } + + void AddField (string assemblyName, string symbolName) + { + if (!Configuration.InlinedDlfcnFields.TryGetValue (assemblyName, out var set)) { + set = new HashSet (); + Configuration.InlinedDlfcnFields [assemblyName] = set; + } + set.Add (symbolName); + } + + MethodDefinition GetOrCreatePInvokeMethod (MethodDefinition callingMethod, string symbolName) + { + var dlfcn = GetDlfcnType (callingMethod); + var methodName = $"xamarin_Dlfcn_{symbolName}_Native"; + var nativeMethod = methodName; + var rv = dlfcn.Methods.FirstOrDefault (m => m.Name == methodName); + if (rv is not null) + return rv; // already exists, no need to create it again + + // [DllImport ("__Internal")] + // static extern IntPtr xamarin_Dlfcn_{symbolName}_Native (); + + rv = new MethodDefinition (methodName, MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.PInvokeImpl, abr.System_IntPtr); + rv.IsPreserveSig = true; + + var mod = callingMethod.Module.ModuleReferences.FirstOrDefault (mr => mr.Name == "__Internal"); + if (mod is null) { + mod = new ModuleReference ("__Internal"); + callingMethod.Module.ModuleReferences.Add (mod); + } + rv.PInvokeInfo = new PInvokeInfo (PInvokeAttributes.CharSetNotSpec | PInvokeAttributes.CallConvCdecl, nativeMethod, mod); + + dlfcn.Methods.Add (rv); + + AddField (callingMethod.Module.Assembly.Name.Name, symbolName); + + return rv; + } + + MethodDefinition GetOrCreateGetSymbolMethod (MethodDefinition callingMethod, string symbolName) + { + var dlfcn = GetDlfcnType (callingMethod); + var methodName = $"Get__{symbolName}"; + var symbolMethod = dlfcn.Methods.FirstOrDefault (m => m.Name == methodName); + if (symbolMethod is not null) + return symbolMethod; // already exists, no need to create it again + + // static bool Get__{symbolName}_Initialized; + // static IntPtr Get__{symbolName}_Cached; + // static IntPtr Get__{symbolName} () + // { + // if (!Get__{symbolName}_Initialized) { + // Get__{symbolName}_Cached = xamarin_Dlfcn_{symbolName}_Native (); + // Get__{symbolName}_Initialized = true; + // } + // return Get__{symbolName}_Cached; + // } + + var initializedField = new FieldDefinition ($"Get__{symbolName}_Initialized", FieldAttributes.Private | FieldAttributes.Static, callingMethod.Module.TypeSystem.Boolean); + dlfcn.Fields.Add (initializedField); + + var cachedField = new FieldDefinition ($"Get__{symbolName}_Cached", FieldAttributes.Private | FieldAttributes.Static, abr.System_IntPtr); + dlfcn.Fields.Add (cachedField); + + var intptr = abr.System_IntPtr; + symbolMethod = new MethodDefinition (methodName, MethodAttributes.Public | MethodAttributes.Static, intptr); + dlfcn.Methods.Add (symbolMethod); + + var body = symbolMethod.Body; + var il = body.GetILProcessor (); + + var loadCachedFieldInstruction = il.Create (OpCodes.Ldsfld, cachedField); + + // if (!Get__{symbolName}_Initialized) { + // The initialized field must use volatile semantics to prevent ARM64 store + // reordering: without it, another thread could see Initialized=true before + // the Cached value is written, and return a stale IntPtr.Zero. + // Note that we don't care if we call the P/Invoke more than once, that's + // a safe operation, we just don't want to call it every time. + il.Append (il.Create (OpCodes.Volatile)); + il.Append (il.Create (OpCodes.Ldsfld, initializedField)); + il.Append (il.Create (OpCodes.Brtrue, loadCachedFieldInstruction)); + + // Get__{symbolName}_Cached = xamarin_Dlfcn_{symbolName}_Native (); + il.Append (il.Create (OpCodes.Call, GetOrCreatePInvokeMethod (callingMethod, symbolName))); + il.Append (il.Create (OpCodes.Stsfld, cachedField)); + + // Get__{symbolName}_Initialized = true; + il.Append (il.Create (OpCodes.Ldc_I4_1)); + il.Append (il.Create (OpCodes.Volatile)); + il.Append (il.Create (OpCodes.Stsfld, initializedField)); + + // return Get__{symbolName}_Cached; + il.Append (loadCachedFieldInstruction); + il.Append (il.Create (OpCodes.Ret)); + + return symbolMethod; + } + + MethodDefinition GetOrCreateGetNativeFieldMethod (MethodDefinition callingMethod, TypeReference fieldType, string symbolName) + { + var dlfcn = GetDlfcnType (callingMethod); + var methodName = $"Get__{symbolName}_{fieldType.Name}"; + var rv = dlfcn.Methods.FirstOrDefault (m => m.Name == methodName); + if (rv is not null) + return rv; // already exists, no need to create it again + + // static FieldType Get__{symbolName}_{fieldType} () + // { + // var ptr = Get__{symbolName} (); + // if (ptr == IntPtr.Zero) + // return default; + // + // /* if value type */ + // return *(FieldType*)ptr; + // + // /* if not value type */ + // return Runtime.GetNSObject (*ptr); + // } + + var importedFieldType = callingMethod.Module.ImportReference (fieldType); + rv = new MethodDefinition (methodName, MethodAttributes.Public | MethodAttributes.Static, importedFieldType); + dlfcn.Methods.Add (rv); + + var body = rv.Body; + var il = body.GetILProcessor (); + + var ptrVariable = new VariableDefinition (abr.System_IntPtr); + body.Variables.Add (ptrVariable); + + var loadPointerInstructionStart = il.Create (OpCodes.Ldloc, ptrVariable); + + // var ptr = Get__{symbolName} (); + il.Append (il.Create (OpCodes.Call, GetOrCreateGetSymbolMethod (callingMethod, symbolName))); + il.Append (il.Create (OpCodes.Stloc, ptrVariable)); + + // if (ptr == IntPtr.Zero) + il.Append (il.Create (OpCodes.Ldloc, ptrVariable)); + il.Append (il.Create (OpCodes.Ldsfld, abr.System_IntPtr_Zero)); + il.Append (il.Create (OpCodes.Bne_Un, loadPointerInstructionStart)); + + // return default; + var fullFieldTypeName = fieldType.FullName; + switch (fullFieldTypeName) { + case "System.Byte": + case "System.SByte": + case "System.Int16": + case "System.UInt16": + case "System.Int32": + case "System.UInt32": + il.Append (il.Create (OpCodes.Ldc_I4_0)); + break; + case "System.Int64": + il.Append (il.Create (OpCodes.Ldc_I4_0)); + il.Append (il.Create (OpCodes.Conv_I8)); + break; + case "System.UInt64": + il.Append (il.Create (OpCodes.Ldc_I4_0)); + il.Append (il.Create (OpCodes.Conv_U8)); + break; + case "System.Single": + il.Append (il.Create (OpCodes.Ldc_R4, 0f)); + break; + case "System.Double": + il.Append (il.Create (OpCodes.Ldc_R8, 0.0)); + break; + case "System.IntPtr": + case "System.UIntPtr": + il.Append (il.Create (OpCodes.Ldc_I4_0)); + il.Append (il.Create (OpCodes.Conv_I)); + break; + default: + if (fieldType.IsValueType) { + if (fieldType.IsPrimitive) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2254 /* Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new. */, callingMethod, Errors.MX2254, fieldType.FullName, symbolName, FormatMethod (callingMethod))); + } + var defaultTemporary = new VariableDefinition (importedFieldType); + body.Variables.Add (defaultTemporary); + il.Append (il.Create (OpCodes.Ldloca, defaultTemporary)); + il.Append (il.Create (OpCodes.Initobj, importedFieldType)); + il.Append (il.Create (OpCodes.Ldloc, defaultTemporary)); + } else { + il.Append (il.Create (OpCodes.Ldnull)); + } + break; + } + il.Append (il.Create (OpCodes.Ret)); + + // /* if value type */ + // return *(FieldType*)ptr; + // /* if not value type */ + // return Runtime.GetNSObject (*(IntPtr*)ptr); + il.Append (loadPointerInstructionStart); // il.Create (OpCodes.Ldloc, ptrVariable); + if (fieldType.IsValueType) { + switch (fieldType.FullName) { + case "System.Byte": + il.Append (il.Create (OpCodes.Ldind_U1)); + break; + case "System.SByte": + il.Append (il.Create (OpCodes.Ldind_I1)); + break; + case "System.Int16": + il.Append (il.Create (OpCodes.Ldind_I2)); + break; + case "System.UInt16": + il.Append (il.Create (OpCodes.Ldind_U2)); + break; + case "System.Int32": + il.Append (il.Create (OpCodes.Ldind_I4)); + break; + case "System.UInt32": + il.Append (il.Create (OpCodes.Ldind_U4)); + break; + case "System.Int64": + case "System.UInt64": + il.Append (il.Create (OpCodes.Ldind_I8)); + break; + case "System.Single": + il.Append (il.Create (OpCodes.Ldind_R4)); + break; + case "System.Double": + il.Append (il.Create (OpCodes.Ldind_R8)); + break; + case "System.IntPtr": + case "System.UIntPtr": + il.Append (il.Create (OpCodes.Ldind_I)); + break; + default: + if (fieldType.IsPrimitive) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2254 /* Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new. */, callingMethod, Errors.MX2254, fieldType.FullName, symbolName, FormatMethod (callingMethod))); + } + il.Append (il.Create (OpCodes.Ldobj, importedFieldType)); + break; + } + } else if (IsNSObjectSubclass (fieldType)) { + il.Append (il.Create (OpCodes.Ldind_I)); + var getnsobject = abr.Runtime_GetNSObject_T___System_IntPtr.CreateGenericInstanceMethod (importedFieldType); + il.Append (il.Create (OpCodes.Call, getnsobject)); + } else { + Report (ErrorHelper.CreateError (Configuration.Application, 2256 /* The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new */, callingMethod, Errors.MX2256, fieldType.FullName, symbolName, FormatMethod (callingMethod))); + } + il.Append (il.Create (OpCodes.Ret)); + + return rv; + } + + MethodDefinition GetOrCreateSetNativeFieldMethod (MethodDefinition callingMethod, TypeReference fieldType, string symbolName) + { + var dlfcn = GetDlfcnType (callingMethod); + var methodName = $"Set__{symbolName}_{fieldType.Name}"; + var rv = dlfcn.Methods.FirstOrDefault (m => m.Name == methodName); + if (rv is not null) + return rv; // already exists, no need to create it again + + // static void Set__{symbolName}_{fieldType} ({FieldType} value) + // { + // var ptr = Get__{symbolName} (); + // if (ptr == IntPtr.Zero) + // return; + // + // /* if value type */ + // *(FieldType*)ptr = value; + // + // /* if not value type */ + // *(IntPtr*)ptr = (IntPtr) Runtime.RetainNSObject (value) + // } + // + // Notes: + // * Just like the Dlfcn method(s), this generated code does not release an existing value of a field. + + var importedFieldType = callingMethod.Module.ImportReference (fieldType); + rv = new MethodDefinition (methodName, MethodAttributes.Public | MethodAttributes.Static, abr.System_Void); + rv.Parameters.Add (new ParameterDefinition ("value", ParameterAttributes.None, importedFieldType)); + dlfcn.Methods.Add (rv); + + var body = rv.Body; + var il = body.GetILProcessor (); + + var ptrVariable = new VariableDefinition (abr.System_IntPtr); + body.Variables.Add (ptrVariable); + + var loadPointerInstructionStart = il.Create (OpCodes.Ldloc, ptrVariable); + + // var ptr = Get__{symbolName} (); + il.Append (il.Create (OpCodes.Call, GetOrCreateGetSymbolMethod (callingMethod, symbolName))); + il.Append (il.Create (OpCodes.Stloc, ptrVariable)); + + // if (ptr == IntPtr.Zero) + il.Append (il.Create (OpCodes.Ldloc, ptrVariable)); + il.Append (il.Create (OpCodes.Ldsfld, abr.System_IntPtr_Zero)); + il.Append (il.Create (OpCodes.Bne_Un, loadPointerInstructionStart)); + // return; + il.Append (il.Create (OpCodes.Ret)); + + // /* if value type */ + // *(FieldType*)ptr = value; + // /* if not value type */ + // *(IntPtr*)ptr = (IntPtr) Runtime.RetainNSObject (value) + il.Append (loadPointerInstructionStart); // il.Create (OpCodes.Ldloc, ptrVariable); + il.Append (il.Create (OpCodes.Ldarg_0)); + if (fieldType.IsValueType) { + switch (fieldType.FullName) { + case "System.Byte": + case "System.SByte": + il.Append (il.Create (OpCodes.Stind_I1)); + break; + case "System.Int16": + case "System.UInt16": + il.Append (il.Create (OpCodes.Stind_I2)); + break; + case "System.Int32": + case "System.UInt32": + il.Append (il.Create (OpCodes.Stind_I4)); + break; + case "System.Int64": + case "System.UInt64": + il.Append (il.Create (OpCodes.Stind_I8)); + break; + case "System.Single": + il.Append (il.Create (OpCodes.Stind_R4)); + break; + case "System.Double": + il.Append (il.Create (OpCodes.Stind_R8)); + break; + case "System.IntPtr": + case "System.UIntPtr": + il.Append (il.Create (OpCodes.Stind_I)); + break; + default: + if (fieldType.IsPrimitive) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2254 /* Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new. */, callingMethod, Errors.MX2254, fieldType.FullName, symbolName, FormatMethod (callingMethod))); + } + il.Append (il.Create (OpCodes.Stobj, importedFieldType)); + break; + } + } else if (IsNSObjectSubclass (fieldType)) { + il.Append (il.Create (OpCodes.Call, abr.Runtime_RetainNSObject)); + il.Append (il.Create (OpCodes.Call, abr.NativeObject_op_Implicit_IntPtr)); + il.Append (il.Create (OpCodes.Stind_I)); + } else { + Report (ErrorHelper.CreateError (Configuration.Application, 2256 /* The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new */, callingMethod, Errors.MX2256, fieldType.FullName, symbolName, FormatMethod (callingMethod))); + } + il.Append (il.Create (OpCodes.Ret)); + + return rv; + } + + MethodDefinition GetOrCreateSetNativeStringMethod (MethodDefinition callingMethod, string symbolName) + { + var dlfcn = GetDlfcnType (callingMethod); + var methodName = $"Set__{symbolName}_String"; + var rv = dlfcn.Methods.FirstOrDefault (m => m.Name == methodName); + if (rv is not null) + return rv; // already exists, no need to create it again + + // static FieldType Set__{symbolName}_String (string? value) + // { + // var ptr = Get__{symbolName} (); + // if (ptr == IntPtr.Zero) + // return; + // + // *(IntPtr*)ptr = (IntPtr) CFString.CreateNative (value); + // } + // + // Notes: + // * Just like the Dlfcn method(s), this generated code does not release an existing value of a field. + + rv = new MethodDefinition (methodName, MethodAttributes.Public | MethodAttributes.Static, abr.System_Void); + rv.Parameters.Add (new ParameterDefinition ("value", ParameterAttributes.None, abr.System_String)); + dlfcn.Methods.Add (rv); + + var body = rv.Body; + var il = body.GetILProcessor (); + + var ptrVariable = new VariableDefinition (abr.System_IntPtr); + body.Variables.Add (ptrVariable); + + var loadPointerInstructionStart = il.Create (OpCodes.Ldloc, ptrVariable); + + // var ptr = Get__{symbolName} (); + il.Append (il.Create (OpCodes.Call, GetOrCreateGetSymbolMethod (callingMethod, symbolName))); + il.Append (il.Create (OpCodes.Stloc, ptrVariable)); + + // if (ptr == IntPtr.Zero) + il.Append (il.Create (OpCodes.Ldloc, ptrVariable)); + il.Append (il.Create (OpCodes.Ldsfld, abr.System_IntPtr_Zero)); + il.Append (il.Create (OpCodes.Bne_Un, loadPointerInstructionStart)); + // return; + il.Append (il.Create (OpCodes.Ret)); + + // *(IntPtr*)ptr = (IntPtr) CFString.CreateNative (value); + il.Append (loadPointerInstructionStart); // il.Create (OpCodes.Ldloc, ptrVariable); + il.Append (il.Create (OpCodes.Ldarg_0)); + il.Append (il.Create (OpCodes.Call, abr.CFString_CreateNative)); + il.Append (il.Create (OpCodes.Call, abr.NativeObject_op_Implicit_IntPtr)); + il.Append (il.Create (OpCodes.Stind_I)); + il.Append (il.Create (OpCodes.Ret)); + + return rv; + } + + bool InlineSymbol (string symbolName) + { + // In compatibility mode, only inline symbols from [Field] attributes. + if (!strictMode && !Configuration.FieldSymbols.Contains (symbolName)) + return false; + + // These symbols already come from [Objective-]C code, so they should already be valid identifiers, + // which means we don't have to validate them. + + var requiredSymbol = DerivedLinkContext.RequiredSymbols.Find (symbolName); + if (requiredSymbol?.Mode == SymbolMode.Ignore) + return false; // don't inline if the symbol is to be ignored + + return true; + } + + protected override bool ProcessMethod (MethodDefinition method) + { + var modified = false; + + if (!method.HasBody) + return modified; + + if (method.DeclaringType.Name == "Dlfcn" && method.DeclaringType.Namespace == "ObjCRuntime") + return modified; // don't process the Dlfcn methods themselves + + foreach (var instr in method.Body.Instructions) { + if (instr.Operand is not MethodReference mr) + continue; + if (mr.DeclaringType.Name != "Dlfcn" || mr.DeclaringType.Namespace != "ObjCRuntime") + continue; + + // Handle Dlfcn functions of the form (libraryHandle, symbolName) + if (mr.Parameters.Count == 2 && mr.Parameters [0].ParameterType.FullName == "System.IntPtr" && mr.Parameters [1].ParameterType.FullName == "System.String") { + if (instr.Previous.OpCode != OpCodes.Ldstr) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + + // In compatibility mode, only inline symbols from [Field] attributes. + var ldstr = instr.Previous; + if (ldstr.Operand is not string symbolName) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + if (!InlineSymbol (symbolName)) + continue; + + switch (mr.Name) { + // primitive types + case "GetDouble": + case "GetFloat": + case "GetNFloat": + case "GetIntPtr": + case "GetUIntPtr": + case "GetNInt": + case "GetNUInt": + case "GetInt16": + case "GetUInt16": + case "GetInt32": + case "GetUInt32": + case "GetInt64": + case "GetUInt64": + // non-primitive value types + case "GetCGSize": + case "GetCGRect": + // classes + case "GetNSNumber": + case "GetStringConstant": + ldstr.OpCode = OpCodes.Pop; // just pop the library handle/name, we don't need it + ldstr.Operand = null; + + instr.OpCode = OpCodes.Call; + instr.Operand = GetOrCreateGetNativeFieldMethod (method, mr.ReturnType, symbolName); + + modified = true; + continue; + case "GetStruct": + if (mr is not GenericInstanceMethod gim || gim.GenericArguments.Count != 1) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + var returnType = gim.GenericArguments [0]; + if (returnType.IsGenericInstance) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + + ldstr.OpCode = OpCodes.Pop; // just pop the library handle/name, we don't need it + ldstr.Operand = null; + + instr.OpCode = OpCodes.Call; + instr.Operand = GetOrCreateGetNativeFieldMethod (method, returnType, symbolName); + + modified = true; + continue; + case "GetIndirect": + case "dlsym": + ldstr.OpCode = OpCodes.Pop; // just pop the library handle/name, we don't need it + ldstr.Operand = null; + + instr.OpCode = OpCodes.Call; + instr.Operand = GetOrCreateGetSymbolMethod (method, symbolName); + + modified = true; + continue; + } + } + + // Handle Dlfcn functions of the form (RTLD, symbolName) + if (mr.Parameters.Count == 2 && mr.Parameters [0].ParameterType.FullName == "ObjCRuntime.Dlfcn/RTLD" && mr.Parameters [1].ParameterType.FullName == "System.String") { + if (instr.Previous.OpCode != OpCodes.Ldstr) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + var ldstr = instr.Previous; + if (ldstr.Operand is not string symbolName) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + + if (!InlineSymbol (symbolName)) + continue; + + + switch (mr.Name) { + case "dlsym": + ldstr.OpCode = OpCodes.Pop; // just pop the library handle/name, we don't need it + ldstr.Operand = null; + + instr.OpCode = OpCodes.Call; + instr.Operand = GetOrCreateGetSymbolMethod (method, symbolName); + + modified = true; + continue; + } + } + + // Handle Dlfcn functions of the form (libraryName, symbolName) + if (mr.Parameters.Count == 2 && mr.Parameters [0].ParameterType.FullName == "System.String" && mr.Parameters [1].ParameterType.FullName == "System.String") { + if (instr.Previous.OpCode != OpCodes.Ldstr) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + var ldstr = instr.Previous; + if (ldstr.Operand is not string symbolName) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + + if (!InlineSymbol (symbolName)) + continue; + + switch (mr.Name) { + // primitive types + case "SlowGetDouble": + case "SlowGetIntPtr": + case "SlowGetInt32": + case "SlowGetInt64": + // classes + case "SlowGetStringConstant": + ldstr.OpCode = OpCodes.Pop; // just pop the library handle/name, we don't need it + ldstr.Operand = null; + + instr.OpCode = OpCodes.Call; + instr.Operand = GetOrCreateGetNativeFieldMethod (method, mr.ReturnType, symbolName); + + modified = true; + continue; + } + } + + // Handle Dlfcn functions of the form void (libraryHandle|libraryName, symbolName, value) + if (mr.Parameters.Count == 3 && + (mr.Parameters [0].ParameterType.FullName == "System.String" || mr.Parameters [0].ParameterType.FullName == "System.IntPtr") && + mr.Parameters [1].ParameterType.FullName == "System.String") { + + var ins = instr; + Instruction? ldstr = null; + + // skip any call instructions that take a single argument and return a value, as those are likely to be calls to op_Implicit or op_Explicit functions. + while (ins.Previous.OpCode == OpCodes.Call && ins.Previous.Operand is MethodReference prevMr && !prevMr.ReturnType.Is ("System", "Void") && prevMr.HasParameters && prevMr.Parameters.Count == 1) { + ins = ins.Previous; + } + + switch (ins.Previous.OpCode.StackBehaviourPop) { + case StackBehaviour.Pop0: + switch (ins.Previous.OpCode.StackBehaviourPush) { + case StackBehaviour.Push1: + case StackBehaviour.Pushi: + case StackBehaviour.Pushi8: + case StackBehaviour.Pushr4: + case StackBehaviour.Pushr8: + case StackBehaviour.Pushref: + ldstr = ins.Previous.Previous; + break; + } + break; + case StackBehaviour.Pop1: + case StackBehaviour.Popref: + switch (ins.Previous.OpCode.StackBehaviourPush) { + case StackBehaviour.Push1: + case StackBehaviour.Pushi: + case StackBehaviour.Pushi8: + case StackBehaviour.Pushr4: + case StackBehaviour.Pushr8: + case StackBehaviour.Pushref: + ldstr = ins.Previous.Previous.Previous; + break; + } + break; + } + if (ldstr is null) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255, method, "Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. Unknown instruction sequence: {2} ({3}/{4}). The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new.", FormatMethod (mr), FormatMethod (method), instr.Previous, instr.Previous.OpCode.StackBehaviourPop, instr.Previous.OpCode.StackBehaviourPush)); + continue; + } + + if (ldstr.OpCode != OpCodes.Ldstr) { + // Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255, method, "Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. Expected 'ldstr' opcode, got '{2}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new.", FormatMethod (mr), FormatMethod (method), ldstr)); + continue; + } + if (ldstr.Operand is not string symbolName) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + + if (!InlineSymbol (symbolName)) + continue; + + switch (mr.Name) { + // primitive types + case "SetSByte": + case "SetByte": + case "SetInt16": + case "SetUInt16": + case "SetInt32": + case "SetUInt32": + case "SetInt64": + case "SetUInt64": + case "SetArray": + case "SetObject": + case "SetNInt": + case "SetNUInt": + case "SetNFloat": + case "SetUIntPtr": + case "SetIntPtr": + case "SetCGSize": + case "SetDouble": + case "SetFloat": + ldstr.OpCode = OpCodes.Pop; // just pop the library handle/name, we don't need it + ldstr.Operand = null; + + instr.OpCode = OpCodes.Call; + instr.Operand = GetOrCreateSetNativeFieldMethod (method, mr.Parameters [2].ParameterType, symbolName); + + modified = true; + continue; + // classes + case "SetString": + if (mr.Parameters [2].ParameterType.FullName == "System.String") { + ldstr.OpCode = OpCodes.Pop; // just pop the library handle/name, we don't need it + ldstr.Operand = null; + + instr.OpCode = OpCodes.Call; + instr.Operand = GetOrCreateSetNativeStringMethod (method, symbolName); + modified = true; + continue; + } else if (mr.Parameters [2].ParameterType.FullName == "Foundation.NSString") { + ldstr.OpCode = OpCodes.Pop; // just pop the library handle/name, we don't need it + ldstr.Operand = null; + + instr.OpCode = OpCodes.Call; + instr.Operand = GetOrCreateSetNativeFieldMethod (method, mr.Parameters [2].ParameterType, symbolName); + modified = true; + continue; + } + + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + case "CachePointer": + if (!(mr.Parameters [2].ParameterType is PointerType pt && pt.ElementType.FullName == "System.IntPtr")) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + + // + // we're going to replace the entire method body with something like: + // + // var ptr = Get__{symbolName} (); + // if (ptr == IntPtr.Zero) + // return IntPtr.Zero; + // return *(IntPtr *) ptr; + // + + if (!IsGeneratedCachePointerMethod (method, out var cachePointerSymbolName, out var failureMessage)) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2257 /* Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2257, failureMessage, FormatMethod (method))); + continue; + } + + if (cachePointerSymbolName != symbolName) { + Report (ErrorHelper.CreateWarning (Configuration.Application, 2257 /* Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2257, $"Could not determine symbol name", FormatMethod (method))); + continue; + } + + ldstr.OpCode = OpCodes.Pop; // just pop the library handle/name, we don't need it + ldstr.Operand = null; + + method.Body.Instructions.Clear (); + var il = method.Body.GetILProcessor (); + var ptrVariable = new VariableDefinition (abr.System_IntPtr); + method.Body.Variables.Add (ptrVariable); + var loadPointerInstructionStart = il.Create (OpCodes.Ldloc, ptrVariable); + // var ptr = Get__{symbolName} () + il.Append (il.Create (OpCodes.Call, GetOrCreateGetSymbolMethod (method, symbolName))); + il.Append (il.Create (OpCodes.Stloc, ptrVariable)); + // if (ptr == IntPtr.Zero) + il.Append (il.Create (OpCodes.Ldloc, ptrVariable)); + il.Append (il.Create (OpCodes.Brtrue_S, loadPointerInstructionStart)); + // return IntPtr.Zero; + il.Append (il.Create (OpCodes.Ldc_I4_0)); + il.Append (il.Create (OpCodes.Conv_I)); + il.Append (il.Create (OpCodes.Ret)); + // return *(IntPtr *) ptr; + il.Append (loadPointerInstructionStart); // il.Create (OpCodes.Ldloc, ptrVariable) + il.Append (il.Create (OpCodes.Ldind_I)); + il.Append (il.Create (OpCodes.Ret)); + + modified = true; + return modified; // we replace the whole method body, so no need to continue processing the method + } + } + + switch (mr.Name) { + case "_dlopen": // nothing to inline here + case "dlopen": // nothing to inline here + case "dlerror": // nothing to inline here + continue; + case "dlclose": + // It might be possible to just remove these calls, because + // (PENDING CONFIRMATION) I believe dlclose is a no-op on at least some Apple platforms. + continue; + default: + Report (ErrorHelper.CreateWarning (Configuration.Application, 2255 /* Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. */, method, Errors.MX2255, FormatMethod (mr), FormatMethod (method))); + continue; + } + } + + return modified; + } + + static bool IsGeneratedCachePointerMethod (MethodDefinition method, [NotNullWhen (true)] out string? fieldName, [NotNullWhen (false)] out string? failureMessage) + { + fieldName = null; + failureMessage = null; + + // The following code: + // + // get { + // fixed (IntPtr *storage = &values [8]) + // return Dlfcn.CachePointer (Libraries.XYZ.Handle, "...", storage); + // } + // + // has the following IL sequence: + // + // IL_0000: ldsfld System.IntPtr[] ::values + // IL_0005: ldc.i4.0 + // IL_0006: ldelema System.IntPtr + // IL_000b: stloc.1 + // IL_000c: ldloc.1 + // IL_000d: conv.u + // IL_000e: stloc.0 + // IL_000f: ldsfld System.IntPtr ObjCRuntime.Libraries/::Handle + // IL_0014: ldstr "FIELDNAME" + // IL_0019: ldloc.0 + // IL_001a: call System.IntPtr ObjCRuntime.Dlfcn::CachePointer(System.IntPtr,System.String,System.IntPtr*) + // IL_0020: stloc.2 + // IL_0021: br.s IL_0023 + // IL_0023: ldloc.2 + // IL_001f: ret + // + // (the indented code can happen for debug builds) + // + if (!method.HasBody) { + failureMessage = "Method has no body"; + return false; + } + var body = method.Body; + if (body.Instructions.Count == 0) { + failureMessage = "Method has no instructions"; + return false; + } + + var instr = body.Instructions.First (); + var isLast = false; + + bool AssertOpCode ([NotNullWhen (false)] out string? failureMessage, params OpCode [] expected) + { + failureMessage = null; + + while (instr.OpCode == OpCodes.Nop && instr.Next is not null) + instr = instr.Next; + + if (!expected.Any (v => v == instr.OpCode)) { + failureMessage = $"Expected any of '{string.Join (", ", expected.Select (v => v.ToString ()))}' as instruction at offset IL{instr.Offset:X4}, got: {instr}"; + return false; + } + + if (instr.Next is null) { + if (isLast) + return true; + failureMessage = $"Expected more instructions after {instr}."; + return false; + } + + if (isLast) { + failureMessage = $"Got more instructions than expected after {instr}."; + return false; + } + + instr = instr.Next; + + return true; + } + + if (!AssertOpCode (out failureMessage, OpCodes.Ldsfld)) + return false; + + var ldcOpcodes = new OpCode [] { OpCodes.Ldc_I4_0, OpCodes.Ldc_I4_1, OpCodes.Ldc_I4_2, OpCodes.Ldc_I4_3, OpCodes.Ldc_I4_4, OpCodes.Ldc_I4_5, OpCodes.Ldc_I4_6, OpCodes.Ldc_I4_7, OpCodes.Ldc_I4_8, OpCodes.Ldc_I4, OpCodes.Ldc_I4_S }; + if (!AssertOpCode (out failureMessage, ldcOpcodes)) + return false; + + if (!AssertOpCode (out failureMessage, OpCodes.Ldelema)) + return false; + + var stlocOpcodes = new OpCode [] { OpCodes.Stloc_0, OpCodes.Stloc_1, OpCodes.Stloc_2, OpCodes.Stloc_3, OpCodes.Stloc, OpCodes.Stloc_S }; + if (!AssertOpCode (out failureMessage, stlocOpcodes)) + return false; + + var ldlocOpcodes = new OpCode [] { OpCodes.Ldloc_0, OpCodes.Ldloc_1, OpCodes.Ldloc_2, OpCodes.Ldloc_3, OpCodes.Ldloc, OpCodes.Ldloc_S }; + if (!AssertOpCode (out failureMessage, ldlocOpcodes)) + return false; + + if (!AssertOpCode (out failureMessage, OpCodes.Conv_U)) + return false; + + if (!AssertOpCode (out failureMessage, stlocOpcodes)) + return false; + + if (!AssertOpCode (out failureMessage, OpCodes.Ldsfld)) + return false; + + if (!AssertOpCode (out failureMessage, OpCodes.Ldstr)) + return false; + fieldName = (string) instr.Previous.Operand; + + if (!AssertOpCode (out failureMessage, ldlocOpcodes)) + return false; + + if (!AssertOpCode (out failureMessage, OpCodes.Call)) + return false; + + if (stlocOpcodes.Any (v => v == instr.OpCode)) { + if (!AssertOpCode (out failureMessage, stlocOpcodes)) + return false; + + var branchOpcodes = new OpCode [] { OpCodes.Br, OpCodes.Br_S }; + if (!AssertOpCode (out failureMessage, branchOpcodes)) + return false; + + if (!AssertOpCode (out failureMessage, ldlocOpcodes)) + return false; + } + + isLast = true; + return AssertOpCode (out failureMessage, OpCodes.Ret); + } + + static string FormatMethod (MethodReference method) + { + var rv = method.FullName; + var idx = rv.IndexOf (' '); + if (idx > 0) + rv = rv.Substring (idx + 1); + return rv; + } + + static bool IsNSObjectSubclass (TypeReference type) + { + var resolved = type.Resolve (); + while (resolved is not null) { + if (resolved.FullName == "Foundation.NSObject") + return true; + if (resolved.BaseType is null) + break; + resolved = resolved.BaseType.Resolve (); + } + return false; + } +} diff --git a/tools/linker/MonoTouch.Tuner/ListExportedSymbols.cs b/tools/linker/MonoTouch.Tuner/ListExportedSymbols.cs index e014c12bc41c..eda79a994f73 100644 --- a/tools/linker/MonoTouch.Tuner/ListExportedSymbols.cs +++ b/tools/linker/MonoTouch.Tuner/ListExportedSymbols.cs @@ -191,6 +191,13 @@ bool ProcessMethod (MethodDefinition method) switch (pinfo.Module.Name) { case "__Internal": + // For NativeAOT builds, don't add inlined dlfcn P/Invoke wrappers as + // required symbols: only the surviving ones will have native code generated, + // so force-referencing all of them causes linker errors for symbols that + // NativeAOT trimmed away. For non-NativeAOT builds, the wrappers are resolved + // via dlsym and need the -u flags to be exported from the binary. + if (Configuration.InlineDlfcnMethodsEnabled && Configuration.Application.XamarinRuntime == XamarinRuntime.NativeAOT && pinfo.EntryPoint.StartsWith ("xamarin_Dlfcn_", StringComparison.Ordinal)) + break; Driver.Log (4, "Adding native reference to {0} in {1} because it's referenced by {2} in {3}.", pinfo.EntryPoint, pinfo.Module.Name, method.FullName, method.Module.Name); DerivedLinkContext.RequiredSymbols.AddFunction (pinfo.EntryPoint).AddMember (method); break; @@ -211,7 +218,7 @@ bool ProcessMethod (MethodDefinition method) } } - if (method.IsPropertyMethod ()) { + if (method.IsPropertyMethod () && !Configuration.InlineDlfcnMethodsEnabled) { var property = method.GetProperty (); // The Field attribute may have been linked away, but we've stored it in an annotation. if (property is not null && Annotations.GetCustomAnnotations ("ExportedFields").TryGetValue (property, out var symbol) && symbol is string symbolStr) { diff --git a/tools/linker/MonoTouch.Tuner/ProcessExportedFields.cs b/tools/linker/MonoTouch.Tuner/ProcessExportedFields.cs index 8e4a61ed2578..53787784589f 100644 --- a/tools/linker/MonoTouch.Tuner/ProcessExportedFields.cs +++ b/tools/linker/MonoTouch.Tuner/ProcessExportedFields.cs @@ -23,6 +23,8 @@ namespace MonoTouch.Tuner { // Then at the end of the linker process (ListExportedSymbols step) // we lookup that annotation. // + // See docs/code/native-symbols.md for an overview of native symbol handling. + // public class ProcessExportedFields : BaseStep { protected override void ProcessAssembly (AssemblyDefinition assembly) @@ -55,6 +57,15 @@ void ProcessProperty (PropertyDefinition property) if (!property.HasCustomAttributes) return; + var config = LinkerConfiguration.GetInstance (Context); + + // Collect all [Field] symbol names for InlineDlfcnMethodsStep's compatibility mode. + if (config.InlineDlfcnMethodsEnabled) { + var allSymbol = GetFieldSymbolName (property); + if (allSymbol is not null) + config.FieldSymbols.Add (allSymbol); + } + var symbol = GetFieldSymbol (property); if (symbol is null) return; @@ -62,6 +73,28 @@ void ProcessProperty (PropertyDefinition property) Annotations.GetCustomAnnotations ("ExportedFields").Add (property, symbol); } + // Returns the symbol name from a [Field] attribute, regardless of library. + internal static string? GetFieldSymbolName (PropertyDefinition property) + { + if (!property.HasCustomAttributes) + return null; + + foreach (var attrib in property.CustomAttributes) { + var declaringType = attrib.Constructor.DeclaringType.Resolve (); + + if (!declaringType.Is (Namespaces.Foundation, "FieldAttribute")) + continue; + + if (attrib.ConstructorArguments.Count < 1) + continue; + + return (string) attrib.ConstructorArguments [0].Value; + } + + return null; + } + + // Returns the symbol name only for __Internal fields. internal static string? GetFieldSymbol (PropertyDefinition property) { if (!property.HasCustomAttributes) diff --git a/tools/mtouch/Errors.designer.cs b/tools/mtouch/Errors.designer.cs index e2f24503e42d..85e5fd3a6293 100644 --- a/tools/mtouch/Errors.designer.cs +++ b/tools/mtouch/Errors.designer.cs @@ -3524,6 +3524,42 @@ public static string MX2112_B { } } + /// + /// Looks up a localized string similar to Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new. + /// + public static string MX2254 { + get { + return ResourceManager.GetString("MX2254", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. + /// + public static string MX2255 { + get { + return ResourceManager.GetString("MX2255", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new. + /// + public static string MX2256 { + get { + return ResourceManager.GetString("MX2256", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new. + /// + public static string MX2257 { + get { + return ResourceManager.GetString("MX2257", resourceCulture); + } + } + /// /// Looks up a localized string similar to Could not {0} the assembly '{1}'. /// diff --git a/tools/mtouch/Errors.resx b/tools/mtouch/Errors.resx index 83c238026906..f719755a4d48 100644 --- a/tools/mtouch/Errors.resx +++ b/tools/mtouch/Errors.resx @@ -1097,6 +1097,24 @@ + + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + From 7d8c9850dcc0a54fb5b68f60486d82ba4771c29f Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 7 May 2026 08:06:33 +0200 Subject: [PATCH 28/35] [msbuild] Introduce SdkIsDesktop and SdkIsMobile properties (#25326) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce two new MSBuild properties to simplify platform checks in the build system: - **`SdkIsDesktop`**: `true` when building for macOS or Mac Catalyst. Replaces `'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'` checks. - **`SdkIsMobile`**: `true` when building for iOS or tvOS. Replaces `'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS'` checks. These complement the existing `SdkIsSimulator` and `SdkIsDevice` properties (from #25234). The `SdkIsDevice` definition was also updated to use `SdkIsMobile` instead of raw platform checks. ### Deliberately not updated - Patterns that also include `watchOS` (bundle structure paths, PkgInfo, etc.) - `DynamicCodeSupport` (also includes MacCatalyst alongside iOS/tvOS) - `ComputeRegistrarConstant.targets` (uses `TargetFramework.EndsWith()` patterns) - Linker/introspection test `.csproj` files (also check tvOS separately) - `_LibMonoLinkMode`/`_LibXamarinLinkMode` (check macOS and MacCatalyst with distinct behavior) Both properties are documented in `docs/building-apps/build-properties.md`. 🤖 Pull request created by Copilot --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- docs/building-apps/build-properties.md | 24 ++++++++++ dotnet/targets/Microsoft.Sdk.Desktop.targets | 2 +- dotnet/targets/Microsoft.Sdk.Mobile.targets | 6 +-- .../Xamarin.Shared.Sdk.Publish.targets | 8 ++-- dotnet/targets/Xamarin.Shared.Sdk.props | 10 +++- dotnet/targets/Xamarin.Shared.Sdk.targets | 46 +++++++++---------- msbuild/Xamarin.Shared/Xamarin.Shared.props | 10 ++-- msbuild/Xamarin.Shared/Xamarin.Shared.targets | 46 +++++++++---------- tests/dotnet/BundleStructure/shared.csproj | 4 +- .../CustomizedCodeSigning/shared.csproj | 4 +- tests/monotouch-test/dotnet/shared.csproj | 14 +++--- 11 files changed, 102 insertions(+), 72 deletions(-) diff --git a/docs/building-apps/build-properties.md b/docs/building-apps/build-properties.md index 14277d6f03f5..8126bb6cd0ed 100644 --- a/docs/building-apps/build-properties.md +++ b/docs/building-apps/build-properties.md @@ -1264,6 +1264,18 @@ $ dotnet run -p:StandardInputPath=stdin.txt Note: this can also be accomplished by passing `--stdin ...` using the [OpenArguments](#openarguments) property. +## SdkIsDesktop + +This property is a read-only property (setting it will have no effect) that +specifies whether we're building for a desktop platform (macOS or Mac Catalyst). + +This property is `true` when the target platform is macOS or Mac Catalyst, +and is not set for iOS or tvOS builds. + +Like `SdkIsSimulator`, this property is only set after [imports and +properties](/visualstudio/msbuild/build-process-overview#evaluate-imports-and-properties) +have been evaluated. + ## SdkIsDevice This property is a read-only property (setting it will have no effect) that @@ -1277,6 +1289,18 @@ Like `SdkIsSimulator`, this property is only set after [imports and properties](/visualstudio/msbuild/build-process-overview#evaluate-imports-and-properties) have been evaluated. +## SdkIsMobile + +This property is a read-only property (setting it will have no effect) that +specifies whether we're building for a mobile platform (iOS or tvOS). + +This property is `true` when the target platform is iOS or tvOS, and is not +set for macOS or Mac Catalyst builds. + +Like `SdkIsSimulator`, this property is only set after [imports and +properties](/visualstudio/msbuild/build-process-overview#evaluate-imports-and-properties) +have been evaluated. + ## SdkIsSimulator This property is a read-only property (setting it will have no effect) that diff --git a/dotnet/targets/Microsoft.Sdk.Desktop.targets b/dotnet/targets/Microsoft.Sdk.Desktop.targets index 276822e3c2e4..d8d90ab7c46d 100644 --- a/dotnet/targets/Microsoft.Sdk.Desktop.targets +++ b/dotnet/targets/Microsoft.Sdk.Desktop.targets @@ -4,7 +4,7 @@ Name="_PrepareRunDesktop" BeforeTargets="ComputeRunArguments" DependsOnTargets="_ValidateHotReloadConfiguration" - Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'"> + Condition="'$(SdkIsDesktop)' == 'true'"> @@ -145,7 +145,7 @@ Name="_PrepareRunMobile" BeforeTargets="ComputeRunArguments" DependsOnTargets="_ValidateHotReloadConfiguration;_InstallMobile;ComputeMlaunchRunArguments" - Condition="'$(_PlatformName)' != 'macOS' And '$(_PlatformName)' != 'MacCatalyst'"> + Condition="'$(SdkIsDesktop)' != 'true'"> <_FilterDevicesToRuntimeIdentifier Condition="'$(_XamarinUsingDefaultRuntimeIdentifier)' != 'true'">$(RuntimeIdentifier) diff --git a/dotnet/targets/Xamarin.Shared.Sdk.Publish.targets b/dotnet/targets/Xamarin.Shared.Sdk.Publish.targets index 44d97039ff5e..c053793baf15 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.Publish.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.Publish.targets @@ -2,8 +2,8 @@ - true - true + true + true $(PublishDir) @@ -21,7 +21,7 @@ /> - - + + diff --git a/dotnet/targets/Xamarin.Shared.Sdk.props b/dotnet/targets/Xamarin.Shared.Sdk.props index 0007e4766ebc..40b953914bac 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.props +++ b/dotnet/targets/Xamarin.Shared.Sdk.props @@ -154,8 +154,14 @@ $(_SdkIsSimulator) + + true + - true + true + + + true iPhoneSimulator @@ -205,7 +211,7 @@ but the MtouchUseLlvm value is ignored when using the simulator, so it doesn't matter if we set it in all cases. --> - + true diff --git a/dotnet/targets/Xamarin.Shared.Sdk.targets b/dotnet/targets/Xamarin.Shared.Sdk.targets index ece45355d5a8..d1f37e5aceba 100644 --- a/dotnet/targets/Xamarin.Shared.Sdk.targets +++ b/dotnet/targets/Xamarin.Shared.Sdk.targets @@ -105,8 +105,8 @@ - - + + @@ -535,8 +535,8 @@ - Otherwise set 'dynamic' --> managed-static - managed-static - managed-static + managed-static + managed-static partial-static dynamic @@ -601,7 +601,7 @@ <_LinkerCacheDirectory Condition="'$(BuildSessionId)' != ''">$(IntermediateOutputPath)linker-cache - <_IsSimulatorFeature Condition="('$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS') And '$(_SdkIsSimulator)' == 'true'">true + <_IsSimulatorFeature Condition="'$(SdkIsMobile)' == 'true' And '$(_SdkIsSimulator)' == 'true'">true <_IsSimulatorFeature Condition="'$(_IsSimulatorFeature)' == ''">false @@ -1256,7 +1256,7 @@ - <_RunAotCompiler Condition="'$(_SdkIsSimulator)' != 'true' And '$(_PlatformName)' != 'macOS' And '$(_PlatformName)' != 'MacCatalyst'">true + <_RunAotCompiler Condition="'$(_SdkIsSimulator)' != 'true' And '$(SdkIsDesktop)' != 'true'">true <_RunAotCompiler Condition="'$(MtouchInterpreter)' != '' And '$(_PlatformName)' != 'macOS'">true @@ -1279,10 +1279,10 @@ <_IntermediateNativeLibraryDir>$(IntermediateOutputPath)nativelibraries/ <_IntermediateFrameworksDir>$(DeviceSpecificIntermediateOutputPath)frameworks <_IntermediateDecompressionDir>$([MSBuild]::EnsureTrailingSlash('$(DeviceSpecificIntermediateOutputPath)decompressed')) - <_NativeExecutablePublishDir Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS'">$(_RelativeAppBundlePath)\ - <_NativeExecutablePublishDir Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">$(_RelativeAppBundlePath)\Contents\MacOS\ - <_AppBundleFrameworksDir Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS'">$(_RelativeAppBundlePath)\Frameworks\ - <_AppBundleFrameworksDir Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">$(_RelativeAppBundlePath)\Contents\Frameworks\ + <_NativeExecutablePublishDir Condition="'$(SdkIsMobile)' == 'true'">$(_RelativeAppBundlePath)\ + <_NativeExecutablePublishDir Condition="'$(SdkIsDesktop)' == 'true'">$(_RelativeAppBundlePath)\Contents\MacOS\ + <_AppBundleFrameworksDir Condition="'$(SdkIsMobile)' == 'true'">$(_RelativeAppBundlePath)\Frameworks\ + <_AppBundleFrameworksDir Condition="'$(SdkIsDesktop)' == 'true'">$(_RelativeAppBundlePath)\Contents\Frameworks\ <_AOTInputDirectory>$(_IntermediateNativeLibraryDir)aot-input/ <_AOTOutputDirectory>$(_IntermediateNativeLibraryDir)aot-output/ @@ -1315,11 +1315,11 @@ <_LibXamarinDebug Condition="'$(_BundlerDebug)' == 'true'">-debug <_LibXamarinName Condition="'$(_LibXamarinName)' == ''">libxamarin-dotnet$(_LibXamarinRuntime)$(_LibXamarinDebug).$(_LibXamarinExtension) - <_DylibRPath Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS'">@executable_path - <_DylibRPath Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">@executable_path/../$(_CustomBundleName)/ + <_DylibRPath Condition="'$(SdkIsMobile)' == 'true'">@executable_path + <_DylibRPath Condition="'$(SdkIsDesktop)' == 'true'">@executable_path/../$(_CustomBundleName)/ - <_EmbeddedFrameworksRPath Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS'">@executable_path/Frameworks - <_EmbeddedFrameworksRPath Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">@executable_path/../Frameworks/ + <_EmbeddedFrameworksRPath Condition="'$(SdkIsMobile)' == 'true'">@executable_path/Frameworks + <_EmbeddedFrameworksRPath Condition="'$(SdkIsDesktop)' == 'true'">@executable_path/../Frameworks/ <_RuntimeConfigurationFile>runtimeconfig.bin @@ -1327,8 +1327,8 @@ <_CustomLinkFlags Include="-rpath" /> - <_CustomLinkFlags Include="@executable_path/../../Frameworks" Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS'" /> - <_CustomLinkFlags Include="@executable_path/../../../../Frameworks" Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'" /> + <_CustomLinkFlags Include="@executable_path/../../Frameworks" Condition="'$(SdkIsMobile)' == 'true'" /> + <_CustomLinkFlags Include="@executable_path/../../../../Frameworks" Condition="'$(SdkIsDesktop)' == 'true'" /> @@ -2011,8 +2011,8 @@ - <_ExecutablePathPrefix Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS'">@executable_path/ - <_ExecutablePathPrefix Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">@executable_path/../../ + <_ExecutablePathPrefix Condition="'$(SdkIsMobile)' == 'true'">@executable_path/ + <_ExecutablePathPrefix Condition="'$(SdkIsDesktop)' == 'true'">@executable_path/../../ @@ -2180,10 +2180,10 @@ Condition="'$(_CanOutputAppBundle)' == 'true'" > - <_AssemblyPublishDir Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS'">$(_RelativeAppBundlePath)\ - <_AssemblyPublishDir Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">$(_RelativeAppBundlePath)\Contents\$(_CustomBundleName)\ - <_DylibPublishDir Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS'">$(_RelativeAppBundlePath)\ - <_DylibPublishDir Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">$(_RelativeAppBundlePath)\Contents\$(_CustomBundleName)\ + <_AssemblyPublishDir Condition="'$(SdkIsMobile)' == 'true'">$(_RelativeAppBundlePath)\ + <_AssemblyPublishDir Condition="'$(SdkIsDesktop)' == 'true'">$(_RelativeAppBundlePath)\Contents\$(_CustomBundleName)\ + <_DylibPublishDir Condition="'$(SdkIsMobile)' == 'true'">$(_RelativeAppBundlePath)\ + <_DylibPublishDir Condition="'$(SdkIsDesktop)' == 'true'">$(_RelativeAppBundlePath)\Contents\$(_CustomBundleName)\ <_ParsedRuntimeConfigFilePath Condition="'$(_ParsedRuntimeConfigFilePath)' == ''">$(DeviceSpecificIntermediateOutputPath)$(_RuntimeConfigurationFile) @@ -2213,7 +2213,7 @@ + Condition="('$(_SdkIsSimulator)' != 'false' Or '$(SdkIsDesktop)' == 'true') And ('%(Extension)' == '.dylib' Or '%(Extension)' == '.so') " /> <_CanArchive>false - <_CanArchive Condition="('$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst') And '$(OutputType)' == 'Exe' And '$(IsAppExtension)' == 'false'">true + <_CanArchive Condition="'$(SdkIsDesktop)' == 'true' And '$(OutputType)' == 'Exe' And '$(IsAppExtension)' == 'false'">true <_CanArchive Condition="'$(OutputType)' == 'Exe' And '$(SdkIsDevice)' == 'true' And '$(IsAppExtension)' == 'false'">true @@ -122,7 +122,7 @@ Copyright (C) 2020 Microsoft. All rights reserved. $(MtouchNoSymbolStrip) true - true + true true false @@ -131,7 +131,7 @@ Copyright (C) 2020 Microsoft. All rights reserved. $(MtouchNoDSymUtil) - true + true true false @@ -182,7 +182,7 @@ Copyright (C) 2020 Microsoft. All rights reserved. <_EmbeddedResourcePrefix Condition="'$(_PlatformName)' == 'macOS'">xammac <_EmbeddedResourcePrefix Condition="'$(_PlatformName)' != 'macOS'">monotouch - <_AppBundleManifestRelativePath Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">Contents/ + <_AppBundleManifestRelativePath Condition="'$(SdkIsDesktop)' == 'true'">Contents/ .xpc .appex @@ -191,7 +191,7 @@ Copyright (C) 2020 Microsoft. All rights reserved. all - <_AppBundleName Condition="'$(_AppBundleName)' == '' And $([MSBuild]::VersionGreaterThanOrEquals($(TargetFrameworkVersion), 10.0)) And ('$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst')">$(ApplicationTitle) + <_AppBundleName Condition="'$(_AppBundleName)' == '' And $([MSBuild]::VersionGreaterThanOrEquals($(TargetFrameworkVersion), 10.0)) And '$(SdkIsDesktop)' == 'true'">$(ApplicationTitle) <_AppBundleName Condition="'$(_AppBundleName)' == ''">$(AssemblyName) diff --git a/msbuild/Xamarin.Shared/Xamarin.Shared.targets b/msbuild/Xamarin.Shared/Xamarin.Shared.targets index c5139ca6acc1..904b1965ab3b 100644 --- a/msbuild/Xamarin.Shared/Xamarin.Shared.targets +++ b/msbuild/Xamarin.Shared/Xamarin.Shared.targets @@ -294,7 +294,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. - + @@ -302,7 +302,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. @@ -320,7 +320,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. @@ -348,7 +348,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. - + @@ -1278,7 +1278,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. will apply to Xamarin.Mac as well. --> - <_PkgInfoPath Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">$(_AppBundlePath)Contents\PkgInfo + <_PkgInfoPath Condition="'$(SdkIsDesktop)' == 'true'">$(_AppBundlePath)Contents\PkgInfo <_PkgInfoPath Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS'">$(_AppBundlePath)PkgInfo @@ -2082,7 +2082,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. - <_EmbeddedProvisionProfilePath Condition="'$(_EmbeddedProvisionProfilePath)' == '' And ('$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst')">$(_AppBundlePath)Contents\embedded.provisionprofile + <_EmbeddedProvisionProfilePath Condition="'$(_EmbeddedProvisionProfilePath)' == '' And '$(SdkIsDesktop)' == 'true'">$(_AppBundlePath)Contents\embedded.provisionprofile <_EmbeddedProvisionProfilePath Condition="'$(_EmbeddedProvisionProfilePath)' == '' And ('$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS')">$(_AppBundlePath)embedded.mobileprovision @@ -2574,7 +2574,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. > - true + true false @@ -2790,12 +2790,12 @@ Copyright (C) 2018 Microsoft. All rights reserved. <_NativeExecutableRelativePath Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS'">$(_ExecutableName) - <_NativeExecutableRelativePath Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">Contents\MacOS\$(_ExecutableName) + <_NativeExecutableRelativePath Condition="'$(SdkIsDesktop)' == 'true'">Contents\MacOS\$(_ExecutableName) <_NativeExecutable>$(_AppBundlePath)$(_NativeExecutableRelativePath) - - + @@ -3252,30 +3252,30 @@ Copyright (C) 2018 Microsoft. All rights reserved. <_AppBundlePath>$(AppBundleDir) <_AppBundlePath Condition="$([System.IO.Path]::IsPathRooted('$(AppBundleDir)'))">$([MSBuild]::MakeRelative('$(MSBuildProjectDirectory)','$(AppBundleDir)')) <_AppBundlePath>$([MSBuild]::EnsureTrailingSlash('$(_AppBundlePath)')) - <_AppResourcesRelativePath Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">Contents\Resources\ + <_AppResourcesRelativePath Condition="'$(SdkIsDesktop)' == 'true'">Contents\Resources\ <_AppResourcesRelativePath Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS'"> <_AppResourcesPath>$(_AppBundlePath)$(_AppResourcesRelativePath) - <_AppContentsRelativePath Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">Contents\$(_CustomBundleName) + <_AppContentsRelativePath Condition="'$(SdkIsDesktop)' == 'true'">Contents\$(_CustomBundleName) <_AppContentsRelativePath Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS'"> <_AppContentsPath>$(_AppBundlePath)$(_AppContentsRelativePath) - <_AppFrameworksRelativePath Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">Contents\Frameworks\ + <_AppFrameworksRelativePath Condition="'$(SdkIsDesktop)' == 'true'">Contents\Frameworks\ <_AppFrameworksRelativePath Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS'">Frameworks\ <_AppFrameworksPath>$(_AppBundlePath)$(_AppFrameworksRelativePath) - <_AppCodeSignatureRelativePath Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">Contents\ + <_AppCodeSignatureRelativePath Condition="'$(SdkIsDesktop)' == 'true'">Contents\ <_AppCodeSignatureRelativePath Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS'"> <_AppCodeSignaturePath>$(_AppBundlePath)$(_AppCodeSignatureRelativePath) - <_AppPlugInsRelativeLocation Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">Contents\ - <_AppPlugInsRelativeLocation Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS'"> + <_AppPlugInsRelativeLocation Condition="'$(SdkIsDesktop)' == 'true'">Contents\ + <_AppPlugInsRelativeLocation Condition="'$(SdkIsMobile)' == 'true'"> <_AppPlugInsRelativePath>$(_AppPlugInsRelativeLocation)PlugIns\ <_AppExtensionRoot>$(_AppBundlePath)$(_AppPlugInsRelativeLocation) <_AppPlugInsPath>$(_AppBundlePath)$(_AppPlugInsRelativePath) - <_AppXpcServicesRelativePath Condition="'$(_PlatformName)' == 'macOS' Or '$(_PlatformName)' == 'MacCatalyst'">Contents\XPCServices\ + <_AppXpcServicesRelativePath Condition="'$(SdkIsDesktop)' == 'true'">Contents\XPCServices\ <_AppXpcServicesRelativePath Condition="'$(_PlatformName)' == 'iOS' Or '$(_PlatformName)' == 'tvOS' Or '$(_PlatformName)' == 'watchOS'">XPCServices\ <_AppXpcServicesPath>$(_AppBundlePath)$(_AppXpcServicesRelativePath) @@ -3375,7 +3375,7 @@ Copyright (C) 2018 Microsoft. All rights reserved. - + diff --git a/tests/dotnet/BundleStructure/shared.csproj b/tests/dotnet/BundleStructure/shared.csproj index 2f8ad66ed705..e94d15aacf61 100644 --- a/tests/dotnet/BundleStructure/shared.csproj +++ b/tests/dotnet/BundleStructure/shared.csproj @@ -162,7 +162,7 @@ - + @@ -177,7 +177,7 @@ - + diff --git a/tests/dotnet/CustomizedCodeSigning/shared.csproj b/tests/dotnet/CustomizedCodeSigning/shared.csproj index 5e0d08bca288..f2cbc49178e2 100644 --- a/tests/dotnet/CustomizedCodeSigning/shared.csproj +++ b/tests/dotnet/CustomizedCodeSigning/shared.csproj @@ -18,12 +18,12 @@ $(CreateAppBundleDependsOn);CopyCustomFiles; - + Contents/SharedSupport Contents/MacOS Contents/MonoBundle - + SharedSupport diff --git a/tests/monotouch-test/dotnet/shared.csproj b/tests/monotouch-test/dotnet/shared.csproj index c2c8eac87673..71e4ad497bca 100644 --- a/tests/monotouch-test/dotnet/shared.csproj +++ b/tests/monotouch-test/dotnet/shared.csproj @@ -46,12 +46,12 @@ - - + + - - - + + + @@ -239,11 +239,11 @@ - Contents/Resources/ + Contents/Resources/ - + <_SmeltingSdk Condition="'$(_PlatformName)' == 'iOS'">iphoneos <_SmeltingSdk Condition="'$(_PlatformName)' == 'tvOS'">appletvos From 7c82a546aa33c16950afae74979504d956562340 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 7 May 2026 08:06:55 +0200 Subject: [PATCH 29/35] [msbuild] Add com.apple.developer.payment-pass-provisioning to known entitlements (#25332) Add the com.apple.developer.payment-pass-provisioning entitlement to the known entitlements list so that validation properly reports a warning/error when an app requests this entitlement but the provisioning profile doesn't grant it. Previously this was an unknown entitlement that only logged a low-importance message, causing silent install failures on device. Also add tests verifying the error, warning, and disable modes for this entitlement validation scenario. Fixes https://github.com/dotnet/macios/issues/25306 --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Tasks/CompileEntitlements.cs | 1 + .../TaskTests/CompileEntitlementsTaskTests.cs | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs index 0db654e7addc..4e818beb636c 100644 --- a/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs +++ b/msbuild/Xamarin.MacDev.Tasks/Tasks/CompileEntitlements.cs @@ -789,6 +789,7 @@ static Dictionary GetAllEntitlements () new EntitlementData ("com.apple.developer.on-demand-install-capable", iOS, EntitlementType.Boolean ), new EntitlementData ("com.apple.developer.parent-application-identifiers", iOS, EntitlementType.ArrayOfStrings ), new EntitlementData ("com.apple.developer.pass-type-identifiers", iOS, EntitlementType.ArrayOfStrings ), + new EntitlementData ("com.apple.developer.payment-pass-provisioning", iOS, EntitlementType.Boolean ), new EntitlementData ("com.apple.developer.persistent-content-capture", desktop, EntitlementType.Boolean ), new EntitlementData ("com.apple.developer.playable-content", iOS, EntitlementType.Boolean ), new EntitlementData ("com.apple.developer.proximity-reader.identity.display", iOS, EntitlementType.Boolean ), diff --git a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs index 25e61039c696..0a3d632d94ae 100644 --- a/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs +++ b/tests/msbuild/Xamarin.MacDev.Tasks.Tests/TaskTests/CompileEntitlementsTaskTests.cs @@ -573,6 +573,38 @@ public void ValidateStringArrayEntitlement (string entitlement, EntitlementsMode ValidateEntitlementsImpl (platform, "error", [], mode, entitlement, "String", "InvalidValue", mobileProvision: "Apple_Signin_Test_Profile.mobileprovision"); } + // Test case inspired by https://github.com/dotnet/macios/issues/25306 + // A wallet extension requests com.apple.developer.payment-pass-provisioning, + // but the provisioning profile doesn't grant it. This should produce a + // warning/error so the developer knows why installation fails on device. + [Test] + [TestCase (EntitlementsMode.InCustomEntitlements)] + [TestCase (EntitlementsMode.InFile)] + public void ValidateEntitlements_PaymentPassProvisioningNotInProfile (EntitlementsMode mode) + { + ValidateEntitlementsImpl (ApplePlatform.iOS, "error", [ + "MT7140:The app requests the entitlement 'com.apple.developer.payment-pass-provisioning', but the provisioning profile 'iOS Team Provisioning Profile: *' doesn't contain this entitlement." + ], mode, "com.apple.developer.payment-pass-provisioning", "Boolean", "true"); + } + + [Test] + [TestCase (EntitlementsMode.InCustomEntitlements)] + [TestCase (EntitlementsMode.InFile)] + public void ValidateEntitlements_PaymentPassProvisioningNotInProfile_Warning (EntitlementsMode mode) + { + ValidateEntitlementsImpl (ApplePlatform.iOS, "warn", [ + "MT7140:The app requests the entitlement 'com.apple.developer.payment-pass-provisioning', but the provisioning profile 'iOS Team Provisioning Profile: *' doesn't contain this entitlement." + ], mode, "com.apple.developer.payment-pass-provisioning", "Boolean", "true"); + } + + [Test] + [TestCase (EntitlementsMode.InCustomEntitlements)] + [TestCase (EntitlementsMode.InFile)] + public void ValidateEntitlements_PaymentPassProvisioningNotInProfile_Disable (EntitlementsMode mode) + { + ValidateEntitlementsImpl (ApplePlatform.iOS, "disable", [], mode, "com.apple.developer.payment-pass-provisioning", "Boolean", "true"); + } + public enum EntitlementsMode { None, InFile, From 4f6df60e44511b8809bffa4e47d6d71e35d8642e Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 7 May 2026 08:08:21 +0200 Subject: [PATCH 30/35] [github] Add code-radiator agentic workflow (#25349) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a new agentic workflow (`code-radiator`) that merges `main` into active target branches daily at midnight UTC. **Target branches:** `net[0-9]*.0`, `xcode[0-9]*`, `xcode[0-9]*.[0-9]*` (with activity in the last 30 days). **Features:** - Creates or updates merge PRs for each active target branch - Resolves `eng/Version.Details.{props,xml}` conflicts by picking highest versions - Resolves `NuGet.config` conflicts by including feeds from both branches - Excludes conflicting `tests/dotnet/UnitTests/expected/*` files from merge commits - Merges target branch into PR branch first to pick up new target commits - For other conflicts: resolves best-effort, adds `do-not-merge` label and requests human review - Enables automerge for clean merges; skips draft PRs with a comment 🤖 Pull request created by Copilot --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/agents/agentic-workflows.agent.md | 196 +++ .github/workflows/code-radiator.lock.yml | 1491 +++++++++++++++++ .github/workflows/code-radiator.md | 170 ++ .github/workflows/copilot-setup-steps.yml | 26 + .github/workflows/inter-branch-merge-flow.yml | 7 +- 5 files changed, 1887 insertions(+), 3 deletions(-) create mode 100644 .github/agents/agentic-workflows.agent.md create mode 100644 .github/workflows/code-radiator.lock.yml create mode 100644 .github/workflows/code-radiator.md create mode 100644 .github/workflows/copilot-setup-steps.yml diff --git a/.github/agents/agentic-workflows.agent.md b/.github/agents/agentic-workflows.agent.md new file mode 100644 index 000000000000..b6e648cbda58 --- /dev/null +++ b/.github/agents/agentic-workflows.agent.md @@ -0,0 +1,196 @@ +--- +description: GitHub Agentic Workflows (gh-aw) - Create, debug, and upgrade AI-powered workflows with intelligent prompt routing +disable-model-invocation: true +--- + +# GitHub Agentic Workflows Agent + +This agent helps you work with **GitHub Agentic Workflows (gh-aw)**, a CLI extension for creating AI-powered workflows in natural language using markdown files. + +## What This Agent Does + +This is a **dispatcher agent** that routes your request to the appropriate specialized prompt based on your task: + +- **Creating new workflows**: Routes to `create` prompt +- **Updating existing workflows**: Routes to `update` prompt +- **Debugging workflows**: Routes to `debug` prompt +- **Upgrading workflows**: Routes to `upgrade-agentic-workflows` prompt +- **Creating report-generating workflows**: Routes to `report` prompt — consult this whenever the workflow posts status updates, audits, analyses, or any structured output as issues, discussions, or comments +- **Creating shared components**: Routes to `create-shared-agentic-workflow` prompt +- **Fixing Dependabot PRs**: Routes to `dependabot` prompt — use this when Dependabot opens PRs that modify generated manifest files (`.github/workflows/package.json`, `.github/workflows/requirements.txt`, `.github/workflows/go.mod`). Never merge those PRs directly; instead update the source `.md` files and rerun `gh aw compile --dependabot` to bundle all fixes +- **Analyzing test coverage**: Routes to `test-coverage` prompt — consult this whenever the workflow reads, analyzes, or reports on test coverage data from PRs or CI runs +- **CLI commands and triggering workflows**: Routes to `cli-commands` guide — consult this whenever the user asks how to run, compile, debug, or manage workflows from the command line, or when they need the MCP tool equivalent of a `gh aw` command + +Workflows may optionally include: + +- **Project tracking / monitoring** (GitHub Projects updates, status reporting) +- **Orchestration / coordination** (one workflow assigning agents or dispatching and coordinating other workflows) + +## Files This Applies To + +- Workflow files: `.github/workflows/*.md` and `.github/workflows/**/*.md` +- Workflow lock files: `.github/workflows/*.lock.yml` +- Shared components: `.github/workflows/shared/*.md` +- Configuration: https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/github-agentic-workflows.md + +## Problems This Solves + +- **Workflow Creation**: Design secure, validated agentic workflows with proper triggers, tools, and permissions +- **Workflow Debugging**: Analyze logs, identify missing tools, investigate failures, and fix configuration issues +- **Version Upgrades**: Migrate workflows to new gh-aw versions, apply codemods, fix breaking changes +- **Component Design**: Create reusable shared workflow components that wrap MCP servers + +## How to Use + +When you interact with this agent, it will: + +1. **Understand your intent** - Determine what kind of task you're trying to accomplish +2. **Route to the right prompt** - Load the specialized prompt file for your task +3. **Execute the task** - Follow the detailed instructions in the loaded prompt + +## Available Prompts + +### Create New Workflow +**Load when**: User wants to create a new workflow from scratch, add automation, or design a workflow that doesn't exist yet + +**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/create-agentic-workflow.md + +**Use cases**: +- "Create a workflow that triages issues" +- "I need a workflow to label pull requests" +- "Design a weekly research automation" + +### Update Existing Workflow +**Load when**: User wants to modify, improve, or refactor an existing workflow + +**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/update-agentic-workflow.md + +**Use cases**: +- "Add web-fetch tool to the issue-classifier workflow" +- "Update the PR reviewer to use discussions instead of issues" +- "Improve the prompt for the weekly-research workflow" + +### Debug Workflow +**Load when**: User needs to investigate, audit, debug, or understand a workflow, troubleshoot issues, analyze logs, or fix errors + +**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/debug-agentic-workflow.md + +**Use cases**: +- "Why is this workflow failing?" +- "Analyze the logs for workflow X" +- "Investigate missing tool calls in run #12345" + +### Upgrade Agentic Workflows +**Load when**: User wants to upgrade workflows to a new gh-aw version or fix deprecations + +**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/upgrade-agentic-workflows.md + +**Use cases**: +- "Upgrade all workflows to the latest version" +- "Fix deprecated fields in workflows" +- "Apply breaking changes from the new release" + +### Create a Report-Generating Workflow +**Load when**: The workflow being created or updated produces reports — recurring status updates, audit summaries, analyses, or any structured output posted as a GitHub issue, discussion, or comment + +**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/report.md + +**Use cases**: +- "Create a weekly CI health report" +- "Post a daily security audit to Discussions" +- "Add a status update comment to open PRs" + +### Create Shared Agentic Workflow +**Load when**: User wants to create a reusable workflow component or wrap an MCP server + +**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/create-shared-agentic-workflow.md + +**Use cases**: +- "Create a shared component for Notion integration" +- "Wrap the Slack MCP server as a reusable component" +- "Design a shared workflow for database queries" + +### Fix Dependabot PRs +**Load when**: User needs to close or fix open Dependabot PRs that update dependencies in generated manifest files (`.github/workflows/package.json`, `.github/workflows/requirements.txt`, `.github/workflows/go.mod`) + +**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/dependabot.md + +**Use cases**: +- "Fix the open Dependabot PRs for npm dependencies" +- "Bundle and close the Dependabot PRs for workflow dependencies" +- "Update @playwright/test to fix the Dependabot PR" + +### Analyze Test Coverage +**Load when**: The workflow reads, analyzes, or reports test coverage — whether triggered by a PR, a schedule, or a slash command. Always consult this prompt before designing the coverage data strategy. + +**Prompt file**: https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/test-coverage.md + +**Use cases**: +- "Create a workflow that comments coverage on PRs" +- "Analyze coverage trends over time" +- "Add a coverage gate that blocks PRs below a threshold" + +### CLI Commands Reference +**Load when**: The user asks how to run, compile, debug, or manage workflows from the command line; needs the MCP tool equivalent of a `gh aw` command; or is in a restricted environment (e.g., Copilot Cloud) without direct CLI access. + +**Reference file**: https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/cli-commands.md + +**Use cases**: +- "How do I trigger workflow X on the main branch?" +- "What's the MCP equivalent of `gh aw logs`?" +- "I'm in Copilot Cloud — how do I compile a workflow?" +- "Show me all available gh aw commands" + +## Instructions + +When a user interacts with you: + +1. **Identify the task type** from the user's request +2. **Load the appropriate prompt** from the GitHub repository URLs listed above +3. **Follow the loaded prompt's instructions** exactly +4. **If uncertain**, ask clarifying questions to determine the right prompt + +## Quick Reference + +```bash +# Initialize repository for agentic workflows +gh aw init + +# Generate the lock file for a workflow +gh aw compile [workflow-name] + +# Trigger a workflow on demand (preferred over gh workflow run) +gh aw run # interactive input collection +gh aw run --ref main # run on a specific branch + +# Debug workflow runs +gh aw logs [workflow-name] +gh aw audit + +# Upgrade workflows +gh aw fix --write +gh aw compile --validate +``` + +## Key Features of gh-aw + +- **Natural Language Workflows**: Write workflows in markdown with YAML frontmatter +- **AI Engine Support**: Copilot, Claude, Codex, or custom engines +- **MCP Server Integration**: Connect to Model Context Protocol servers for tools +- **Safe Outputs**: Structured communication between AI and GitHub API +- **Strict Mode**: Security-first validation and sandboxing +- **Shared Components**: Reusable workflow building blocks +- **Repo Memory**: Persistent git-backed storage for agents +- **Sandboxed Execution**: All workflows run in the Agent Workflow Firewall (AWF) sandbox, enabling full `bash` and `edit` tools by default + +## Important Notes + +- Always reference the instructions file at https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/github-agentic-workflows.md for complete documentation +- Use the MCP tool `agentic-workflows` when running in GitHub Copilot Cloud +- Workflows must be compiled to `.lock.yml` files before running in GitHub Actions +- **Bash tools are enabled by default** - Don't restrict bash commands unnecessarily since workflows are sandboxed by the AWF +- Follow security best practices: minimal permissions, explicit network access, no template injection +- **Network configuration**: Use ecosystem identifiers (`node`, `python`, `go`, etc.) or explicit FQDNs in `network.allowed`. Bare shorthands like `npm` or `pypi` are **not** valid. See https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/network.md for the full list of valid ecosystem identifiers and domain patterns. +- **Single-file output**: When creating a workflow, produce exactly **one** workflow `.md` file. Do not create separate documentation files (architecture docs, runbooks, usage guides, etc.). If documentation is needed, add a brief `## Usage` section inside the workflow file itself. +- **Triggering runs**: Always use `gh aw run ` to trigger a workflow on demand — not `gh workflow run .lock.yml`. `gh aw run` handles workflow resolution by short name, input parsing and validation, and correct run-tracking for agentic workflows. Use `--ref ` to run on a specific branch. +- **CLI commands reference**: For a complete guide on all `gh aw` commands and their MCP tool equivalents (for restricted environments), see https://github.com/github/gh-aw/blob/v0.71.5/.github/aw/cli-commands.md diff --git a/.github/workflows/code-radiator.lock.yml b/.github/workflows/code-radiator.lock.yml new file mode 100644 index 000000000000..7c9e915f63c0 --- /dev/null +++ b/.github/workflows/code-radiator.lock.yml @@ -0,0 +1,1491 @@ +# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"76af0f752f9c80c182f233d9269f96cb4486de4da16d47dd58abdbd52c4ef543","compiler_version":"v0.71.5","strict":true,"agent_id":"copilot","agent_model":"claude-sonnet-4.5"} +# gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_CI_TRIGGER_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"b8068426813005612b960b5ab0b8bd2c27142323","version":"v0.71.5"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.40","digest":"sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.25.40@sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.40","digest":"sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.40@sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.40","digest":"sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.25.40@sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.6","digest":"sha256:2bb8eef86006a4c5963c55616a9c51c32f27bfdecb023b8aa6f91f6718d9171c","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.6@sha256:2bb8eef86006a4c5963c55616a9c51c32f27bfdecb023b8aa6f91f6718d9171c"},{"image":"ghcr.io/github/github-mcp-server:v1.0.3","digest":"sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959","pinned_image":"ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} +# ___ _ _ +# / _ \ | | (_) +# | |_| | __ _ ___ _ __ | |_ _ ___ +# | _ |/ _` |/ _ \ '_ \| __| |/ __| +# | | | | (_| | __/ | | | |_| | (__ +# \_| |_/\__, |\___|_| |_|\__|_|\___| +# __/ | +# _ _ |___/ +# | | | | / _| | +# | | | | ___ _ __ _ __| |_| | _____ ____ +# | |/\| |/ _ \ '__| |/ /| _| |/ _ \ \ /\ / / ___| +# \ /\ / (_) | | | | ( | | | | (_) \ V V /\__ \ +# \/ \/ \___/|_| |_|\_\|_| |_|\___/ \_/\_/ |___/ +# +# This file was automatically generated by gh-aw (v0.71.5). DO NOT EDIT. +# +# To update this file, edit the corresponding .md file and run: +# gh aw compile +# Not all edits will cause changes to this file. +# +# For more information: https://github.github.com/gh-aw/introduction/overview/ +# +# +# Secrets used: +# - COPILOT_GITHUB_TOKEN +# - GH_AW_CI_TRIGGER_TOKEN +# - GH_AW_GITHUB_MCP_SERVER_TOKEN +# - GH_AW_GITHUB_TOKEN +# - GITHUB_TOKEN +# +# Custom actions used: +# - actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 +# - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 +# - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 +# - actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 +# - actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 +# - github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 +# +# Container images used: +# - ghcr.io/github/gh-aw-firewall/agent:0.25.40@sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504 +# - ghcr.io/github/gh-aw-firewall/api-proxy:0.25.40@sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280 +# - ghcr.io/github/gh-aw-firewall/squid:0.25.40@sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51 +# - ghcr.io/github/gh-aw-mcpg:v0.3.6@sha256:2bb8eef86006a4c5963c55616a9c51c32f27bfdecb023b8aa6f91f6718d9171c +# - ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 +# - node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f + +name: "Code Radiator" +"on": + # roles: # Roles processed as role check in pre-activation job + # - admin # Roles processed as role check in pre-activation job + # - maintainer # Roles processed as role check in pre-activation job + # - write # Roles processed as role check in pre-activation job + schedule: + - cron: "0 0 * * *" + workflow_dispatch: + inputs: + aw_context: + default: "" + description: Agent caller context (used internally by Agentic Workflows). + required: false + type: string + +permissions: {} + +concurrency: + group: "gh-aw-${{ github.workflow }}" + +run-name: "Code Radiator" + +jobs: + activation: + runs-on: ubuntu-slim + permissions: + actions: read + contents: read + outputs: + comment_id: "" + comment_repo: "" + engine_id: ${{ steps.generate_aw_info.outputs.engine_id }} + lockdown_check_failed: ${{ steps.generate_aw_info.outputs.lockdown_check_failed == 'true' }} + model: ${{ steps.generate_aw_info.outputs.model }} + secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + stale_lock_file_failed: ${{ steps.check-lock-file.outputs.stale_lock_file_failed == 'true' }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Code Radiator" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/code-radiator.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Generate agentic run info + id: generate_aw_info + env: + GH_AW_INFO_ENGINE_ID: "copilot" + GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI" + GH_AW_INFO_MODEL: "claude-sonnet-4.5" + GH_AW_INFO_VERSION: "1.0.40" + GH_AW_INFO_AGENT_VERSION: "1.0.40" + GH_AW_INFO_CLI_VERSION: "v0.71.5" + GH_AW_INFO_WORKFLOW_NAME: "Code Radiator" + GH_AW_INFO_EXPERIMENTAL: "false" + GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" + GH_AW_INFO_STAGED: "false" + GH_AW_INFO_ALLOWED_DOMAINS: '["defaults","github"]' + GH_AW_INFO_FIREWALL_ENABLED: "true" + GH_AW_INFO_AWF_VERSION: "v0.25.40" + GH_AW_INFO_AWMG_VERSION: "" + GH_AW_INFO_FIREWALL_TYPE: "squid" + GH_AW_COMPILED_STRICT: "true" + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_aw_info.cjs'); + await main(core, context); + - name: Validate COPILOT_GITHUB_TOKEN secret + id: validate-secret + run: bash "${RUNNER_TEMP}/gh-aw/actions/validate_multi_secret.sh" COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default + env: + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + - name: Checkout .github and .agents folders + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + sparse-checkout: | + .github + .agents + .claude + .codex + .crush + .gemini + .opencode + .pi + sparse-checkout-cone-mode: true + fetch-depth: 1 + - name: Save agent config folders for base branch restoration + env: + GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" + # poutine:ignore untrusted_checkout_exec + run: bash "${RUNNER_TEMP}/gh-aw/actions/save_base_github_folders.sh" + - name: Check workflow lock file + id: check-lock-file + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_WORKFLOW_FILE: "code-radiator.lock.yml" + GH_AW_CONTEXT_WORKFLOW_REF: "${{ github.workflow_ref }}" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_workflow_timestamp_api.cjs'); + await main(); + - name: Check compile-agentic version + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_COMPILED_VERSION: "v0.71.5" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/check_version_updates.cjs'); + await main(); + - name: Create prompt with built-in context + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_SAFE_OUTPUTS: ${{ runner.temp }}/gh-aw/safeoutputs/outputs.jsonl + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + # poutine:ignore untrusted_checkout_exec + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" + { + cat << 'GH_AW_PROMPT_f18a65bced008989_EOF' + + GH_AW_PROMPT_f18a65bced008989_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" + cat << 'GH_AW_PROMPT_f18a65bced008989_EOF' + + Tools: add_comment(max:10), create_pull_request(max:10), update_pull_request(max:10), add_labels(max:10), push_to_pull_request_branch(max:10), missing_tool, missing_data, noop + GH_AW_PROMPT_f18a65bced008989_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_create_pull_request.md" + cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_push_to_pr_branch.md" + cat << 'GH_AW_PROMPT_f18a65bced008989_EOF' + + GH_AW_PROMPT_f18a65bced008989_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" + cat << 'GH_AW_PROMPT_f18a65bced008989_EOF' + + The following GitHub context information is available for this workflow: + {{#if __GH_AW_GITHUB_ACTOR__ }} + - **actor**: __GH_AW_GITHUB_ACTOR__ + {{/if}} + {{#if __GH_AW_GITHUB_REPOSITORY__ }} + - **repository**: __GH_AW_GITHUB_REPOSITORY__ + {{/if}} + {{#if __GH_AW_GITHUB_WORKSPACE__ }} + - **workspace**: __GH_AW_GITHUB_WORKSPACE__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ }} + - **issue-number**: #__GH_AW_GITHUB_EVENT_ISSUE_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ }} + - **discussion-number**: #__GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ }} + - **pull-request-number**: #__GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER__ + {{/if}} + {{#if __GH_AW_GITHUB_EVENT_COMMENT_ID__ }} + - **comment-id**: __GH_AW_GITHUB_EVENT_COMMENT_ID__ + {{/if}} + {{#if __GH_AW_GITHUB_RUN_ID__ }} + - **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__ + {{/if}} + + + GH_AW_PROMPT_f18a65bced008989_EOF + cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md" + cat << 'GH_AW_PROMPT_f18a65bced008989_EOF' + + {{#runtime-import .github/workflows/code-radiator.md}} + GH_AW_PROMPT_f18a65bced008989_EOF + } > "$GH_AW_PROMPT" + - name: Interpolate variables and render templates + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_ENGINE_ID: "copilot" + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/interpolate_prompt.cjs'); + await main(); + - name: Substitute placeholders + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_EVENT_COMMENT_ID: ${{ github.event.comment.id }} + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: ${{ github.event.discussion.number }} + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: ${{ github.event.issue.number }} + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + GH_AW_MCP_CLI_SERVERS_LIST: '- `safeoutputs` — run `safeoutputs --help` to see available tools' + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + + const substitutePlaceholders = require('${{ runner.temp }}/gh-aw/actions/substitute_placeholders.cjs'); + + // Call the substitution function + return await substitutePlaceholders({ + file: process.env.GH_AW_PROMPT, + substitutions: { + GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, + GH_AW_GITHUB_EVENT_COMMENT_ID: process.env.GH_AW_GITHUB_EVENT_COMMENT_ID, + GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER: process.env.GH_AW_GITHUB_EVENT_DISCUSSION_NUMBER, + GH_AW_GITHUB_EVENT_ISSUE_NUMBER: process.env.GH_AW_GITHUB_EVENT_ISSUE_NUMBER, + GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER: process.env.GH_AW_GITHUB_EVENT_PULL_REQUEST_NUMBER, + GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, + GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, + GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE, + GH_AW_MCP_CLI_SERVERS_LIST: process.env.GH_AW_MCP_CLI_SERVERS_LIST + } + }); + - name: Validate prompt placeholders + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + # poutine:ignore untrusted_checkout_exec + run: bash "${RUNNER_TEMP}/gh-aw/actions/validate_prompt_placeholders.sh" + - name: Print prompt + env: + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + # poutine:ignore untrusted_checkout_exec + run: bash "${RUNNER_TEMP}/gh-aw/actions/print_prompt_summary.sh" + - name: Upload activation artifact + if: success() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: activation + include-hidden-files: true + path: | + /tmp/gh-aw/aw_info.json + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/base + if-no-files-found: ignore + retention-days: 1 + + agent: + needs: activation + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + concurrency: + group: "gh-aw-copilot-${{ github.workflow }}" + env: + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + GH_AW_ASSETS_ALLOWED_EXTS: "" + GH_AW_ASSETS_BRANCH: "" + GH_AW_ASSETS_MAX_SIZE_KB: 0 + GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs + GH_AW_WORKFLOW_ID_SANITIZED: coderadiator + outputs: + agentic_engine_timeout: ${{ steps.detect-copilot-errors.outputs.agentic_engine_timeout || 'false' }} + checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} + effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }} + has_patch: ${{ steps.collect_output.outputs.has_patch }} + inference_access_error: ${{ steps.detect-copilot-errors.outputs.inference_access_error || 'false' }} + mcp_policy_error: ${{ steps.detect-copilot-errors.outputs.mcp_policy_error || 'false' }} + model: ${{ needs.activation.outputs.model }} + model_not_supported_error: ${{ steps.detect-copilot-errors.outputs.model_not_supported_error || 'false' }} + output: ${{ steps.collect_output.outputs.output }} + output_types: ${{ steps.collect_output.outputs.output_types }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Code Radiator" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/code-radiator.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Set runtime paths + id: set-runtime-paths + run: | + { + echo "GH_AW_SAFE_OUTPUTS=${RUNNER_TEMP}/gh-aw/safeoutputs/outputs.jsonl" + echo "GH_AW_SAFE_OUTPUTS_CONFIG_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" + echo "GH_AW_SAFE_OUTPUTS_TOOLS_PATH=${RUNNER_TEMP}/gh-aw/safeoutputs/tools.json" + } >> "$GITHUB_OUTPUT" + - name: Checkout repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + - name: Create gh-aw temp directory + run: bash "${RUNNER_TEMP}/gh-aw/actions/create_gh_aw_tmp_dir.sh" + - name: Configure gh CLI for GitHub Enterprise + run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_gh_for_ghe.sh" + env: + GH_TOKEN: ${{ github.token }} + - name: Configure Git credentials + env: + REPO_NAME: ${{ github.repository }} + SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git config --global am.keepcr true + # Re-authenticate git with GitHub token + SERVER_URL_STRIPPED="${SERVER_URL#https://}" + git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" + echo "Git configured with standard GitHub Actions identity" + - name: Checkout PR branch + id: checkout-pr + if: | + github.event.pull_request || github.event.issue.pull_request + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/checkout_pr_branch.cjs'); + await main(); + - name: Install GitHub Copilot CLI + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.40 + env: + GH_HOST: github.com + - name: Install AWF binary + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.40 + - name: Parse integrity filter lists + id: parse-guard-vars + env: + GH_AW_BLOCKED_USERS_VAR: ${{ vars.GH_AW_GITHUB_BLOCKED_USERS || '' }} + GH_AW_TRUSTED_USERS_VAR: ${{ vars.GH_AW_GITHUB_TRUSTED_USERS || '' }} + GH_AW_APPROVAL_LABELS_VAR: ${{ vars.GH_AW_GITHUB_APPROVAL_LABELS || '' }} + run: bash "${RUNNER_TEMP}/gh-aw/actions/parse_guard_list.sh" + - name: Download activation artifact + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: activation + path: /tmp/gh-aw + - name: Restore agent config folders from base branch + if: steps.checkout-pr.outcome == 'success' + env: + GH_AW_AGENT_FOLDERS: ".agents .claude .codex .crush .gemini .github .opencode .pi" + GH_AW_AGENT_FILES: ".crush.json AGENTS.md CLAUDE.md GEMINI.md PI.md opencode.jsonc" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh" + - name: Download container images + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.40@sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.40@sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280 ghcr.io/github/gh-aw-firewall/squid:0.25.40@sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51 ghcr.io/github/gh-aw-mcpg:v0.3.6@sha256:2bb8eef86006a4c5963c55616a9c51c32f27bfdecb023b8aa6f91f6718d9171c ghcr.io/github/github-mcp-server:v1.0.3@sha256:2ac27ef03461ef2b877031b838a7d1fd7f12b12d4ace7796d8cad91446d55959 node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f + - name: Generate Safe Outputs Config + run: | + mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" + mkdir -p /tmp/gh-aw/safeoutputs + mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs + cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_67dd340333ff2a92_EOF' + {"add_comment":{"max":10},"add_labels":{"max":10},"create_pull_request":{"max":10,"max_patch_files":100,"max_patch_size":1024,"protect_top_level_dot_folders":true,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS","DESIGN.md","README.md","CONTRIBUTING.md","CHANGELOG.md","SECURITY.md","CODE_OF_CONDUCT.md","AGENTS.md","CLAUDE.md","GEMINI.md"]},"create_report_incomplete_issue":{},"merge_pull_request":{"max":10},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"push_to_pull_request_branch":{"if_no_changes":"warn","max":10,"max_patch_size":1024,"protect_top_level_dot_folders":true,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS","DESIGN.md","README.md","CONTRIBUTING.md","CHANGELOG.md","SECURITY.md","CODE_OF_CONDUCT.md","AGENTS.md","CLAUDE.md","GEMINI.md"]},"report_incomplete":{},"update_pull_request":{"allow_body":true,"allow_title":true,"max":10,"update_branch":false}} + GH_AW_SAFE_OUTPUTS_CONFIG_67dd340333ff2a92_EOF + - name: Generate Safe Outputs Tools + env: + GH_AW_TOOLS_META_JSON: | + { + "description_suffixes": { + "add_comment": " CONSTRAINTS: Maximum 10 comment(s) can be added. Supports reply_to_id for discussion threading.", + "add_labels": " CONSTRAINTS: Maximum 10 label(s) can be added.", + "create_pull_request": " CONSTRAINTS: Maximum 10 pull request(s) can be created.", + "push_to_pull_request_branch": " CONSTRAINTS: Maximum 10 push(es) can be made.", + "update_pull_request": " CONSTRAINTS: Maximum 10 pull request(s) can be updated." + }, + "repo_params": {}, + "dynamic_tools": [] + } + GH_AW_VALIDATION_JSON: | + { + "add_comment": { + "defaultMax": 1, + "fields": { + "body": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "item_number": { + "issueOrPRNumber": true + }, + "reply_to_id": { + "type": "string", + "maxLength": 256 + }, + "repo": { + "type": "string", + "maxLength": 256 + } + } + }, + "add_labels": { + "defaultMax": 5, + "fields": { + "item_number": { + "issueNumberOrTemporaryId": true + }, + "labels": { + "required": true, + "type": "array", + "itemType": "string", + "itemSanitize": true, + "itemMaxLength": 128 + }, + "repo": { + "type": "string", + "maxLength": 256 + } + } + }, + "create_pull_request": { + "defaultMax": 1, + "fields": { + "base": { + "type": "string", + "sanitize": true, + "maxLength": 128 + }, + "body": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "branch": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "draft": { + "type": "boolean" + }, + "labels": { + "type": "array", + "itemType": "string", + "itemSanitize": true, + "itemMaxLength": 128 + }, + "repo": { + "type": "string", + "maxLength": 256 + }, + "title": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 128 + } + } + }, + "merge_pull_request": { + "defaultMax": 1, + "fields": { + "commit_message": { + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "commit_title": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "merge_method": { + "type": "string", + "enum": [ + "merge", + "squash", + "rebase" + ] + }, + "pull_request_number": { + "issueOrPRNumber": true + }, + "repo": { + "type": "string", + "maxLength": 256 + } + } + }, + "missing_data": { + "defaultMax": 20, + "fields": { + "alternatives": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "context": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "data_type": { + "type": "string", + "sanitize": true, + "maxLength": 128 + }, + "reason": { + "type": "string", + "sanitize": true, + "maxLength": 256 + } + } + }, + "missing_tool": { + "defaultMax": 20, + "fields": { + "alternatives": { + "type": "string", + "sanitize": true, + "maxLength": 512 + }, + "reason": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "tool": { + "type": "string", + "sanitize": true, + "maxLength": 128 + } + } + }, + "noop": { + "defaultMax": 1, + "fields": { + "message": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + } + } + }, + "push_to_pull_request_branch": { + "defaultMax": 1, + "fields": { + "branch": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "message": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "pull_request_number": { + "issueOrPRNumber": true + } + } + }, + "report_incomplete": { + "defaultMax": 5, + "fields": { + "details": { + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "reason": { + "required": true, + "type": "string", + "sanitize": true, + "maxLength": 1024 + } + } + }, + "update_pull_request": { + "defaultMax": 1, + "fields": { + "body": { + "type": "string", + "sanitize": true, + "maxLength": 65000 + }, + "draft": { + "type": "boolean" + }, + "operation": { + "type": "string", + "enum": [ + "replace", + "append", + "prepend" + ] + }, + "pull_request_number": { + "issueOrPRNumber": true + }, + "repo": { + "type": "string", + "maxLength": 256 + }, + "title": { + "type": "string", + "sanitize": true, + "maxLength": 256 + }, + "update_branch": { + "type": "boolean" + } + }, + "customValidation": "requiresOneOf:title,body,update_branch" + } + } + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/generate_safe_outputs_tools.cjs'); + await main(); + - name: Generate Safe Outputs MCP Server Config + id: safe-outputs-config + run: | + # Generate a secure random API key (360 bits of entropy, 40+ chars) + # Mask immediately to prevent timing vulnerabilities + API_KEY=$(openssl rand -base64 45 | tr -d '/+=') + echo "::add-mask::${API_KEY}" + + PORT=3001 + + # Set outputs for next steps + { + echo "safe_outputs_api_key=${API_KEY}" + echo "safe_outputs_port=${PORT}" + } >> "$GITHUB_OUTPUT" + + echo "Safe Outputs MCP server will run on port ${PORT}" + + - name: Start Safe Outputs MCP HTTP Server + id: safe-outputs-start + env: + DEBUG: '*' + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-config.outputs.safe_outputs_port }} + GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-config.outputs.safe_outputs_api_key }} + GH_AW_SAFE_OUTPUTS_TOOLS_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/tools.json + GH_AW_SAFE_OUTPUTS_CONFIG_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/config.json + GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs + run: | + # Environment variables are set above to prevent template injection + export DEBUG + export GH_AW_SAFE_OUTPUTS + export GH_AW_SAFE_OUTPUTS_PORT + export GH_AW_SAFE_OUTPUTS_API_KEY + export GH_AW_SAFE_OUTPUTS_TOOLS_PATH + export GH_AW_SAFE_OUTPUTS_CONFIG_PATH + export GH_AW_MCP_LOG_DIR + + bash "${RUNNER_TEMP}/gh-aw/actions/start_safe_outputs_server.sh" + + - name: Start MCP Gateway + id: start-mcp-gateway + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_SAFE_OUTPUTS_API_KEY: ${{ steps.safe-outputs-start.outputs.api_key }} + GH_AW_SAFE_OUTPUTS_PORT: ${{ steps.safe-outputs-start.outputs.port }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + run: | + set -eo pipefail + mkdir -p "${RUNNER_TEMP}/gh-aw/mcp-config" + + # Export gateway environment variables for MCP config and gateway script + export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_DOMAIN="host.docker.internal" + export MCP_GATEWAY_HOST_DOMAIN="localhost" + MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') + echo "::add-mask::${MCP_GATEWAY_API_KEY}" + export MCP_GATEWAY_API_KEY + export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads" + mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}" + export MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD="524288" + export DEBUG="*" + + export GH_AW_ENGINE="copilot" + MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') + MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') + DOCKER_SOCK_GID=$(stat -c '%g' /var/run/docker.sock 2>/dev/null || echo '0') + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v /var/run/docker.sock:/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.6' + + mkdir -p /home/runner/.copilot + GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) + cat << GH_AW_MCP_CONFIG_1fe8f1e7abc04440_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + { + "mcpServers": { + "github": { + "type": "stdio", + "container": "ghcr.io/github/github-mcp-server:v1.0.3", + "env": { + "GITHUB_HOST": "\${GITHUB_SERVER_URL}", + "GITHUB_PERSONAL_ACCESS_TOKEN": "\${GITHUB_MCP_SERVER_TOKEN}", + "GITHUB_READ_ONLY": "1", + "GITHUB_TOOLSETS": "pull_requests,repos" + }, + "guard-policies": { + "allow-only": { + "approval-labels": ${{ steps.parse-guard-vars.outputs.approval_labels }}, + "blocked-users": ${{ steps.parse-guard-vars.outputs.blocked_users }}, + "min-integrity": "none", + "repos": "all", + "trusted-users": ${{ steps.parse-guard-vars.outputs.trusted_users }} + } + } + }, + "safeoutputs": { + "type": "http", + "url": "http://host.docker.internal:$GH_AW_SAFE_OUTPUTS_PORT", + "headers": { + "Authorization": "\${GH_AW_SAFE_OUTPUTS_API_KEY}" + }, + "guard-policies": { + "write-sink": { + "accept": [ + "*" + ] + } + } + } + }, + "gateway": { + "port": $MCP_GATEWAY_PORT, + "domain": "${MCP_GATEWAY_DOMAIN}", + "apiKey": "${MCP_GATEWAY_API_KEY}", + "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}" + } + } + GH_AW_MCP_CONFIG_1fe8f1e7abc04440_EOF + - name: Mount MCP servers as CLIs + id: mount-mcp-clis + continue-on-error: true + env: + MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} + MCP_GATEWAY_DOMAIN: ${{ steps.start-mcp-gateway.outputs.gateway-domain }} + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io); + const { main } = require('${{ runner.temp }}/gh-aw/actions/mount_mcp_as_cli.cjs'); + await main(); + - name: Clean credentials + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/clean_git_credentials.sh" + - name: Audit pre-agent workspace + id: pre_agent_audit + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/audit_pre_agent_workspace.sh" + - name: Execute GitHub Copilot CLI + id: agentic_execution + # Copilot CLI tool arguments (sorted): + timeout-minutes: 20 + run: | + set -o pipefail + touch /tmp/gh-aw/agent-step-summary.md + GH_AW_NODE_BIN=$(command -v node 2>/dev/null || true) + export GH_AW_NODE_BIN + (umask 177 && touch /tmp/gh-aw/agent-stdio.log) + printf '%s\n' '{"$schema":"https://github.com/github/gh-aw-firewall/releases/download/v0.25.40/awf-config.schema.json","network":{"allowDomains":["*.githubusercontent.com","api.business.githubcopilot.com","api.enterprise.githubcopilot.com","api.github.com","api.githubcopilot.com","api.individual.githubcopilot.com","api.snapcraft.io","archive.ubuntu.com","azure.archive.ubuntu.com","codeload.github.com","crl.geotrust.com","crl.globalsign.com","crl.identrust.com","crl.sectigo.com","crl.thawte.com","crl.usertrust.com","crl.verisign.com","crl3.digicert.com","crl4.digicert.com","crls.ssl.com","docs.github.com","github-cloud.githubusercontent.com","github-cloud.s3.amazonaws.com","github.blog","github.com","github.githubassets.com","host.docker.internal","json-schema.org","json.schemastore.org","keyserver.ubuntu.com","lfs.github.com","objects.githubusercontent.com","ocsp.digicert.com","ocsp.geotrust.com","ocsp.globalsign.com","ocsp.identrust.com","ocsp.sectigo.com","ocsp.ssl.com","ocsp.thawte.com","ocsp.usertrust.com","ocsp.verisign.com","packagecloud.io","packages.cloud.google.com","packages.microsoft.com","ppa.launchpad.net","raw.githubusercontent.com","registry.npmjs.org","s.symcb.com","s.symcd.com","security.ubuntu.com","telemetry.enterprise.githubcopilot.com","ts-crl.ws.symantec.com","ts-ocsp.ws.symantec.com","www.googleapis.com"]},"apiProxy":{"enabled":true,"models":{"auto":["large"],"deep-research":["copilot/deep-research*","google/deep-research*"],"gemini-flash":["copilot/gemini-*flash*","google/gemini-*flash*"],"gemini-pro":["copilot/gemini-*pro*","google/gemini-*pro*"],"gpt-4.1":["copilot/gpt-4.1*","openai/gpt-4.1*"],"gpt-5":["copilot/gpt-5*","openai/gpt-5*"],"gpt-5-codex":["copilot/gpt-5*codex*","openai/gpt-5*codex*"],"gpt-5-mini":["copilot/gpt-5*mini*","openai/gpt-5*mini*"],"gpt-5-nano":["copilot/gpt-5*nano*","openai/gpt-5*nano*"],"gpt-5-pro":["copilot/gpt-5*pro*","openai/gpt-5*pro*"],"haiku":["copilot/*haiku*","anthropic/*haiku*"],"large":["sonnet","gpt-5-pro","gpt-5","gemini-pro"],"mini":["haiku","gpt-5-mini","gpt-5-nano","gemini-flash"],"opus":["copilot/*opus*","anthropic/*opus*"],"reasoning":["copilot/o1*","copilot/o3*","copilot/o4*","openai/o1*","openai/o3*","openai/o4*"],"small":["mini"],"sonnet":["copilot/*sonnet*","anthropic/*sonnet*"]}},"container":{"imageTag":"0.25.40,squid=sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51,agent=sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504,api-proxy=sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280,cli-proxy=sha256:3e7152911d4b4b7b97beef9d3d7d924ff7902227e86001ef3838fb728d5d514c"}}' > "${RUNNER_TEMP}/gh-aw/awf-config.json" && cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json + # shellcheck disable=SC1003 + sudo -E awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --skip-pull \ + -- /bin/bash -c 'export PATH="${RUNNER_TEMP}/gh-aw/mcp-cli/bin:$PATH" && export PATH="$(find /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log + env: + COPILOT_AGENT_RUNNER_TYPE: STANDALONE + COPILOT_API_KEY: dummy-byok-key-for-offline-mode + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + COPILOT_MODEL: claude-sonnet-4.5 + GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json + GH_AW_PHASE: agent + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_VERSION: v0.71.5 + GITHUB_API_URL: ${{ github.api_url }} + GITHUB_AW: true + GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + GITHUB_REF_NAME: ${{ github.ref_name }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md + GITHUB_WORKSPACE: ${{ github.workspace }} + GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_AUTHOR_NAME: github-actions[bot] + GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_COMMITTER_NAME: github-actions[bot] + XDG_CONFIG_HOME: /home/runner + - name: Detect Copilot errors + id: detect-copilot-errors + if: always() + continue-on-error: true + run: node "${RUNNER_TEMP}/gh-aw/actions/detect_copilot_errors.cjs" + - name: Configure Git credentials + env: + REPO_NAME: ${{ github.repository }} + SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git config --global am.keepcr true + # Re-authenticate git with GitHub token + SERVER_URL_STRIPPED="${SERVER_URL#https://}" + git remote set-url origin "https://x-access-token:${GITHUB_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" + echo "Git configured with standard GitHub Actions identity" + - name: Copy Copilot session state files to logs + if: always() + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/copy_copilot_session_state.sh" + - name: Stop MCP Gateway + if: always() + continue-on-error: true + env: + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} + GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh" "$GATEWAY_PID" + - name: Redact secrets in logs + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/redact_secrets.cjs'); + await main(); + env: + GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN' + SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Append agent step summary + if: always() + run: bash "${RUNNER_TEMP}/gh-aw/actions/append_agent_step_summary.sh" + - name: Copy Safe Outputs + if: always() + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + run: | + mkdir -p /tmp/gh-aw + cp "$GH_AW_SAFE_OUTPUTS" /tmp/gh-aw/safeoutputs.jsonl 2>/dev/null || true + - name: Ingest agent output + id: collect_output + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_SAFE_OUTPUTS: ${{ steps.set-runtime-paths.outputs.GH_AW_SAFE_OUTPUTS }} + GH_AW_ALLOWED_DOMAINS: "*.githubusercontent.com,api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,codeload.github.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,docs.github.com,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/collect_ndjson_output.cjs'); + await main(); + - name: Parse agent logs for step summary + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_copilot_log.cjs'); + await main(); + - name: Parse MCP Gateway logs for step summary + if: always() + id: parse-mcp-gateway + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_mcp_gateway_log.cjs'); + await main(); + - name: Print firewall logs + if: always() + continue-on-error: true + env: + AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs + run: | + # Fix permissions on firewall logs/audit dirs so they can be uploaded as artifacts + # AWF runs with sudo, creating files owned by root + sudo chmod -R a+r /tmp/gh-aw/sandbox/firewall 2>/dev/null || true + # Only run awf logs summary if awf command exists (it may not be installed if workflow failed before install step) + if command -v awf &> /dev/null; then + awf logs summary | tee -a "$GITHUB_STEP_SUMMARY" + else + echo 'AWF binary not installed, skipping firewall log summary' + fi + - name: Parse token usage for step summary + if: always() + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_token_usage.cjs'); + await main(); + - name: Print AWF reflect summary + if: always() + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/awf_reflect_summary.cjs'); + await main(); + - name: Write agent output placeholder if missing + if: always() + run: | + if [ ! -f /tmp/gh-aw/agent_output.json ]; then + echo '{"items":[]}' > /tmp/gh-aw/agent_output.json + fi + - name: Upload agent artifacts + if: always() + continue-on-error: true + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: agent + path: | + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/sandbox/agent/logs/ + /tmp/gh-aw/redacted-urls.log + /tmp/gh-aw/mcp-logs/ + /tmp/gh-aw/proxy-logs/ + !/tmp/gh-aw/proxy-logs/proxy-tls/ + /tmp/gh-aw/agent_usage.json + /tmp/gh-aw/agent-stdio.log + /tmp/gh-aw/pre-agent-audit.txt + /tmp/gh-aw/agent/ + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/safeoutputs.jsonl + /tmp/gh-aw/agent_output.json + /tmp/gh-aw/aw-*.patch + /tmp/gh-aw/aw-*.bundle + /tmp/gh-aw/awf-config.json + /tmp/gh-aw/sandbox/firewall/logs/ + /tmp/gh-aw/sandbox/firewall/audit/ + /tmp/gh-aw/sandbox/firewall/awf-reflect.json + if-no-files-found: ignore + + conclusion: + needs: + - activation + - agent + - detection + - safe_outputs + if: > + always() && (needs.agent.result != 'skipped' || needs.activation.outputs.lockdown_check_failed == 'true' || + needs.activation.outputs.stale_lock_file_failed == 'true') + runs-on: ubuntu-slim + permissions: + contents: write + discussions: write + issues: write + pull-requests: write + concurrency: + group: "gh-aw-conclusion-code-radiator" + cancel-in-progress: false + outputs: + incomplete_count: ${{ steps.report_incomplete.outputs.incomplete_count }} + noop_message: ${{ steps.noop.outputs.noop_message }} + tools_reported: ${{ steps.missing_tool.outputs.tools_reported }} + total_count: ${{ steps.missing_tool.outputs.total_count }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Code Radiator" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/code-radiator.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Process no-op messages + id: noop + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_NOOP_MAX: "1" + GH_AW_WORKFLOW_NAME: "Code Radiator" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} + GH_AW_NOOP_REPORT_AS_ISSUE: "true" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_noop_message.cjs'); + await main(); + - name: Log detection run + id: detection_runs + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_WORKFLOW_NAME: "Code Radiator" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_DETECTION_CONCLUSION: ${{ needs.detection.outputs.detection_conclusion }} + GH_AW_DETECTION_REASON: ${{ needs.detection.outputs.detection_reason }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_detection_runs.cjs'); + await main(); + - name: Record missing tool + id: missing_tool + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_MISSING_TOOL_CREATE_ISSUE: "true" + GH_AW_WORKFLOW_NAME: "Code Radiator" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/missing_tool.cjs'); + await main(); + - name: Record incomplete + id: report_incomplete + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_REPORT_INCOMPLETE_CREATE_ISSUE: "true" + GH_AW_WORKFLOW_NAME: "Code Radiator" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/report_incomplete_handler.cjs'); + await main(); + - name: Handle agent failure + id: handle_agent_failure + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_WORKFLOW_NAME: "Code Radiator" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_AGENT_CONCLUSION: ${{ needs.agent.result }} + GH_AW_WORKFLOW_ID: "code-radiator" + GH_AW_ACTION_FAILURE_ISSUE_EXPIRES_HOURS: "168" + GH_AW_ENGINE_ID: "copilot" + GH_AW_SECRET_VERIFICATION_RESULT: ${{ needs.activation.outputs.secret_verification_result }} + GH_AW_CHECKOUT_PR_SUCCESS: ${{ needs.agent.outputs.checkout_pr_success }} + GH_AW_INFERENCE_ACCESS_ERROR: ${{ needs.agent.outputs.inference_access_error }} + GH_AW_MCP_POLICY_ERROR: ${{ needs.agent.outputs.mcp_policy_error }} + GH_AW_AGENTIC_ENGINE_TIMEOUT: ${{ needs.agent.outputs.agentic_engine_timeout }} + GH_AW_MODEL_NOT_SUPPORTED_ERROR: ${{ needs.agent.outputs.model_not_supported_error }} + GH_AW_ENGINE_API_HOSTS: "api.enterprise.githubcopilot.com,api.githubcopilot.com,api.business.githubcopilot.com,api.individual.githubcopilot.com" + GH_AW_CODE_PUSH_FAILURE_ERRORS: ${{ needs.safe_outputs.outputs.code_push_failure_errors }} + GH_AW_CODE_PUSH_FAILURE_COUNT: ${{ needs.safe_outputs.outputs.code_push_failure_count }} + GH_AW_LOCKDOWN_CHECK_FAILED: ${{ needs.activation.outputs.lockdown_check_failed }} + GH_AW_STALE_LOCK_FILE_FAILED: ${{ needs.activation.outputs.stale_lock_file_failed }} + GH_AW_GROUP_REPORTS: "false" + GH_AW_FAILURE_REPORT_AS_ISSUE: "true" + GH_AW_MISSING_TOOL_REPORT_AS_FAILURE: "true" + GH_AW_MISSING_DATA_REPORT_AS_FAILURE: "true" + GH_AW_TIMEOUT_MINUTES: "20" + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); + await main(); + + detection: + needs: + - activation + - agent + if: > + always() && needs.agent.result != 'skipped' && (needs.agent.outputs.output_types != '' || needs.agent.outputs.has_patch == 'true') + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + detection_conclusion: ${{ steps.detection_conclusion.outputs.conclusion }} + detection_reason: ${{ steps.detection_conclusion.outputs.reason }} + detection_success: ${{ steps.detection_conclusion.outputs.success }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Code Radiator" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/code-radiator.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Checkout repository for patch context + if: needs.agent.outputs.has_patch == 'true' + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + # --- Threat Detection --- + - name: Clean stale firewall files from agent artifact + run: | + rm -rf /tmp/gh-aw/sandbox/firewall/logs + rm -rf /tmp/gh-aw/sandbox/firewall/audit + - name: Download container images + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.25.40@sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504 ghcr.io/github/gh-aw-firewall/api-proxy:0.25.40@sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280 ghcr.io/github/gh-aw-firewall/squid:0.25.40@sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51 + - name: Check if detection needed + id: detection_guard + if: always() + env: + OUTPUT_TYPES: ${{ needs.agent.outputs.output_types }} + HAS_PATCH: ${{ needs.agent.outputs.has_patch }} + run: | + if [[ -n "$OUTPUT_TYPES" || "$HAS_PATCH" == "true" ]]; then + echo "run_detection=true" >> "$GITHUB_OUTPUT" + echo "Detection will run: output_types=$OUTPUT_TYPES, has_patch=$HAS_PATCH" + else + echo "run_detection=false" >> "$GITHUB_OUTPUT" + echo "Detection skipped: no agent outputs or patches to analyze" + fi + - name: Clear MCP Config for detection + if: always() && steps.detection_guard.outputs.run_detection == 'true' + run: | + rm -f "${RUNNER_TEMP}/gh-aw/mcp-config/mcp-servers.json" + rm -f /home/runner/.copilot/mcp-config.json + rm -f "$GITHUB_WORKSPACE/.gemini/settings.json" + - name: Prepare threat detection files + if: always() && steps.detection_guard.outputs.run_detection == 'true' + run: | + mkdir -p /tmp/gh-aw/threat-detection/aw-prompts + cp /tmp/gh-aw/aw-prompts/prompt.txt /tmp/gh-aw/threat-detection/aw-prompts/prompt.txt 2>/dev/null || true + cp /tmp/gh-aw/agent_output.json /tmp/gh-aw/threat-detection/agent_output.json 2>/dev/null || true + for f in /tmp/gh-aw/aw-*.patch; do + [ -f "$f" ] && cp "$f" /tmp/gh-aw/threat-detection/ 2>/dev/null || true + done + for f in /tmp/gh-aw/aw-*.bundle; do + [ -f "$f" ] && cp "$f" /tmp/gh-aw/threat-detection/ 2>/dev/null || true + done + echo "Prepared threat detection files:" + ls -la /tmp/gh-aw/threat-detection/ 2>/dev/null || true + - name: Setup threat detection + if: always() && steps.detection_guard.outputs.run_detection == 'true' + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + WORKFLOW_NAME: "Code Radiator" + WORKFLOW_DESCRIPTION: "No description provided" + HAS_PATCH: ${{ needs.agent.outputs.has_patch }} + with: + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/setup_threat_detection.cjs'); + await main(); + - name: Ensure threat-detection directory and log + if: always() && steps.detection_guard.outputs.run_detection == 'true' + run: | + mkdir -p /tmp/gh-aw/threat-detection + touch /tmp/gh-aw/threat-detection/detection.log + - name: Setup Node.js + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: '24' + package-manager-cache: false + - name: Install GitHub Copilot CLI + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" 1.0.40 + env: + GH_HOST: github.com + - name: Install AWF binary + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.25.40 + - name: Execute GitHub Copilot CLI + if: always() && steps.detection_guard.outputs.run_detection == 'true' + continue-on-error: true + id: detection_agentic_execution + # Copilot CLI tool arguments (sorted): + timeout-minutes: 20 + run: | + set -o pipefail + touch /tmp/gh-aw/agent-step-summary.md + GH_AW_NODE_BIN=$(command -v node 2>/dev/null || true) + export GH_AW_NODE_BIN + (umask 177 && touch /tmp/gh-aw/threat-detection/detection.log) + printf '%s\n' '{"$schema":"https://github.com/github/gh-aw-firewall/releases/download/v0.25.40/awf-config.schema.json","network":{"allowDomains":["api.business.githubcopilot.com","api.enterprise.githubcopilot.com","api.github.com","api.githubcopilot.com","api.individual.githubcopilot.com","github.com","host.docker.internal","telemetry.enterprise.githubcopilot.com"]},"apiProxy":{"enabled":true},"container":{"imageTag":"0.25.40,squid=sha256:b084f4a2c771f584ee68084ced52fa6b3245197a1889645d817462d307d3ac51,agent=sha256:14ff567e8d9d4c2fbc5e55c973488381c71d7e0fdbe72d30ee7b8a738fd86504,api-proxy=sha256:2883ca3e5ae9f330cafdd9345bfd4ae17fc8da36c96d4c9a1f76e922b4c45280,cli-proxy=sha256:3e7152911d4b4b7b97beef9d3d7d924ff7902227e86001ef3838fb728d5d514c"}}' > "${RUNNER_TEMP}/gh-aw/awf-config.json" && cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json + # shellcheck disable=SC1003 + sudo -E awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" --env-all --exclude-env COPILOT_GITHUB_TOKEN --log-level info --proxy-logs-dir /tmp/gh-aw/sandbox/firewall/logs --audit-dir /tmp/gh-aw/sandbox/firewall/audit --enable-host-access --allow-host-ports 80,443,8080 --skip-pull \ + -- /bin/bash -c 'export PATH="$(find /opt/hostedtoolcache /home/runner/work/_tool -maxdepth 4 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || echo node)"; fi; "$GH_AW_NODE_EXEC" ${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs /usr/local/bin/copilot --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/threat-detection/detection.log + env: + COPILOT_AGENT_RUNNER_TYPE: STANDALONE + COPILOT_API_KEY: dummy-byok-key-for-offline-mode + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + COPILOT_MODEL: claude-sonnet-4.5 + GH_AW_PHASE: detection + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_VERSION: v0.71.5 + GITHUB_API_URL: ${{ github.api_url }} + GITHUB_AW: true + GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_REF_NAME: ${{ github.ref_name }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md + GITHUB_WORKSPACE: ${{ github.workspace }} + GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_AUTHOR_NAME: github-actions[bot] + GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_COMMITTER_NAME: github-actions[bot] + XDG_CONFIG_HOME: /home/runner + - name: Upload threat detection log + if: always() && steps.detection_guard.outputs.run_detection == 'true' + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: detection + path: /tmp/gh-aw/threat-detection/detection.log + if-no-files-found: ignore + - name: Parse and conclude threat detection + id: detection_conclusion + if: always() + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + RUN_DETECTION: ${{ steps.detection_guard.outputs.run_detection }} + GH_AW_DETECTION_CONTINUE_ON_ERROR: "true" + with: + script: | + try { + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/parse_threat_detection_results.cjs'); + await main(); + } catch (loadErr) { + const continueOnError = process.env.GH_AW_DETECTION_CONTINUE_ON_ERROR !== 'false'; + const msg = 'ERR_SYSTEM: \u274C Unexpected error loading threat detection module: ' + (loadErr && loadErr.message ? loadErr.message : String(loadErr)); + core.error(msg); + core.setOutput('reason', 'parse_error'); + if (continueOnError) { + core.warning('\u26A0\uFE0F ' + msg); + core.setOutput('conclusion', 'warning'); + core.setOutput('success', 'false'); + } else { + core.setOutput('conclusion', 'failure'); + core.setOutput('success', 'false'); + core.setFailed(msg); + } + } + + safe_outputs: + needs: + - activation + - agent + - detection + if: (!cancelled()) && needs.agent.result != 'skipped' && needs.detection.result == 'success' + runs-on: ubuntu-slim + permissions: + contents: write + discussions: write + issues: write + pull-requests: write + timeout-minutes: 15 + env: + GH_AW_CALLER_WORKFLOW_ID: "${{ github.repository }}/code-radiator" + GH_AW_DETECTION_CONCLUSION: ${{ needs.detection.outputs.detection_conclusion }} + GH_AW_DETECTION_REASON: ${{ needs.detection.outputs.detection_reason }} + GH_AW_EFFECTIVE_TOKENS: ${{ needs.agent.outputs.effective_tokens }} + GH_AW_ENGINE_ID: "copilot" + GH_AW_ENGINE_MODEL: "claude-sonnet-4.5" + GH_AW_ENGINE_VERSION: "1.0.40" + GH_AW_WORKFLOW_ID: "code-radiator" + GH_AW_WORKFLOW_NAME: "Code Radiator" + outputs: + code_push_failure_count: ${{ steps.process_safe_outputs.outputs.code_push_failure_count }} + code_push_failure_errors: ${{ steps.process_safe_outputs.outputs.code_push_failure_errors }} + comment_id: ${{ steps.process_safe_outputs.outputs.comment_id }} + comment_url: ${{ steps.process_safe_outputs.outputs.comment_url }} + create_discussion_error_count: ${{ steps.process_safe_outputs.outputs.create_discussion_error_count }} + create_discussion_errors: ${{ steps.process_safe_outputs.outputs.create_discussion_errors }} + created_pr_number: ${{ steps.process_safe_outputs.outputs.created_pr_number }} + created_pr_url: ${{ steps.process_safe_outputs.outputs.created_pr_url }} + process_safe_outputs_processed_count: ${{ steps.process_safe_outputs.outputs.processed_count }} + process_safe_outputs_temporary_id_map: ${{ steps.process_safe_outputs.outputs.temporary_id_map }} + push_commit_sha: ${{ steps.process_safe_outputs.outputs.push_commit_sha }} + push_commit_url: ${{ steps.process_safe_outputs.outputs.push_commit_url }} + steps: + - name: Setup Scripts + id: setup + uses: github/gh-aw-actions/setup@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Code Radiator" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/code-radiator.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "1.0.40" + - name: Download agent output artifact + id: download-agent-output + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Setup agent output environment variable + id: setup-agent-output-env + if: steps.download-agent-output.outcome == 'success' + run: | + mkdir -p /tmp/gh-aw/ + find "/tmp/gh-aw/" -type f -print + echo "GH_AW_AGENT_OUTPUT=/tmp/gh-aw/agent_output.json" >> "$GITHUB_OUTPUT" + - name: Download patch artifact + continue-on-error: true + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: agent + path: /tmp/gh-aw/ + - name: Checkout repository + if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') || (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'push_to_pull_request_branch') + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + ref: ${{ github.base_ref || github.event.pull_request.base.ref || github.ref_name || github.event.repository.default_branch }} + token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + persist-credentials: false + fetch-depth: 1 + - name: Configure Git credentials + if: (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'create_pull_request') || (!cancelled()) && needs.agent.result != 'skipped' && contains(needs.agent.outputs.output_types, 'push_to_pull_request_branch') + env: + REPO_NAME: ${{ github.repository }} + SERVER_URL: ${{ github.server_url }} + GIT_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git config --global am.keepcr true + # Re-authenticate git with GitHub token + SERVER_URL_STRIPPED="${SERVER_URL#https://}" + git remote set-url origin "https://x-access-token:${GIT_TOKEN}@${SERVER_URL_STRIPPED}/${REPO_NAME}.git" + echo "Git configured with standard GitHub Actions identity" + - name: Configure GH_HOST for enterprise compatibility + id: ghes-host-config + shell: bash + run: | + # Derive GH_HOST from GITHUB_SERVER_URL so the gh CLI targets the correct + # GitHub instance (GHES/GHEC). On github.com this is a harmless no-op. + GH_HOST="${GITHUB_SERVER_URL#https://}" + GH_HOST="${GH_HOST#http://}" + echo "GH_HOST=${GH_HOST}" >> "$GITHUB_ENV" + - name: Process Safe Outputs + id: process_safe_outputs + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: ${{ steps.setup-agent-output-env.outputs.GH_AW_AGENT_OUTPUT }} + GH_AW_ALLOWED_DOMAINS: "*.githubusercontent.com,api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.snapcraft.io,archive.ubuntu.com,azure.archive.ubuntu.com,codeload.github.com,crl.geotrust.com,crl.globalsign.com,crl.identrust.com,crl.sectigo.com,crl.thawte.com,crl.usertrust.com,crl.verisign.com,crl3.digicert.com,crl4.digicert.com,crls.ssl.com,docs.github.com,github-cloud.githubusercontent.com,github-cloud.s3.amazonaws.com,github.blog,github.com,github.githubassets.com,host.docker.internal,json-schema.org,json.schemastore.org,keyserver.ubuntu.com,lfs.github.com,objects.githubusercontent.com,ocsp.digicert.com,ocsp.geotrust.com,ocsp.globalsign.com,ocsp.identrust.com,ocsp.sectigo.com,ocsp.ssl.com,ocsp.thawte.com,ocsp.usertrust.com,ocsp.verisign.com,packagecloud.io,packages.cloud.google.com,packages.microsoft.com,ppa.launchpad.net,raw.githubusercontent.com,registry.npmjs.org,s.symcb.com,s.symcd.com,security.ubuntu.com,telemetry.enterprise.githubcopilot.com,ts-crl.ws.symantec.com,ts-ocsp.ws.symantec.com,www.googleapis.com" + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_API_URL: ${{ github.api_url }} + GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"add_comment\":{\"max\":10},\"add_labels\":{\"max\":10},\"create_pull_request\":{\"max\":10,\"max_patch_files\":100,\"max_patch_size\":1024,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\",\"CLAUDE.md\",\"GEMINI.md\"]},\"create_report_incomplete_issue\":{},\"merge_pull_request\":{\"max\":10},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"true\"},\"push_to_pull_request_branch\":{\"if_no_changes\":\"warn\",\"max\":10,\"max_patch_size\":1024,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\",\"CLAUDE.md\",\"GEMINI.md\"]},\"report_incomplete\":{},\"update_pull_request\":{\"allow_body\":true,\"allow_title\":true,\"max\":10,\"update_branch\":false}}" + GH_AW_CI_TRIGGER_TOKEN: ${{ secrets.GH_AW_CI_TRIGGER_TOKEN }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require('${{ runner.temp }}/gh-aw/actions/safe_output_handler_manager.cjs'); + await main(); + - name: Upload Safe Outputs Items + if: always() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: safe-outputs-items + path: | + /tmp/gh-aw/safe-output-items.jsonl + /tmp/gh-aw/temporary-id-map.json + if-no-files-found: ignore + diff --git a/.github/workflows/code-radiator.md b/.github/workflows/code-radiator.md new file mode 100644 index 000000000000..88ef05a185d5 --- /dev/null +++ b/.github/workflows/code-radiator.md @@ -0,0 +1,170 @@ +--- +on: + schedule: "0 0 * * *" + workflow_dispatch: + roles: [admin, maintainer, write] +permissions: + contents: read + pull-requests: read +engine: + id: copilot + model: claude-sonnet-4.5 +network: + allowed: + - defaults + - github +tools: + github: + toolsets: [pull_requests, repos] + min-integrity: none + bash: true +safe-outputs: + create-pull-request: + max: 10 + add-comment: + max: 10 + add-labels: + max: 10 + merge-pull-request: + max: 10 + push-to-pull-request-branch: + max: 10 + update-pull-request: + max: 10 +--- + +# Code Radiator + +Merge code from `main` into active target branches, creating pull requests for each. + +## Target Branch Patterns + +Only consider remote branches matching these patterns: +- `net[0-9]*.0` (e.g., `net11.0`, `net10.0`) +- `xcode[0-9]*` (e.g., `xcode26`) +- `xcode[0-9]*.[0-9]*` (e.g., `xcode26.4`) + +Only process branches that have had commits in the last 30 days. + +## Workflow + +### 1. Identify Target Branches + +```bash +# List remote branches matching target patterns with recent activity +git fetch origin +git for-each-ref --sort=-committerdate --format='%(refname:short) %(committerdate:iso8601)' refs/remotes/origin/ +``` + +Filter to branches matching the patterns above AND having a commit within the last month. + +### 2. For Each Target Branch + +#### a. Determine the local branch name + +The local branch name is: `merge/main-to--` (e.g., `merge/main-to-net11.0-20260506`). + +#### b. Check for existing pull requests + +Search for an open PR with: +- Base: the target branch +- Title matching: `🤖 Merge 'main' => ''` + +If a matching PR exists: +- If it is a **draft**: add a comment saying "⏭️ Skipping merge update: this PR is a draft. Convert to ready when you want automated updates to resume." and **skip** this target. +- If it is **not a draft**: use its head branch name as the local branch name (to update the existing PR). + +#### c. Update from target branch + +If updating an existing PR, first merge the target branch into the PR branch to incorporate any new commits from the target: + +```bash +git checkout -B "" "origin/" +git merge "origin/" --no-edit -m "Merge branch '' into ''" +``` + +If creating a new branch, start from the target: + +```bash +git checkout -B "" "origin/" +``` + +#### d. Merge main + +```bash +git merge origin/main --no-edit -m "Merge branch 'main' into ''" +``` + +#### e. Resolve merge conflicts + +If there are merge conflicts: + +**For files under `tests/dotnet/UnitTests/expected/`:** +- Do not include these files in the merge commit at all. Remove them from the index: + ```bash + git rm --cached + ``` + +**For `eng/Version.Details.props` or `eng/Version.Details.xml`:** +- Parse both the `origin/main` and `origin/` versions of the file as XML. +- For each `` element present in both files, keep the one with the **higher** `` value. +- Use semantic version comparison (split on `.`, `-`, `+` and compare numerically). +- Write the merged result and `git add` the file. + +**For `NuGet.config`:** +- Include all package source feeds from both the source (main) and target branches. +- If a feed exists in both with the same key but different URL, keep both (rename the key from main to avoid collision). +- Write the merged result and `git add` the file. + +**For any other conflicting files:** +- Do your best to resolve them using context and judgment. +- If you resolved any "other" conflicts (not covered by the rules above), mark the PR for human review: + - Do **not** enable automerge (and disable it if already enabled). + - Add the `do-not-merge` label. + - Add a comment requesting human review of the conflict resolution, listing which files were manually resolved. + +#### e. Push and create/update the PR + +```bash +git push origin "" +``` + +- If updating an existing PR: the push is sufficient (the PR updates automatically). +- If creating a new PR: + - Title: `🤖 Merge 'main' => ''` + - Body: `Automated merge of \`main\` into \`\`.\n\nCreated by the code-radiator workflow.` + - Base: the target branch + - Head: the local branch + - Enable automerge (merge strategy) on the new PR. + +### 3. Summary + +After processing all branches, report: +- Which PRs were created (with links) +- Which PRs were updated +- Which branches were skipped (draft PRs, no conflicts resolution possible) +- Which branches had no diff (main already merged) + +## Conflict Resolution Details + +### Version file merge algorithm + +For `eng/Version.Details.props` and `eng/Version.Details.xml`: + +1. Parse both XML files. +2. Build a map of `Dependency[@Name]` → `Version` text from each file. +3. For each dependency present in either file, select the higher version. +4. Use the target branch's file as the base structure, updating versions where main has higher values. +5. Dependencies that exist only in main should be added to the result. + +### Version comparison + +Split version strings on `.`, `-`, and `+`. Compare each segment numerically. Example: +- `9.0.0-preview.1.24080.9` vs `9.0.0-preview.2.24101.3` → second is higher. + +## Important Notes + +- Never force push. Always use regular `git push`. +- The workflow operates on the current repository checkout. +- Run `git fetch origin` before starting to ensure up-to-date remote refs. +- Use `gh` CLI for PR operations (create, comment, list, merge --auto). diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml new file mode 100644 index 000000000000..f5f09b80ef69 --- /dev/null +++ b/.github/workflows/copilot-setup-steps.yml @@ -0,0 +1,26 @@ +name: "Copilot Setup Steps" + +# This workflow configures the environment for GitHub Copilot Agent with gh-aw MCP server +on: + workflow_dispatch: + push: + paths: + - .github/workflows/copilot-setup-steps.yml + +jobs: + # The job MUST be called 'copilot-setup-steps' to be recognized by GitHub Copilot Agent + copilot-setup-steps: + runs-on: ubuntu-latest + + # Set minimal permissions for setup steps + # Copilot Agent receives its own token with appropriate permissions + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + - name: Install gh-aw extension + uses: github/gh-aw-actions/setup-cli@b8068426813005612b960b5ab0b8bd2c27142323 # v0.71.5 + with: + version: v0.71.5 diff --git a/.github/workflows/inter-branch-merge-flow.yml b/.github/workflows/inter-branch-merge-flow.yml index 9300b4de0fa0..b6b979ddad46 100644 --- a/.github/workflows/inter-branch-merge-flow.yml +++ b/.github/workflows/inter-branch-merge-flow.yml @@ -19,9 +19,10 @@ on: # allow triggering this action manually workflow_dispatch: - # Run every day at 3:00 AM UTC - schedule: - - cron: '0 3 * * *' +# Disable for now, trying out an agentic workflow +# # Run every day at 3:00 AM UTC +# schedule: +# - cron: '0 3 * * *' permissions: contents: write From c4445b1c2aac75ce6146b1fa10af7b13c8d73ddb Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 7 May 2026 09:08:02 +0200 Subject: [PATCH 31/35] [tests] Fix underlying type for BrowserEngineKit enums. (#25348) Also these enums are only available for arm64. --- tests/monotouch-test/ObjCRuntime/StrongEnumTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/monotouch-test/ObjCRuntime/StrongEnumTests.cs b/tests/monotouch-test/ObjCRuntime/StrongEnumTests.cs index c5b7aefee9df..65e26a101dbd 100644 --- a/tests/monotouch-test/ObjCRuntime/StrongEnumTests.cs +++ b/tests/monotouch-test/ObjCRuntime/StrongEnumTests.cs @@ -79,9 +79,9 @@ public void GetConstant () }; #if __TVOS__ && !XAMCORE_5_0 - if (Runtime.Arch == Arch.SIMULATOR) { - rv.AddRange (Enum.GetValues ().Select (v => (typeof (global::BrowserEngineKit.BEAccessibilityTrait), (object) (int) v))); // BrowserEngineKit isn't available in the simulator - rv.AddRange (Enum.GetValues ().Select (v => (typeof (global::BrowserEngineKit.BEAccessibilityNotification), (object) (int) v))); // BrowserEngineKit isn't available in the simulator + if (Runtime.Arch == Arch.SIMULATOR && Runtime.IsARM64CallingConvention) { + rv.AddRange (Enum.GetValues ().Select (v => (typeof (global::BrowserEngineKit.BEAccessibilityTrait), (object) (long) v))); // BrowserEngineKit isn't available in the simulator + rv.AddRange (Enum.GetValues ().Select (v => (typeof (global::BrowserEngineKit.BEAccessibilityNotification), (object) (long) v))); // BrowserEngineKit isn't available in the simulator } #endif // __TVOS__ && !XAMCORE_5_0 From d9c700ce45c09befd392e89f518638835f9e8110 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 7 May 2026 14:08:14 +0200 Subject: [PATCH 32/35] [tests] Using the strict dlfcn mode only works if monotouch-test is trimmed. (#25354) This is not the default in .NET 11 (it is in .NET 10), so make it explicit. --- tests/xharness/Jenkins/TestVariationsFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/xharness/Jenkins/TestVariationsFactory.cs b/tests/xharness/Jenkins/TestVariationsFactory.cs index a095b00616b4..72984f51eeb9 100644 --- a/tests/xharness/Jenkins/TestVariationsFactory.cs +++ b/tests/xharness/Jenkins/TestVariationsFactory.cs @@ -114,7 +114,7 @@ IEnumerable GetTestData (RunTestTask test) yield return new TestData { Variation = "Release (interpreter)", TestVariation = "release|interpreter", Ignored = ignore }; } yield return new TestData { Variation = $"Release (compat inline dlfcn)", TestVariation = "inline-dlfcn-methods-compat|release", Ignored = ignore }; - yield return new TestData { Variation = $"Release (strict inline dlfcn)", TestVariation = "inline-dlfcn-methods-strict|release", Ignored = ignore }; + yield return new TestData { Variation = $"Release (strict inline dlfcn, link sdk)", TestVariation = "inline-dlfcn-methods-strict|linksdk|release", Ignored = ignore }; if (mac_supports_arm64) yield return new TestData { Variation = $"Release (NativeAOT, .NET 11 defaults)", TestVariation = "inline-dlfcn-methods-strict|nativeaot|release", Ignored = ignore, RuntimeIdentifier = arm64_sim_runtime_identifier }; // it's necessary to specify RID, because NativeAOT defaults to building for device break; From ad71db3b785112eb71ebd373da3f3d74d86a77db Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 7 May 2026 14:25:25 +0200 Subject: [PATCH 33/35] [tests] Update expected sizes. --- .../expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt | 4 ++-- .../UnitTests/expected/MacCatalyst-NativeAOT-size.txt | 4 ++-- .../MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt | 6 +++--- .../UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt | 6 +++--- tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt | 6 +++--- .../expected/MacOSX-NativeAOT-TrimmableStatic-size.txt | 4 ++-- tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt | 4 ++-- .../expected/TVOS-NativeAOT-TrimmableStatic-size.txt | 4 ++-- tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt | 4 ++-- .../expected/iOS-NativeAOT-TrimmableStatic-size.txt | 4 ++-- tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt | 4 ++-- 11 files changed, 25 insertions(+), 25 deletions(-) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt index e736b72784ab..8662c46aa57a 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-TrimmableStatic-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 8,742,753 bytes (8,537.8 KB = 8.3 MB) +AppBundleSize: 8,785,825 bytes (8,579.9 KB = 8.4 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 2,358 bytes (2.3 KB = 0.0 MB) Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 8,737,392 bytes (8,532.6 KB = 8.3 MB) +Contents/MacOS/SizeTestApp: 8,780,464 bytes (8,574.7 KB = 8.4 MB) Contents/MonoBundle/runtimeconfig.bin: 1,896 bytes (1.9 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt index 4a91a77c88b1..37d60c2430fc 100644 --- a/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/MacCatalyst-NativeAOT-size.txt @@ -1,7 +1,7 @@ -AppBundleSize: 2,814,777 bytes (2,748.8 KB = 2.7 MB) +AppBundleSize: 2,815,305 bytes (2,749.3 KB = 2.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 2,358 bytes (2.3 KB = 0.0 MB) Contents/Info.plist: 1,099 bytes (1.1 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 2,809,504 bytes (2,743.7 KB = 2.7 MB) +Contents/MacOS/SizeTestApp: 2,810,032 bytes (2,744.2 KB = 2.7 MB) Contents/MonoBundle/runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt index f48d3166a07a..c174fce60d96 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-TrimmableStatic-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 259,125,784 bytes (253,052.5 KB = 247.1 MB) +AppBundleSize: 259,128,856 bytes (253,055.5 KB = 247.1 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 56,016 bytes (54.7 KB = 0.1 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) @@ -16,7 +16,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Hosting.Abstractions Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Logging.Abstractions.dll: 150,528 bytes (147.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Options.dll: 135,168 bytes (132.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Primitives.dll: 70,144 bytes (68.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 38,109,696 bytes (37,216.5 KB = 36.3 MB) +Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 38,111,232 bytes (37,218.0 KB = 36.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.Core.dll: 1,321,472 bytes (1,290.5 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Registry.dll: 23,552 bytes (23.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/SizeTestApp.dll: 5,632 bytes (5.5 KB = 0.0 MB) @@ -122,7 +122,7 @@ Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Hosting.Abstractions.d Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Logging.Abstractions.dll: 134,656 bytes (131.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Options.dll: 119,808 bytes (117.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Primitives.dll: 63,488 bytes (62.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 38,109,696 bytes (37,216.5 KB = 36.3 MB) +Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 38,111,232 bytes (37,218.0 KB = 36.3 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.Core.dll: 1,152,000 bytes (1,125.0 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Registry.dll: 23,040 bytes (22.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/SizeTestApp.dll: 5,632 bytes (5.5 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt index d30ea4c3b291..16289972b741 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-Interpreter-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 247,262,458 bytes (241,467.2 KB = 235.8 MB) +AppBundleSize: 247,265,530 bytes (241,470.2 KB = 235.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 54,948 bytes (53.7 KB = 0.1 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) @@ -13,7 +13,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Hosting.Abstractions Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Logging.Abstractions.dll: 150,528 bytes (147.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Options.dll: 135,168 bytes (132.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Primitives.dll: 70,144 bytes (68.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 36,713,472 bytes (35,853.0 KB = 35.0 MB) +Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 36,715,008 bytes (35,854.5 KB = 35.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.Core.dll: 1,321,472 bytes (1,290.5 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Registry.dll: 23,552 bytes (23.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/SizeTestApp.dll: 6,656 bytes (6.5 KB = 0.0 MB) @@ -116,7 +116,7 @@ Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Hosting.Abstractions.d Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Logging.Abstractions.dll: 134,656 bytes (131.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Options.dll: 119,808 bytes (117.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Primitives.dll: 63,488 bytes (62.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 36,713,472 bytes (35,853.0 KB = 35.0 MB) +Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 36,715,008 bytes (35,854.5 KB = 35.0 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.Core.dll: 1,152,000 bytes (1,125.0 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Registry.dll: 23,040 bytes (22.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/SizeTestApp.dll: 6,656 bytes (6.5 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt index 4c35bf0be4bd..6df499b345f0 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-CoreCLR-R2R-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 312,393,978 bytes (305,072.2 KB = 297.9 MB) +AppBundleSize: 312,397,562 bytes (305,075.7 KB = 297.9 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 54,948 bytes (53.7 KB = 0.1 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) @@ -13,7 +13,7 @@ Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Hosting.Abstractions Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Logging.Abstractions.dll: 150,528 bytes (147.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Options.dll: 135,168 bytes (132.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Extensions.Primitives.dll: 70,144 bytes (68.5 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 75,028,480 bytes (73,270.0 KB = 71.6 MB) +Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.macOS.dll: 75,030,016 bytes (73,271.5 KB = 71.6 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.VisualBasic.Core.dll: 1,321,472 bytes (1,290.5 KB = 1.3 MB) Contents/MonoBundle/.xamarin/osx-arm64/Microsoft.Win32.Registry.dll: 23,552 bytes (23.0 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-arm64/SizeTestApp.dll: 10,240 bytes (10.0 KB = 0.0 MB) @@ -116,7 +116,7 @@ Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Hosting.Abstractions.d Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Logging.Abstractions.dll: 134,656 bytes (131.5 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Options.dll: 119,808 bytes (117.0 KB = 0.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Extensions.Primitives.dll: 63,488 bytes (62.0 KB = 0.1 MB) -Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 63,523,328 bytes (62,034.5 KB = 60.6 MB) +Contents/MonoBundle/.xamarin/osx-x64/Microsoft.macOS.dll: 63,525,376 bytes (62,036.5 KB = 60.6 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.VisualBasic.Core.dll: 1,152,000 bytes (1,125.0 KB = 1.1 MB) Contents/MonoBundle/.xamarin/osx-x64/Microsoft.Win32.Registry.dll: 23,040 bytes (22.5 KB = 0.0 MB) Contents/MonoBundle/.xamarin/osx-x64/SizeTestApp.dll: 9,728 bytes (9.5 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt index 4081c9ac55db..4e3fd8802443 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-TrimmableStatic-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 18,618,623 bytes (18,182.2 KB = 17.8 MB) +AppBundleSize: 18,656,415 bytes (18,219.2 KB = 17.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 2,644 bytes (2.6 KB = 0.0 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 18,613,152 bytes (18,176.9 KB = 17.8 MB) +Contents/MacOS/SizeTestApp: 18,650,944 bytes (18,213.8 KB = 17.8 MB) Contents/MonoBundle/runtimeconfig.bin: 1,848 bytes (1.8 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) Contents/Resources/archived-expanded-entitlements.xcent: 241 bytes (0.2 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt index 28731d741ecb..e32e4ff2fc63 100644 --- a/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/MacOSX-NativeAOT-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 6,087,325 bytes (5,944.7 KB = 5.8 MB) +AppBundleSize: 6,087,789 bytes (5,945.1 KB = 5.8 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: Contents/_CodeSignature/CodeResources: 2,644 bytes (2.6 KB = 0.0 MB) Contents/Info.plist: 730 bytes (0.7 KB = 0.0 MB) -Contents/MacOS/SizeTestApp: 6,081,936 bytes (5,939.4 KB = 5.8 MB) +Contents/MacOS/SizeTestApp: 6,082,400 bytes (5,939.8 KB = 5.8 MB) Contents/MonoBundle/runtimeconfig.bin: 1,766 bytes (1.7 KB = 0.0 MB) Contents/PkgInfo: 8 bytes (0.0 KB = 0.0 MB) Contents/Resources/archived-expanded-entitlements.xcent: 241 bytes (0.2 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt index b7b03f85ddc8..ba1cf3697143 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-TrimmableStatic-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 7,921,331 bytes (7,735.7 KB = 7.6 MB) +AppBundleSize: 7,925,555 bytes (7,739.8 KB = 7.6 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,889 bytes (1.8 KB = 0.0 MB) -SizeTestApp: 7,915,344 bytes (7,729.8 KB = 7.5 MB) +SizeTestApp: 7,919,568 bytes (7,734.0 KB = 7.6 MB) diff --git a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt index 0d2e37094af4..ffdab3ff63f2 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-NativeAOT-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 2,848,946 bytes (2,782.2 KB = 2.7 MB) +AppBundleSize: 2,849,458 bytes (2,782.7 KB = 2.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) -SizeTestApp: 2,843,040 bytes (2,776.4 KB = 2.7 MB) +SizeTestApp: 2,843,552 bytes (2,776.9 KB = 2.7 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt index 180e0f612d11..5a2d16496b1a 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-TrimmableStatic-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 9,054,810 bytes (8,842.6 KB = 8.6 MB) +AppBundleSize: 9,081,274 bytes (8,868.4 KB = 8.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,888 bytes (1.8 KB = 0.0 MB) -SizeTestApp: 9,048,800 bytes (8,836.7 KB = 8.6 MB) +SizeTestApp: 9,075,264 bytes (8,862.6 KB = 8.7 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt index bca8809ca15f..d75275754af2 100644 --- a/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-NativeAOT-size.txt @@ -1,8 +1,8 @@ -AppBundleSize: 2,849,290 bytes (2,782.5 KB = 2.7 MB) +AppBundleSize: 2,849,818 bytes (2,783.0 KB = 2.7 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 2,589 bytes (2.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) runtimeconfig.bin: 1,808 bytes (1.8 KB = 0.0 MB) -SizeTestApp: 2,843,360 bytes (2,776.7 KB = 2.7 MB) +SizeTestApp: 2,843,888 bytes (2,777.2 KB = 2.7 MB) From 6f1dde2b28cf61a61b0238a7c88643fce8a075c4 Mon Sep 17 00:00:00 2001 From: VS MobileTools Engineering Service 2 Date: Thu, 7 May 2026 06:07:14 -0700 Subject: [PATCH 34/35] Localized file check-in by OneLocBuild Task: Build definition ID 14411: Build ID 14036358 (#25356) This is the pull request automatically created by the OneLocBuild task in the build process to check-in localized files generated based upon translation source files (.lcl files) handed-back from the downstream localization pipeline. If there are issues in translations, visit https://aka.ms/icxLocBug and log bugs for fixes. The OneLocBuild wiki is https://aka.ms/onelocbuild and the localization process in general is documented at https://aka.ms/AllAboutLoc. --- .../mtouch/TranslatedAssemblies/Errors.cs.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.de.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.es.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.fr.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.it.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.ja.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.ko.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.pl.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.pt-BR.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.ru.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.tr.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.zh-Hans.resx | 13 +++++++++++++ .../mtouch/TranslatedAssemblies/Errors.zh-Hant.resx | 13 +++++++++++++ 13 files changed, 169 insertions(+) diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.cs.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.cs.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.cs.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.cs.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.de.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.de.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.de.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.de.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.es.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.es.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.es.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.es.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.fr.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.fr.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.fr.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.fr.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.it.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.it.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.it.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.it.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.ja.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.ja.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.ja.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.ja.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.ko.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.ko.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.ko.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.ko.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.pl.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.pl.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.pl.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.pl.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.pt-BR.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.pt-BR.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.pt-BR.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.pt-BR.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.ru.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.ru.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.ru.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.ru.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.tr.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.tr.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.tr.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.tr.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hans.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hans.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hans.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hans.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} diff --git a/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hant.resx b/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hant.resx index acaf24817a6d..373de125892d 100644 --- a/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hant.resx +++ b/macios/tools/mtouch/TranslatedAssemblies/Errors.zh-Hant.resx @@ -832,6 +832,19 @@ + + + Unsupported primitive field type '{0}' for symbol '{1}' in method '{2}'. Sub-optimal but functional code will be generated. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown or unsupported Dlfcn pattern: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + + + The field type '{0}' for symbol '{1}' in method '{2}' is not an NSObject subclass. Please file an issue at https://github.com/dotnet/macios/issues/new + + + Unknown IL sequence for method with call to Dlfcn.CachePointer: '{0}' in method '{1}'. The call will not be inlined. Please file an issue at https://github.com/dotnet/macios/issues/new + The linker step '{0}' failed during processing: {1} From 7d5b61875758ad6deee6d2caa319cc2fb5742c51 Mon Sep 17 00:00:00 2001 From: Rolf Bjarne Kvinge Date: Thu, 7 May 2026 22:16:37 +0200 Subject: [PATCH 35/35] [tests] Update expected sizes. --- tests/dotnet/UnitTests/expected/TVOS-CoreCLR-R2R-size.txt | 4 ++-- tests/dotnet/UnitTests/expected/iOS-CoreCLR-R2R-size.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-R2R-size.txt b/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-R2R-size.txt index 636bef87ff61..498e1e028be4 100644 --- a/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-R2R-size.txt +++ b/tests/dotnet/UnitTests/expected/TVOS-CoreCLR-R2R-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 12,616,983 bytes (12,321.3 KB = 12.0 MB) +AppBundleSize: 12,633,511 bytes (12,337.4 KB = 12.0 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 10,737 bytes (10.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) @@ -19,7 +19,7 @@ Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/Info.plist: 85 Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/libSystem.Security.Cryptography.Native.Apple: 215,440 bytes (210.4 KB = 0.2 MB) Frameworks/SizeTestApp.r2r.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) Frameworks/SizeTestApp.r2r.framework/Info.plist: 801 bytes (0.8 KB = 0.0 MB) -Frameworks/SizeTestApp.r2r.framework/SizeTestApp.r2r: 3,424,784 bytes (3,344.5 KB = 3.3 MB) +Frameworks/SizeTestApp.r2r.framework/SizeTestApp.r2r: 3,441,312 bytes (3,360.7 KB = 3.3 MB) Info.plist: 1,117 bytes (1.1 KB = 0.0 MB) Microsoft.tvOS.dll: 98,816 bytes (96.5 KB = 0.1 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB) diff --git a/tests/dotnet/UnitTests/expected/iOS-CoreCLR-R2R-size.txt b/tests/dotnet/UnitTests/expected/iOS-CoreCLR-R2R-size.txt index c62020ac0e47..81d682ae01d1 100644 --- a/tests/dotnet/UnitTests/expected/iOS-CoreCLR-R2R-size.txt +++ b/tests/dotnet/UnitTests/expected/iOS-CoreCLR-R2R-size.txt @@ -1,4 +1,4 @@ -AppBundleSize: 12,665,406 bytes (12,368.6 KB = 12.1 MB) +AppBundleSize: 12,681,838 bytes (12,384.6 KB = 12.1 MB) # The following list of files and their sizes is just informational / for review, and isn't used in the test: _CodeSignature/CodeResources: 11,733 bytes (11.5 KB = 0.0 MB) archived-expanded-entitlements.xcent: 384 bytes (0.4 KB = 0.0 MB) @@ -22,7 +22,7 @@ Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/Info.plist: 88 Frameworks/libSystem.Security.Cryptography.Native.Apple.framework/libSystem.Security.Cryptography.Native.Apple: 214,336 bytes (209.3 KB = 0.2 MB) Frameworks/SizeTestApp.r2r.framework/_CodeSignature/CodeResources: 1,798 bytes (1.8 KB = 0.0 MB) Frameworks/SizeTestApp.r2r.framework/Info.plist: 825 bytes (0.8 KB = 0.0 MB) -Frameworks/SizeTestApp.r2r.framework/SizeTestApp.r2r: 3,404,976 bytes (3,325.2 KB = 3.2 MB) +Frameworks/SizeTestApp.r2r.framework/SizeTestApp.r2r: 3,421,408 bytes (3,341.2 KB = 3.3 MB) Info.plist: 1,141 bytes (1.1 KB = 0.0 MB) Microsoft.iOS.dll: 98,816 bytes (96.5 KB = 0.1 MB) PkgInfo: 8 bytes (0.0 KB = 0.0 MB)