diff --git a/NuGet.config b/NuGet.config
index 1284be0389d3..dc5a8ecb5664 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -8,7 +8,7 @@
-
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 8fe3b7c1f53b..4bc3c31c64de 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -1,161 +1,161 @@
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/android
- 7ab8bac563839df778de1b91409cf4099cc76940
+ 054ae69de9fb16610987bb5de02fb5f28e28ead7
https://github.com/dotnet/android
d549e1dc4e2a083b08b4f24cb5495e81b99d79b5
-
+
https://github.com/dotnet/macios
- 5bf7d00bec4a09ba623398bea41429ab1be795a1
+ 6e05e6f559c115a3272ff1e908a6b37a4ce03fb6
-
+
https://github.com/dotnet/macios
- 5bf7d00bec4a09ba623398bea41429ab1be795a1
+ 6e05e6f559c115a3272ff1e908a6b37a4ce03fb6
-
+
https://github.com/dotnet/macios
- 5bf7d00bec4a09ba623398bea41429ab1be795a1
+ 6e05e6f559c115a3272ff1e908a6b37a4ce03fb6
-
+
https://github.com/dotnet/macios
- 5bf7d00bec4a09ba623398bea41429ab1be795a1
+ 6e05e6f559c115a3272ff1e908a6b37a4ce03fb6
-
+
https://github.com/dotnet/macios
- e6aeff4eaafa3918d4a27db2dcf5aba43cc3443c
+ 02e58e4268861b149cdbadb06b7e1aef6c939670
-
+
https://github.com/dotnet/macios
- e6aeff4eaafa3918d4a27db2dcf5aba43cc3443c
+ 02e58e4268861b149cdbadb06b7e1aef6c939670
-
+
https://github.com/dotnet/macios
- e6aeff4eaafa3918d4a27db2dcf5aba43cc3443c
+ 02e58e4268861b149cdbadb06b7e1aef6c939670
-
+
https://github.com/dotnet/macios
- e6aeff4eaafa3918d4a27db2dcf5aba43cc3443c
+ 02e58e4268861b149cdbadb06b7e1aef6c939670
https://dev.azure.com/microsoft/ProjectReunion/_git/ProjectReunionInternal
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
https://github.com/dotnet/templating
3f4da9ced34942d83054e647f3b1d9d7dde281e8
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a512c3ad43185e96fc2c2769a4f02af689e3fb99
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
https://github.com/dotnet/xharness
@@ -175,37 +175,37 @@
-
+
https://github.com/dotnet/dotnet
- a9679a8de87742e170318ea39f7f0e2874bcd441
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a9679a8de87742e170318ea39f7f0e2874bcd441
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a9679a8de87742e170318ea39f7f0e2874bcd441
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a9679a8de87742e170318ea39f7f0e2874bcd441
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a9679a8de87742e170318ea39f7f0e2874bcd441
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a9679a8de87742e170318ea39f7f0e2874bcd441
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a9679a8de87742e170318ea39f7f0e2874bcd441
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
-
+
https://github.com/dotnet/dotnet
- a9679a8de87742e170318ea39f7f0e2874bcd441
+ cb8306a63c5cf24e9381108a3a9eb58907fd0f60
diff --git a/eng/Versions.props b/eng/Versions.props
index 776558006355..afa6e0890e8a 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -31,10 +31,10 @@
10.0.20
- 11.0.100-preview.6.26325.125
+ 11.0.100-preview.7.26365.101
$(MicrosoftNETSdkPackageVersion)
- 11.0.0-preview.6.26325.125
+ 11.0.0-preview.7.26365.101
$(MicrosoftNETCoreAppRefPackageVersion)
$(MicrosoftNETCoreAppRefPackageVersion)
$(MicrosoftNETCoreAppRefPackageVersion)
@@ -42,18 +42,18 @@
1.0.0-prerelease.26317.1
$(MicrosoftNETCoreAppRefPackageVersion)
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
10.3.0
10.3.0
11.0.0-preview.2.26103.111
@@ -63,19 +63,19 @@
1.0.0-rc2
1.0.0-preview.260225.1
- 37.0.0-ci.main.51
+ 37.0.0-ci.main.2120
36.1.69
$(MicrosoftNetSdkAndroidManifest100100PackageVersion)
- 26.5.11717-net11-p6
- 26.5.11717-net11-p6
- 26.5.11717-net11-p6
- 26.5.11717-net11-p6
+ 26.5.11945-net11-p7
+ 26.5.11945-net11-p7
+ 26.5.11945-net11-p7
+ 26.5.11945-net11-p7
- 26.5.10301
- 26.5.10301
- 26.5.10301
- 26.5.10301
+ 26.5.10309
+ 26.5.10309
+ 26.5.10309
+ 26.5.10309
8.0.148
@@ -84,19 +84,19 @@
1.3.2
1.0.3179.45
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
- 11.0.0-preview.6.26325.125
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
+ 11.0.0-preview.7.26365.101
10.0.2
$(MicrosoftAspNetCorePackageVersion)
@@ -146,14 +146,13 @@
0.9.0
4.2.3
9.0.0
- 11.0.0-beta.26330.112
- 11.0.0-beta.26330.112
- 11.0.0-beta.26330.112
- 11.0.0-beta.26330.112
+ 11.0.0-beta.26365.101
+ 11.0.0-beta.26365.101
+ 11.0.0-beta.26365.101
+ 11.0.0-beta.26365.101
1.1.87-gba258badda
- 11.0.0-beta.26330.112
- 11.0.0-beta.26330.112
- 6.0.3-dotnet.4
+ 11.0.0-beta.26365.101
+ 11.0.0-beta.26365.101
17.6.0
diff --git a/eng/common/SetupNugetSources.ps1 b/eng/common/SetupNugetSources.ps1
index 58002808bc84..b3bddff355e7 100644
--- a/eng/common/SetupNugetSources.ps1
+++ b/eng/common/SetupNugetSources.ps1
@@ -13,7 +13,11 @@
# filePath: $(System.DefaultWorkingDirectory)/eng/common/SetupNugetSources.ps1
# arguments: -ConfigFile $(System.DefaultWorkingDirectory)/NuGet.config -Password $Env:Token
# env:
-# Token: $(dn-bot-dnceng-artifact-feeds-rw)
+# Token: $(InternalFeedToken)
+#
+# Note: This logic is abstracted into enable-internal-sources.yml, which uses
+# NuGetAuthenticate or a WIF-backed service connection. Prefer that template
+# over calling this script directly.
#
# Note that the NuGetAuthenticate task should be called after SetupNugetSources.
# This ensures that:
diff --git a/eng/common/core-templates/job/helix-job-monitor.yml b/eng/common/core-templates/job/helix-job-monitor.yml
index a8162c511667..96287e55a15b 100644
--- a/eng/common/core-templates/job/helix-job-monitor.yml
+++ b/eng/common/core-templates/job/helix-job-monitor.yml
@@ -57,6 +57,14 @@ parameters:
type: number
default: 30
+# When 'true' (the default), Helix work items that exit 0 but have failed AzDO test results
+# are treated as failed: they count toward the monitor's exit code and are resubmitted by a
+# later invocation's retry pass. Set to 'false' to fall back to exit-code-only outcomes.
+# Forwarded as --fail-on-failed-tests.
+- name: failWorkItemsWithFailedTests
+ type: boolean
+ default: true
+
# Advanced: optional pipeline artifact (produced earlier in this run) that contains the tool
# nupkg. When set, the artifact is downloaded and the tool is installed from the nupkg into
# a local tool-path; this bypasses the repo's .config/dotnet-tools.json manifest and is
@@ -170,6 +178,7 @@ jobs:
toolArgs=(
--helix-base-uri '${{ parameters.helixBaseUri }}'
--polling-interval-seconds '${{ parameters.pollingIntervalSeconds }}'
+ --fail-on-failed-tests '${{ parameters.failWorkItemsWithFailedTests }}'
--max-wait-minutes "$((${{ parameters.timeoutInMinutes }} - 5))" # Set the tool's timeout slightly lower than the Azure DevOps job timeout to allow it to exit gracefully.
--stage-name '$(System.StageName)'
)
diff --git a/eng/common/core-templates/job/publish-build-assets.yml b/eng/common/core-templates/job/publish-build-assets.yml
index 700f77114658..4229288d3d38 100644
--- a/eng/common/core-templates/job/publish-build-assets.yml
+++ b/eng/common/core-templates/job/publish-build-assets.yml
@@ -122,9 +122,6 @@ jobs:
# Populate internal runtime variables.
- template: /eng/common/templates/steps/enable-internal-sources.yml
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- parameters:
- legacyCredential: $(dn-bot-dnceng-artifact-feeds-rw)
- template: /eng/common/templates/steps/enable-internal-runtimes.yml
diff --git a/eng/common/core-templates/post-build/post-build.yml b/eng/common/core-templates/post-build/post-build.yml
index 8aa86e304919..9d951352696e 100644
--- a/eng/common/core-templates/post-build/post-build.yml
+++ b/eng/common/core-templates/post-build/post-build.yml
@@ -295,8 +295,6 @@ stages:
# 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
diff --git a/eng/common/core-templates/steps/send-to-helix.yml b/eng/common/core-templates/steps/send-to-helix.yml
index 68fa739c4ab2..ec7a20003992 100644
--- a/eng/common/core-templates/steps/send-to-helix.yml
+++ b/eng/common/core-templates/steps/send-to-helix.yml
@@ -10,6 +10,7 @@ parameters:
HelixConfiguration: '' # optional -- additional property attached to a job
HelixPreCommands: '' # optional -- commands to run before Helix work item execution
HelixPostCommands: '' # optional -- commands to run after Helix work item execution
+ UseHelixMonitor: false # optional -- true will submit Helix jobs configured for the standalone Helix Job Monitor (results are reported/waited on out-of-band; this step will not wait, and WaitForWorkItemCompletion will be overridden)
WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects
WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects
WorkItemTimeout: '' # optional -- a timeout in TimeSpan.Parse-ready value (e.g. 00:02:00) for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects
@@ -31,7 +32,15 @@ parameters:
continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false
steps:
- - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY/${{ parameters.HelixProjectPath }} /restore /p:TreatWarningsAsErrors=false ${{ parameters.HelixProjectArguments }} /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"'
+ - powershell: >
+ $(Build.SourcesDirectory)\eng\common\msbuild.ps1
+ $(Build.SourcesDirectory)/${{ parameters.HelixProjectPath }}
+ /restore
+ /p:TreatWarningsAsErrors=false
+ /p:EnableHelixJobMonitor=${{ parameters.UseHelixMonitor }}
+ ${{ parameters.HelixProjectArguments }}
+ /t:Test
+ /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog
displayName: ${{ parameters.DisplayNamePrefix }} (Windows)
env:
BuildConfig: $(_BuildConfig)
@@ -61,7 +70,15 @@ steps:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT'))
continueOnError: ${{ parameters.continueOnError }}
- - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/${{ parameters.HelixProjectPath }} /restore /p:TreatWarningsAsErrors=false ${{ parameters.HelixProjectArguments }} /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog
+ - script: >
+ $(Build.SourcesDirectory)/eng/common/msbuild.sh
+ $(Build.SourcesDirectory)/${{ parameters.HelixProjectPath }}
+ /restore
+ /p:TreatWarningsAsErrors=false
+ /p:EnableHelixJobMonitor=${{ parameters.UseHelixMonitor }}
+ ${{ parameters.HelixProjectArguments }}
+ /t:Test
+ /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog
displayName: ${{ parameters.DisplayNamePrefix }} (Unix)
env:
BuildConfig: $(_BuildConfig)
@@ -91,3 +108,4 @@ steps:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT'))
continueOnError: ${{ parameters.continueOnError }}
+
diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh
index 273cae651a2b..453bb1ba5b1e 100755
--- a/eng/common/cross/build-rootfs.sh
+++ b/eng/common/cross/build-rootfs.sh
@@ -18,7 +18,10 @@ usage()
echo "--skipsigcheck - optional, will skip package signature checks (allowing untrusted packages)."
echo "--skipemulation - optional, will skip qemu and debootstrap requirement when building environment for debian based systems."
echo "--use-mirror - optional, use mirror URL to fetch resources, when available."
- echo "--jobs N - optional, restrict to N jobs."
+ echo "--ubuntu-repo - optional, override the Ubuntu apt repository base URL."
+ echo "--debian-repo - optional, override the Debian apt repository base URL."
+ echo "--alpine-repo - optional, override the Alpine Linux repository base URL."
+ echo "--jobs N (or --use-jobs N) - optional, restrict to N jobs."
exit 1
}
@@ -88,8 +91,9 @@ __FreeBSDPackages+=" terminfo-db"
__OpenBSDVersion="7.8"
__OpenBSDPackages="heimdal-libs"
__OpenBSDPackages+=" icu4c"
-__OpenBSDPackages+=" inotify-tools"
+__OpenBSDPackages+=" libinotify"
__OpenBSDPackages+=" openssl"
+__OpenBSDPackages+=" e2fsprogs"
__IllumosPackages="icu"
__IllumosPackages+=" mit-krb5"
@@ -143,6 +147,9 @@ __KeyringFile="/usr/share/keyrings/ubuntu-archive-keyring.gpg"
__SkipSigCheck=0
__SkipEmulation=0
__UseMirror=0
+__UbuntuRepoOverride=
+__DebianRepoOverride=
+__AlpineRepoOverride=
__UnprocessedBuildArgs=
while :; do
@@ -396,6 +403,31 @@ while :; do
--use-mirror)
__UseMirror=1
;;
+ --ubuntu-repo|-ubuntu-repo)
+ shift
+ if [[ "$#" -le 0 ]]; then
+ echo "ERROR: --ubuntu-repo requires a URL argument."
+ usage
+ fi
+ __UbuntuRepoOverride="$1"
+ ;;
+ --debian-repo|-debian-repo)
+ shift
+ if [[ "$#" -le 0 ]]; then
+ echo "ERROR: --debian-repo requires a URL argument."
+ usage
+ fi
+ __DebianRepoOverride="$1"
+ ;;
+ --alpine-repo|-alpine-repo)
+ shift
+ if [[ "$#" -le 0 ]]; then
+ echo "ERROR: --alpine-repo requires a URL argument."
+ usage
+ fi
+ __AlpineRepoOverride="$1"
+ ;;
+ # Removed duplicate/invalid option handling block (was breaking case statement parsing).
--use-jobs)
shift
MAXJOBS=$1
@@ -445,6 +477,12 @@ if [[ -z "$__UbuntuRepo" ]]; then
__UbuntuRepo="https://ports.ubuntu.com/"
fi
+if [[ -n "$__UbuntuRepoOverride" && "$__KeyringFile" == *ubuntu* ]]; then
+ __UbuntuRepo="$__UbuntuRepoOverride"
+elif [[ -n "$__DebianRepoOverride" && "$__KeyringFile" == *debian* ]]; then
+ __UbuntuRepo="$__DebianRepoOverride"
+fi
+
if [[ -n "$__LLVM_MajorVersion" ]]; then
__UbuntuPackages+=" libclang-common-${__LLVM_MajorVersion}${__LLVM_MinorVersion:+.$__LLVM_MinorVersion}-dev"
fi
@@ -485,6 +523,7 @@ if [[ "$__CodeName" == "alpine" ]]; then
__ApkToolsDir="$(mktemp -d)"
__ApkKeysDir="$(mktemp -d)"
arch="$(uname -m)"
+ __AlpineRepo="${__AlpineRepoOverride:-https://dl-cdn.alpinelinux.org/alpine}"
ensureDownloadTool
@@ -529,15 +568,15 @@ if [[ "$__CodeName" == "alpine" ]]; then
# initialize DB
# shellcheck disable=SC2086
"$__ApkToolsDir/apk.static" \
- -X "https://dl-cdn.alpinelinux.org/alpine/$version/main" \
- -X "https://dl-cdn.alpinelinux.org/alpine/$version/community" \
+ -X "$__AlpineRepo/$version/main" \
+ -X "$__AlpineRepo/$version/community" \
-U $__ApkSignatureArg --root "$__RootfsDir" --arch "$__AlpineArch" --initdb add
if [[ "$__AlpineLlvmLibsLookup" == 1 ]]; then
# shellcheck disable=SC2086
__AlpinePackages+=" $("$__ApkToolsDir/apk.static" \
- -X "https://dl-cdn.alpinelinux.org/alpine/$version/main" \
- -X "https://dl-cdn.alpinelinux.org/alpine/$version/community" \
+ -X "$__AlpineRepo/$version/main" \
+ -X "$__AlpineRepo/$version/community" \
-U $__ApkSignatureArg --root "$__RootfsDir" --arch "$__AlpineArch" \
search 'llvm*-libs' | grep -E '^llvm' | sort | tail -1 | sed 's/-[^-]*//2g')"
fi
@@ -545,8 +584,8 @@ if [[ "$__CodeName" == "alpine" ]]; then
# install all packages in one go
# shellcheck disable=SC2086
"$__ApkToolsDir/apk.static" \
- -X "https://dl-cdn.alpinelinux.org/alpine/$version/main" \
- -X "https://dl-cdn.alpinelinux.org/alpine/$version/community" \
+ -X "$__AlpineRepo/$version/main" \
+ -X "$__AlpineRepo/$version/community" \
-U $__ApkSignatureArg --root "$__RootfsDir" --arch "$__AlpineArch" $__NoEmulationArg \
add $__AlpinePackages
diff --git a/eng/common/cross/install-debs.py b/eng/common/cross/install-debs.py
index 20ca770a1e21..1d1dfabf7dc9 100644
--- a/eng/common/cross/install-debs.py
+++ b/eng/common/cross/install-debs.py
@@ -121,10 +121,14 @@ async def fetch_release_file(session, mirror, suite, keyring):
await download_file(session, release_gpg_url, release_gpg_file.name)
print("Verifying signature of Release with Release.gpg.")
- verify_command = ["gpg"]
+ # Use gpgv rather than gpg for verification. gpgv verifies a detached
+ # signature against a fixed keyring without involving gpg-agent or
+ # keyboxd, which makes it robust on hosts running GnuPG 2.4+ (e.g. Azure
+ # Linux) where "gpg --keyring" routes through keyboxd and can fail.
+ verify_command = ["gpgv"]
if keyring:
verify_command += ["--keyring", keyring]
- verify_command += ["--verify", release_gpg_file.name, release_file.name]
+ verify_command += [release_gpg_file.name, release_file.name]
result = subprocess.run(verify_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.returncode != 0:
diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake
index 99d6dfe82dde..ead7fe3ef263 100644
--- a/eng/common/cross/toolchain.cmake
+++ b/eng/common/cross/toolchain.cmake
@@ -59,9 +59,9 @@ elseif(TARGET_ARCH_NAME STREQUAL "arm64")
set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu")
endif()
elseif(FREEBSD)
- set(triple "aarch64-unknown-freebsd12")
+ set(TOOLCHAIN "aarch64-unknown-freebsd14")
elseif(OPENBSD)
- set(triple "aarch64-unknown-openbsd")
+ set(TOOLCHAIN "aarch64-unknown-openbsd")
endif()
elseif(TARGET_ARCH_NAME STREQUAL "armel")
set(CMAKE_SYSTEM_PROCESSOR armv7l)
@@ -117,9 +117,9 @@ elseif(TARGET_ARCH_NAME STREQUAL "x64")
set(TIZEN_TOOLCHAIN "x86_64-tizen-linux-gnu")
endif()
elseif(FREEBSD)
- set(triple "x86_64-unknown-freebsd12")
+ set(TOOLCHAIN "x86_64-unknown-freebsd14")
elseif(OPENBSD)
- set(triple "x86_64-unknown-openbsd")
+ set(TOOLCHAIN "x86_64-unknown-openbsd")
elseif(ILLUMOS)
set(TOOLCHAIN "x86_64-illumos")
elseif(HAIKU)
@@ -160,8 +160,6 @@ if(TIZEN)
find_toolchain_dir("${CROSS_ROOTFS}/usr/lib64/gcc/${TIZEN_TOOLCHAIN}")
endif()
- message(STATUS "TIZEN_TOOLCHAIN_PATH set to: ${TIZEN_TOOLCHAIN_PATH}")
-
include_directories(SYSTEM ${TIZEN_TOOLCHAIN_PATH}/include/c++)
include_directories(SYSTEM ${TIZEN_TOOLCHAIN_PATH}/include/c++/${TIZEN_TOOLCHAIN})
endif()
@@ -206,9 +204,9 @@ if(ANDROID)
include(${CROSS_ROOTFS}/../build/cmake/android.toolchain.cmake)
elseif(FREEBSD OR OPENBSD)
# we cross-compile by instructing clang
- set(CMAKE_C_COMPILER_TARGET ${triple})
- set(CMAKE_CXX_COMPILER_TARGET ${triple})
- set(CMAKE_ASM_COMPILER_TARGET ${triple})
+ set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN})
+ set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN})
+ set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN})
set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=lld")
diff --git a/eng/common/dotnet-install.ps1 b/eng/common/dotnet-install.ps1
index 50ae62737687..b6d45f2bdc43 100644
--- a/eng/common/dotnet-install.ps1
+++ b/eng/common/dotnet-install.ps1
@@ -4,13 +4,16 @@ Param(
[string] $architecture = '',
[string] $version = 'Latest',
[string] $runtime = 'dotnet',
+ [string] $dotnetPath = '',
[string] $RuntimeSourceFeed = '',
[string] $RuntimeSourceFeedKey = ''
)
. $PSScriptRoot\tools.ps1
-if (-not [string]::IsNullOrEmpty($env:DOTNET_GLOBAL_INSTALL_DIR)) {
+if (-not [string]::IsNullOrEmpty($dotnetPath)) {
+ $dotnetRoot = $dotnetPath
+} elseif (-not [string]::IsNullOrEmpty($env:DOTNET_GLOBAL_INSTALL_DIR)) {
$dotnetRoot = $env:DOTNET_GLOBAL_INSTALL_DIR
} else {
$dotnetRoot = Join-Path $RepoRoot '.dotnet'
diff --git a/eng/common/dotnet-install.sh b/eng/common/dotnet-install.sh
index 1cb3f5abac28..58a7e6f384e2 100755
--- a/eng/common/dotnet-install.sh
+++ b/eng/common/dotnet-install.sh
@@ -16,6 +16,7 @@ scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
version='Latest'
architecture=''
runtime='dotnet'
+dotnetPath=''
runtimeSourceFeed=''
runtimeSourceFeedKey=''
while [[ $# -gt 0 ]]; do
@@ -33,6 +34,10 @@ while [[ $# -gt 0 ]]; do
shift
runtime="$1"
;;
+ -dotnetpath)
+ shift
+ dotnetPath="$1"
+ ;;
-runtimesourcefeed)
shift
runtimeSourceFeed="$1"
@@ -80,7 +85,9 @@ case $cpuname in
;;
esac
-if [[ -n "${DOTNET_GLOBAL_INSTALL_DIR:-}" ]]; then
+if [[ -n "${dotnetPath:-}" ]]; then
+ dotnetRoot="$dotnetPath"
+elif [[ -n "${DOTNET_GLOBAL_INSTALL_DIR:-}" ]]; then
dotnetRoot="$DOTNET_GLOBAL_INSTALL_DIR"
else
dotnetRoot="${repo_root}.dotnet"
diff --git a/eng/common/native/NativeAotSupported.props b/eng/common/native/NativeAotSupported.props
index 559a6663929e..cdff9ef03612 100644
--- a/eng/common/native/NativeAotSupported.props
+++ b/eng/common/native/NativeAotSupported.props
@@ -13,6 +13,8 @@
<_NativeAotSupportedArch Condition="
'$(TargetArchitecture)' != 'wasm' and
+ '$(TargetArchitecture)' != 's390x' and
+ '$(TargetArchitecture)' != 'ppc64le' and
('$(TargetArchitecture)' != 'x86' or '$(TargetOS)' == 'windows')
">true
diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1
index de32a6da3770..6f664ad890ba 100644
--- a/eng/common/tools.ps1
+++ b/eng/common/tools.ps1
@@ -432,11 +432,31 @@ function InitializeVisualStudioMSBuild([object]$vsRequirements = $null) {
$msbuildVersionDir = if ([int]$vsMajorVersion -lt 16) { "$vsMajorVersion.0" } else { "Current" }
$local:BinFolder = Join-Path $vsInstallDir "MSBuild\$msbuildVersionDir\Bin"
- $local:Prefer64bit = if (Get-Member -InputObject $vsRequirements -Name 'Prefer64bit') { $vsRequirements.Prefer64bit } else { $false }
- if ($local:Prefer64bit -and (Test-Path(Join-Path $local:BinFolder "amd64"))) {
- $global:_MSBuildExe = Join-Path $local:BinFolder "amd64\msbuild.exe"
- } else {
- $global:_MSBuildExe = Join-Path $local:BinFolder "msbuild.exe"
+
+ # Use the MSBuild matching the host's process architecture (e.g. amd64 or arm64),
+ # falling back to the 32-bit MSBuild in the root Bin folder when no matching subfolder exists.
+
+ # Determine the architecture of the current process, accounting for a 32-bit process
+ # running on a 64-bit OS (PROCESSOR_ARCHITEW6432 holds the real machine architecture).
+ $local:ProcessArchitecture = $env:PROCESSOR_ARCHITECTURE
+ if (($local:ProcessArchitecture -eq 'x86') -and ($env:PROCESSOR_ARCHITEW6432)) {
+ $local:ProcessArchitecture = $env:PROCESSOR_ARCHITEW6432
+ }
+
+ # Map the architecture to the corresponding MSBuild subfolder. The 32-bit MSBuild lives in the
+ # root Bin folder, so x86 maps to an empty subfolder.
+ $local:MSBuildArchSubFolder = switch ($local:ProcessArchitecture) {
+ 'AMD64' { 'amd64' }
+ 'ARM64' { 'arm64' }
+ default { '' }
+ }
+
+ $global:_MSBuildExe = Join-Path $local:BinFolder "msbuild.exe"
+ if ($local:MSBuildArchSubFolder) {
+ $local:ArchMSBuildExe = Join-Path $local:BinFolder (Join-Path $local:MSBuildArchSubFolder "msbuild.exe")
+ if (Test-Path $local:ArchMSBuildExe) {
+ $global:_MSBuildExe = $local:ArchMSBuildExe
+ }
}
return $global:_MSBuildExe
@@ -531,6 +551,16 @@ function LocateVisualStudio([object]$vsRequirements = $null){
}
function InitializeBuildTool() {
+ # Allow a caller (e.g. a bootstrap script running out-of-proc) to inject the build tool via
+ # environment variables instead of the in-proc $global:_BuildTool variable. Only Path and
+ # Command are consumed by the MSBuild function below, so those are all that's needed.
+ if ($env:_BuildToolPath) {
+ return $global:_BuildTool = @{
+ Path = $env:_BuildToolPath
+ Command = $env:_BuildToolCommand
+ }
+ }
+
if (Test-Path variable:global:_BuildTool) {
# If the requested msbuild parameters do not match, clear the cached variables.
if($global:_BuildTool.Contains('ExcludePrereleaseVS') -and $global:_BuildTool.ExcludePrereleaseVS -ne $excludePrereleaseVS) {
@@ -558,7 +588,7 @@ function InitializeBuildTool() {
}
$dotnetPath = Join-Path $dotnetRoot (GetExecutableFileName 'dotnet')
- $buildTool = @{ Path = $dotnetPath; Command = 'msbuild'; Tool = 'dotnet'; Framework = 'net' }
+ $buildTool = @{ Path = $dotnetPath; Command = 'msbuild' }
} elseif ($msbuildEngine -eq "vs") {
try {
$msbuildPath = InitializeVisualStudioMSBuild
@@ -567,7 +597,7 @@ function InitializeBuildTool() {
ExitWithExitCode 1
}
- $buildTool = @{ Path = $msbuildPath; Command = ""; Tool = "vs"; Framework = "netframework"; ExcludePrereleaseVS = $excludePrereleaseVS }
+ $buildTool = @{ Path = $msbuildPath; Command = ""; ExcludePrereleaseVS = $excludePrereleaseVS }
} else {
Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Unexpected value of -msbuildEngine: '$msbuildEngine'."
ExitWithExitCode 1
@@ -706,7 +736,7 @@ function InitializeToolset() {
}
function ExitWithExitCode([int] $exitCode) {
- if ($ci -and $prepareMachine) {
+ if ($prepareMachine) {
Stop-Processes
}
exit $exitCode
@@ -741,13 +771,6 @@ function MSBuild() {
Write-PipelineTelemetryError -Category 'Build' -Message 'Binary log must be enabled in CI build, or explicitly opted-out from with the -excludeCIBinarylog switch.'
ExitWithExitCode 1
}
-
- # Node reuse must be disabled in CI builds unless explicitly opted in via MSBUILD_NODEREUSE_ENABLED.
- # Internal testing only; this env var will be replaced with a switch (https://github.com/dotnet/arcade/issues/17013) and must not be depended on.
- if ($nodeReuse -and $env:MSBUILD_NODEREUSE_ENABLED -ne "1") {
- Write-PipelineTelemetryError -Category 'Build' -Message 'Node reuse must be disabled in CI build.'
- ExitWithExitCode 1
- }
}
$buildTool = InitializeBuildTool
@@ -789,11 +812,6 @@ function MSBuild() {
# The build already logged an error, that's the reason it failed. Producing an error here only adds noise.
Write-Host "Build failed with exit code $exitCode. Check errors above." -ForegroundColor Red
- $buildLog = GetMSBuildBinaryLogCommandLineArgument $args
- if ($null -ne $buildLog) {
- Write-Host "See log: $buildLog" -ForegroundColor DarkGray
- }
-
# When running on Azure Pipelines, override the returned exit code to avoid double logging.
# Skip this when the build is a child of the VMR build.
if ($ci -and $env:SYSTEM_TEAMPROJECT -ne $null -and !$fromVMR) {
@@ -841,23 +859,6 @@ function DotNet() {
}
}
-function GetMSBuildBinaryLogCommandLineArgument($arguments) {
- foreach ($argument in $arguments) {
- if ($argument -ne $null) {
- $arg = $argument.Trim()
- if ($arg.StartsWith('/bl:', "OrdinalIgnoreCase")) {
- return $arg.Substring('/bl:'.Length)
- }
-
- if ($arg.StartsWith('/binaryLogger:', 'OrdinalIgnoreCase')) {
- return $arg.Substring('/binaryLogger:'.Length)
- }
- }
- }
-
- return $null
-}
-
function GetExecutableFileName($baseName) {
if (IsWindowsPlatform) {
return "$baseName.exe"
diff --git a/eng/common/tools.sh b/eng/common/tools.sh
index 05f9edd0aae8..347a29b8884f 100755
--- a/eng/common/tools.sh
+++ b/eng/common/tools.sh
@@ -353,6 +353,15 @@ function GetDotNetInstallScript {
}
function InitializeBuildTool {
+ # Allow a caller (e.g. a bootstrap script running out-of-proc) to inject the build tool via
+ # environment variables instead of the in-proc _InitializeBuildTool variable. Only the tool path and
+ # command are consumed by the MSBuild function below, so those are all that's needed.
+ if [[ -n "${_BuildToolPath:-}" ]]; then
+ _InitializeBuildTool="$_BuildToolPath"
+ _InitializeBuildToolCommand="$_BuildToolCommand"
+ return
+ fi
+
if [[ -n "${_InitializeBuildTool:-}" ]]; then
return
fi
@@ -423,7 +432,7 @@ function InitializeToolset {
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)
+ found_config=$(find "$repo_root" -maxdepth 1 -type f -iname nuget.config | head -n 1)
if [[ -n "$found_config" ]]; then
nuget_config="$found_config"
@@ -457,7 +466,7 @@ function InitializeToolset {
}
function ExitWithExitCode {
- if [[ "$ci" == true && "$prepare_machine" == true ]]; then
+ if [[ "$prepare_machine" == true ]]; then
StopProcesses
fi
exit $1
@@ -466,7 +475,8 @@ function ExitWithExitCode {
function StopProcesses {
echo "Killing running build processes..."
pkill -9 "dotnet" || true
- pkill -9 "vbcscompiler" || true
+ pkill -9 -i -x VBCSCompiler || true
+ pkill -9 -i -x MSBuild || true
return 0
}
@@ -493,14 +503,7 @@ function DotNet {
function MSBuild {
if [[ "$ci" == true ]]; then
if [[ "$binary_log" != true && "$exclude_ci_binary_log" != true ]]; then
- Write-PipelineTelemetryError -category 'Build' "Binary log must be enabled in CI build, or explicitly opted-out from with the -noBinaryLog switch."
- ExitWithExitCode 1
- fi
-
- # Node reuse must be disabled in CI builds unless explicitly opted in via MSBUILD_NODEREUSE_ENABLED.
- # Internal testing only; this env var will be replaced with a switch (https://github.com/dotnet/arcade/issues/17013) and must not be depended on.
- if [[ "$node_reuse" == true && "${MSBUILD_NODEREUSE_ENABLED:-}" != "1" ]]; then
- Write-PipelineTelemetryError -category 'Build' "Node reuse must be disabled in CI build."
+ Write-PipelineTelemetryError -category 'Build' "Binary log must be enabled in CI build, or explicitly opted-out from with the --excludeCIBinarylog switch."
ExitWithExitCode 1
fi
fi
diff --git a/global.json b/global.json
index ec9b58e80156..c1d546d17859 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"tools": {
- "dotnet": "11.0.100-preview.6.26325.125"
+ "dotnet": "11.0.100-preview.7.26365.101"
},
"sdk": {
"paths": [
@@ -11,7 +11,7 @@
"msbuild-sdks": {
"MSBuild.Sdk.Extras": "3.0.44",
"Microsoft.Build.NoTargets": "3.7.0",
- "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26330.112",
- "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26330.112"
+ "Microsoft.DotNet.Arcade.Sdk": "11.0.0-beta.26365.101",
+ "Microsoft.DotNet.Helix.Sdk": "11.0.0-beta.26365.101"
}
}
diff --git a/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.Common.targets b/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.Common.targets
index fda8a5093d4e..f5529e79bf7f 100644
--- a/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.Common.targets
+++ b/src/Controls/src/Build.Tasks/nuget/buildTransitive/netstandard2.0/Microsoft.Maui.Controls.Common.targets
@@ -3,7 +3,7 @@
<_IsHotRestartDefined>$([System.Text.RegularExpressions.Regex]::IsMatch('$(DefineConstants.Trim())', '(^|;)HOTRESTART($|;)'))
HOTRESTART;$(DefineConstants)
-
bool _wasDetachedFromWindow = false;
CarouselViewLoopManager _carouselViewLoopManager;
CancellationTokenSource _scrollDebounce;
+ internal int DragStartPosition { get; private set; } = -1;
// We need to keep track of the old views to update the visual states
// if this is null we are not attached to the window
@@ -112,14 +113,14 @@ void BoundsSizeChanged()
public override void DraggingStarted(UIScrollView scrollView)
{
- // _isDragging = true;
+ DragStartPosition = ItemsView?.Position ?? -1;
ItemsView?.SetIsDragging(true);
}
public override void DraggingEnded(UIScrollView scrollView, bool willDecelerate)
{
+ DragStartPosition = -1;
ItemsView?.SetIsDragging(false);
- //_isDragging = false;
}
public override void UpdateItemsSource()
diff --git a/src/Controls/src/Core/Handlers/Items2/iOS/LayoutFactory2.cs b/src/Controls/src/Core/Handlers/Items2/iOS/LayoutFactory2.cs
index 311d660d7249..909117fbd747 100644
--- a/src/Controls/src/Core/Handlers/Items2/iOS/LayoutFactory2.cs
+++ b/src/Controls/src/Core/Handlers/Items2/iOS/LayoutFactory2.cs
@@ -646,6 +646,43 @@ CGPoint ScrollSingle(SnapPointsAlignment alignment, CGPoint proposedContentOffse
var contentOffset = CollectionView.ContentOffset;
var viewport = new CGRect(contentOffset, CollectionView.Bounds.Size);
+ var carouselController = (CollectionView.Delegate as CarouselViewDelegator2)?.ViewController;
+ if (carouselController?.DragStartPosition is >= 0)
+ {
+ var currentIndexPath = carouselController.GetScrollToIndexPath(carouselController.DragStartPosition);
+ var itemCount = (int)CollectionView.NumberOfItemsInSection(currentIndexPath.Section);
+ if (itemCount > 0)
+ {
+ var velocity = Configuration.ScrollDirection == UICollectionViewScrollDirection.Horizontal
+ ? scrollingVelocity.X
+ : scrollingVelocity.Y;
+
+ if (velocity != 0)
+ {
+ var targetItem = (int)currentIndexPath.Item;
+
+ if (velocity > 0)
+ targetItem++;
+ else
+ targetItem--;
+
+ targetItem = Math.Clamp(targetItem, 0, itemCount - 1);
+ var targetIndexPath = NSIndexPath.FromItemSection(targetItem, currentIndexPath.Section);
+ var targetItemAttributes = LayoutAttributesForItem(targetIndexPath);
+
+ if (targetItemAttributes is not null)
+ {
+ return Items.SnapHelpers.AdjustContentOffset(
+ CollectionView.ContentOffset,
+ targetItemAttributes.Frame,
+ viewport,
+ alignment,
+ Configuration.ScrollDirection);
+ }
+ }
+ }
+ }
+
// Find the spot in the viewport we're trying to align with
var alignmentTarget = Items.SnapHelpers.FindAlignmentTarget(alignment, contentOffset, CollectionView, Configuration.ScrollDirection);
diff --git a/src/TestUtils/src/DeviceTests/AssertionExtensions.iOS.cs b/src/TestUtils/src/DeviceTests/AssertionExtensions.iOS.cs
index e5c9c109cc34..4eac5a1b12fe 100644
--- a/src/TestUtils/src/DeviceTests/AssertionExtensions.iOS.cs
+++ b/src/TestUtils/src/DeviceTests/AssertionExtensions.iOS.cs
@@ -18,6 +18,8 @@ namespace Microsoft.Maui.DeviceTests
{
public static partial class AssertionExtensions
{
+ const int PixelComponentCount = 4;
+
public static async Task WaitForKeyboardToShow(this UIView view, int timeout = 1000)
{
await AssertEventually(() => KeyboardAutoManagerScroll.IsKeyboardShowing, timeout: timeout, message: $"Timed out waiting for {view} to show keyboard").ConfigureAwait(false);
@@ -273,26 +275,9 @@ public static UIColor ColorAtPoint(this UIImage bitmap, int x, int y)
public static byte[] GetPixel(this UIImage bitmap, int x, int y)
{
- var cgImage = bitmap.CGImage!;
- var width = cgImage.Width;
- var height = cgImage.Height;
- var colorSpace = CGColorSpace.CreateDeviceRGB();
- var bitsPerComponent = 8;
- var bytesPerRow = 4 * width;
- var componentCount = 4;
+ var dataBytes = GetPixelData(bitmap, out _, out _, out var bytesPerRow);
- var dataBytes = new byte[width * height * componentCount];
-
- using var context = new CGBitmapContext(
- dataBytes,
- width, height,
- bitsPerComponent, bytesPerRow,
- colorSpace,
- CGBitmapFlags.ByteOrder32Big | CGBitmapFlags.PremultipliedLast);
-
- context.DrawImage(new CGRect(0, 0, width, height), cgImage);
-
- var pixelLocation = (bytesPerRow * y) + componentCount * x;
+ var pixelLocation = (bytesPerRow * y) + PixelComponentCount * x;
var pixel = new byte[]
{
@@ -305,6 +290,28 @@ public static byte[] GetPixel(this UIImage bitmap, int x, int y)
return pixel;
}
+ static byte[] GetPixelData(UIImage bitmap, out int width, out int height, out int bytesPerRow)
+ {
+ var cgImage = bitmap.CGImage!;
+ width = (int)cgImage.Width;
+ height = (int)cgImage.Height;
+ bytesPerRow = PixelComponentCount * width;
+
+ var dataBytes = new byte[width * height * PixelComponentCount];
+ using var colorSpace = CGColorSpace.CreateDeviceRGB();
+ using var context = new CGBitmapContext(
+ dataBytes,
+ width,
+ height,
+ 8,
+ bytesPerRow,
+ colorSpace,
+ CGBitmapFlags.ByteOrder32Big | CGBitmapFlags.PremultipliedLast);
+
+ context.DrawImage(new CGRect(0, 0, width, height), cgImage);
+ return dataBytes;
+ }
+
public static UIImage AssertColorAtPoint(this UIImage bitmap, UIColor expectedColor, int x, int y, double? tolerance = null)
{
var cap = bitmap.ColorAtPoint(x, y);
@@ -420,18 +427,25 @@ public static Task AssertContainsColor(this UIImage image, Graphics.Col
public static Task AssertContainsColor(this UIImage bitmap, UIColor expectedColor, Func? withinRectModifier = null, double? tolerance = null)
{
- return Task.Run(() =>
- {
- var imageRect = new Graphics.RectF(0, 0, (float)bitmap.Size.Width.Value, (float)bitmap.Size.Height.Value);
+ var pixelData = GetPixelData(bitmap, out _, out _, out var bytesPerRow);
+ expectedColor.GetRGBA(out var red, out var green, out var blue, out var alpha);
+ var colorTolerance = tolerance ?? 0.000001;
+ var imageRect = new Graphics.RectF(0, 0, (float)bitmap.Size.Width.Value, (float)bitmap.Size.Height.Value);
- if (withinRectModifier is not null)
- imageRect = withinRectModifier.Invoke(imageRect);
+ if (withinRectModifier is not null)
+ imageRect = withinRectModifier.Invoke(imageRect);
+ return Task.Run(() =>
+ {
for (int x = (int)imageRect.X; x < (int)imageRect.Width; x++)
{
for (int y = (int)imageRect.Y; y < (int)imageRect.Height; y++)
{
- if (ColorComparison.ARGBEquivalent(bitmap.ColorAtPoint(x, y), expectedColor, tolerance))
+ var pixelLocation = (bytesPerRow * y) + PixelComponentCount * x;
+ if (Math.Abs(pixelData[pixelLocation] / 255.0 - red) <= colorTolerance
+ && Math.Abs(pixelData[pixelLocation + 1] / 255.0 - green) <= colorTolerance
+ && Math.Abs(pixelData[pixelLocation + 2] / 255.0 - blue) <= colorTolerance
+ && Math.Abs(pixelData[pixelLocation + 3] / 255.0 - alpha) <= colorTolerance)
{
return bitmap;
}
@@ -1000,7 +1014,7 @@ static IEnumerable FindAllDescendantViews(UIView view) where T : UIView
{
if (subview is T typed)
yield return typed;
-
+
foreach (var descendant in FindAllDescendantViews(subview))
yield return descendant;
}
diff --git a/src/TestUtils/src/Microsoft.Maui.IntegrationTests/Utilities/BuildWarningsUtilities.cs b/src/TestUtils/src/Microsoft.Maui.IntegrationTests/Utilities/BuildWarningsUtilities.cs
index dd3826703566..b4b022c29ad7 100644
--- a/src/TestUtils/src/Microsoft.Maui.IntegrationTests/Utilities/BuildWarningsUtilities.cs
+++ b/src/TestUtils/src/Microsoft.Maui.IntegrationTests/Utilities/BuildWarningsUtilities.cs
@@ -190,26 +190,6 @@ public static void AssertWarnings(this List actualWarnings, Lis
},
}
},
- new WarningsPerFile
- {
- File = "ILC",
- WarningsPerCode = new List
- {
- new WarningsPerCode
- {
- Code = "IL3050",
- Messages = new List
- {
- "Microsoft.Android.Runtime.AndroidReflectionJniValueManager.AndroidReflectionJniValueManager(): Using member 'Java.Interop.JniRuntime.ReflectionJniValueManager.ReflectionJniValueManager()' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. This JniValueManager implementation is not compatible with Native AOT. Use a different JniValueManager implementation that supports Native AOT.",
- "Microsoft.Android.Runtime.ManagedTypeManager.ManagedTypeManager(): Using member 'Java.Interop.JniRuntime.ReflectionJniTypeManager.ReflectionJniTypeManager()' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. This JniTypeManager implementation is not compatible with Native AOT. Use a different JniTypeManager implementation that supports Native AOT.",
- "Microsoft.Android.Runtime.ManagedTypeManager.g__MakeGenericType|5_1(Type,Type[]): Using member 'System.Type.MakeGenericType(Type[])' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. The native code for this instantiation might not be available at runtime.",
- "Android.Runtime.JNIEnv.MakeArrayType(Type): Using member 'System.Type.MakeArrayType()' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. The code for an array of the specified type might not be available.",
- "Android.Runtime.JNINativeWrapper.CreateDelegate(Delegate): Using member 'System.Reflection.Emit.DynamicMethod.DynamicMethod(String,Type,Type[],Type,Boolean)' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. Creating a DynamicMethod requires dynamic code.",
- "Java.Interop.JavaConvert.g__MakeGenericType|2_0(Type,Type[]): Using member 'System.Type.MakeGenericType(Type[])' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. The native code for this instantiation might not be available at runtime.",
- }
- },
- }
- },
};
public static List ExpectedNativeAOTWarnings