Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
088c59f
Shell route templates: spec + standalone prototype (28 passing tests)
mattleibow Apr 23, 2026
aeb7df4
feat: Shell route templates with {param} path parameters
mattleibow Apr 23, 2026
70f6e52
fix: address review feedback — reject unsupported syntax, fix param l…
mattleibow Apr 23, 2026
098f360
feat: optional params, catch-all, constraints, mixed segments, defaul…
mattleibow Apr 23, 2026
5ad6986
test: add 19 combination tests for full feature coverage
mattleibow Apr 23, 2026
78b0d83
fix: address review round 2 — parser bugs, validation, and missing tests
mattleibow Apr 23, 2026
4e23a99
fix: review round 3 — template lookup bypass, SetRoute mutation, Full…
mattleibow Apr 23, 2026
a24b721
fix: review round 4 — IL2111 trimmer, stale ResolvedRoute, intermedia…
mattleibow Apr 24, 2026
e90ef3d
fix: review round 5 — strengthen tests, modal reuse path, prefixed pa…
mattleibow Apr 24, 2026
1e9f8ef
fix: CS8618 nullable warnings in Sandbox pages breaking CI Samples tests
mattleibow Apr 24, 2026
e4b3872
Merge branch 'net11.0' into mattleibow/shell-route-templates-spec
kubaflo Jul 6, 2026
9e89f76
Fix deterministic CI scan fingerprint publication (#36913)
PureWeen Jul 30, 2026
62b927c
[ci] Remove duplicate .cab signing entry (#36945)
rmarinho Jul 30, 2026
8935253
Add missing YAML frontmatter to find-regression-risk SKILL.md (#36799)
kubaflo Jul 30, 2026
11bace9
Reset files to net11.0
github-actions[bot] Jul 30, 2026
e45600b
feat: Shell route templates with {param} path parameters (#35110)
kubaflo Jul 30, 2026
c0c5ac3
[Maps] Support custom icons for cluster markers (#36336)
kevin68 Jul 30, 2026
d07c3b2
[automated] Merge branch 'main' => 'net11.0' (#36953)
kubaflo Jul 30, 2026
5199eaa
XAML Hot Reload: Improve incremental generation and coverage (#36730)
Redth Jul 30, 2026
4860ca5
Revert unintended Sandbox sample changes from route-template work (#3…
Copilot Jul 31, 2026
f14056c
[Extensibility] SingleProject: Fix dual-path backend activation and C…
PureWeen Jul 31, 2026
eb1b76f
[Net11][ci-fix-net11] [Android] Fix ShellContent not updating when Co…
SubhikshaSf4851 Jul 31, 2026
4b8b1dd
[Testing] Fix for flaky UITests in Net11 CI (#36977)
TamilarasanSF4853 Jul 31, 2026
75a60f4
Reset files to release/11.0.1xx-preview7
github-actions[bot] Jul 31, 2026
fc1536c
Auto-merge clean inter-branch forward merges (#36875)
PureWeen Jul 31, 2026
c195e7e
Cache Brushes (#36405)
pictos Jul 31, 2026
0ec3da5
Merge release/11.0.1xx-preview7 into automated merge branch
Copilot Jul 31, 2026
7ad533a
[Resizetizer] Invalidate image outputs when platform type changes (#3…
PureWeen Jul 31, 2026
b08e31c
Reset files to net11.0
github-actions[bot] Aug 1, 2026
53bc365
Remove ineffective blanket integration-test retry (#36994)
Copilot Aug 1, 2026
b84104a
Address post-merge review findings on the PR finalize apply step (#36…
PureWeen Aug 1, 2026
7bb2367
[automated] Merge branch 'main' => 'net11.0' (#37001)
kubaflo Aug 1, 2026
a1521ed
Fix bot-opened inter-branch merge policy matching (#36992)
PureWeen Aug 1, 2026
bf67e61
Reset files to net11.0
github-actions[bot] Aug 1, 2026
1f99718
Add Window.StatusBarTheme to control status bar icon appearance on mo…
mattleibow Aug 1, 2026
b088593
Add Avalonia.Controls.Maui support to templates (#35950)
drasticactions Aug 1, 2026
f375c4d
[net11.0] Update dependencies from dnceng/internal/dotnet-optimizatio…
dotnet-maestro[bot] Aug 1, 2026
05c86d2
[NET11][iOS/MacCatalyst] Replace NavigationRenderer with NavigationVi…
Tamilarasan-Paranthaman Aug 1, 2026
c9af845
Merge branch 'net11.0' into merge/main-to-net11.0
kubaflo Aug 1, 2026
ae5d0e9
[automated] Merge branch 'main' => 'net11.0' (#37007)
kubaflo Aug 1, 2026
2e4da84
[Essentials] Passkeys (WebAuthn/FIDO2) Essentials API (#36837)
mattleibow Aug 1, 2026
b2b4f33
[ci-fix-net11] Fix TopTabUnselectedTextVisibleWhenSwitchingTabs visua…
devanathan-vaithiyanathan Aug 1, 2026
36ae93f
[XAML] XIHR: remove the now-dead __version field and StableContentHas…
StephaneDelcroix Aug 1, 2026
f47e6af
[Net11]Improve label mapping performance and ensure complete coverage…
devanathan-vaithiyanathan Aug 1, 2026
594a990
[net11.0] Make pending internal APIs public per .NET 11 TODOs (#36876)
SuthiYuvaraj Aug 1, 2026
b432501
[iOS] Map: Update pin icon when Pin.ImageSource changes at runtime (#…
kevin68 Aug 1, 2026
f2add6c
[ci-fix-net11][WIP] Fix Windows CV2 UITest failures (#36949)
devanathan-vaithiyanathan Aug 2, 2026
2b27472
[ci-fix-net11] Needs review: guard CA1416 iOS platform-availability A…
github-actions[bot] Aug 2, 2026
5d36605
[net11] Templates: remove Blazor render-mode workaround in maui-blazo…
mattleibow Aug 2, 2026
ec6fda3
Merge release/11.0.1xx-preview7 into automated merge branch
Copilot Aug 2, 2026
20c66ed
Merge net11.0 into Preview 7 automated merge branch
Copilot Aug 2, 2026
4cc57c9
Preserve source-only package versions in Preview 7 merge
Copilot Aug 2, 2026
2c2f635
Fix merged device test compilation
Copilot Aug 2, 2026
9dcf1f2
Fix Avalonia template integration restore
Copilot Aug 2, 2026
b553528
Allow Avalonia transitive packages in template tests
Copilot Aug 2, 2026
c119ce3
Allow MicroCom dependency in Avalonia tests
Copilot Aug 2, 2026
1869808
Serialize dispatcher provider unit tests
Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions .github/aw/actions-lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@
"version": "v7.0.1",
"sha": "043fb46d1a93c77aae656e7c1c64a875d1fc6a0a"
},
"github/gh-aw-actions/setup@v0.82.14": {
"github/gh-aw-actions/setup@v0.83.4": {
"repo": "github/gh-aw-actions/setup",
"version": "v0.82.14",
"sha": "b6d1443e05b8716267fa19425b99aa4f12006b4a"
"version": "v0.83.4",
"sha": "e89c65e17eb281bbd5ff2ff9e9199a03e96654c7"
}
}
}
39 changes: 39 additions & 0 deletions .github/policies/resourceManagement.yml
Original file line number Diff line number Diff line change
Expand Up @@ -718,5 +718,44 @@ configuration:
- addLabel:
label: partner/syncfusion
description: Add 'partner/syncfusion' label to issues opened by the Syncfusion partner team
- if:
- payloadType: Pull_Request
- isPullRequest
- isActivitySender:
user: github-actions[bot]
issueAuthor: False
- isAction:
action: Opened
- or:
- and:
- targetsBranch:
branch: net11.0
- titleContains:
pattern: '^\[automated\] Merge branch ''main'' => ''net11\.0''$'
isRegex: True
- and:
- targetsBranch:
branch: release/11.0.1xx-preview7
- titleContains:
pattern: '^\[automated\] Merge branch ''net11\.0'' => ''release/11\.0\.1xx-preview7''$'
isRegex: True
- and:
- targetsBranch:
branch: release/11.0.1xx-rc1
- titleContains:
pattern: '^\[automated\] Merge branch ''net11\.0'' => ''release/11\.0\.1xx-rc1''$'
isRegex: True
- and:
- targetsBranch:
branch: release/11.0.1xx-rc2
- titleContains:
pattern: '^\[automated\] Merge branch ''net11\.0'' => ''release/11\.0\.1xx-rc2''$'
isRegex: True
then:
- approvePullRequest:
comment: Auto-approved automated inter-branch merge.
- enableAutoMerge:
mergeMethod: merge
description: '[Inter-branch merge] Auto-approve and enable auto-merge for exact forward-merge flows'
onFailure:
onSuccess:
193 changes: 192 additions & 1 deletion .github/scripts/Apply-PRFinalize.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ BeforeAll {
'Test-FinalizeIsNoOp',
'Get-FinalizeRecommendation',
'Merge-PreservedTitlePrefix',
'Merge-PreservedBodyPreamble'
'Merge-PreservedBodyPreamble',
'New-ExclusiveTempFile'
)) {
$function = $ast.Find({
$args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst] -and
Expand Down Expand Up @@ -317,3 +318,193 @@ Describe 'Security regressions — AzDO logging-command injection' {
Should -Be '[iOS] new'
}
}

Describe 'New-ExclusiveTempFile' {
BeforeAll {
$script:SandboxDir = Join-Path ([System.IO.Path]::GetTempPath()) "apply-prfinalize-tests-$([System.IO.Path]::GetRandomFileName())"
New-Item -ItemType Directory -Path $script:SandboxDir -Force | Out-Null
$script:OriginalAgentTemp = $env:AGENT_TEMPDIRECTORY
$env:AGENT_TEMPDIRECTORY = $script:SandboxDir
}

AfterAll {
$env:AGENT_TEMPDIRECTORY = $script:OriginalAgentTemp
Remove-Item -LiteralPath $script:SandboxDir -Recurse -Force -ErrorAction SilentlyContinue
}

It 'creates the file inside AGENT_TEMPDIRECTORY when it is set' {
$path = New-ExclusiveTempFile -Prefix 'pr-finalize-body-123'
try {
Test-Path -LiteralPath $path | Should -BeTrue
(Split-Path -Parent $path) | Should -Be $script:SandboxDir
} finally {
Remove-Item -LiteralPath $path -Force -ErrorAction SilentlyContinue
}
}

It 'produces a unique path on each call, so the name is not predictable' {
$a = New-ExclusiveTempFile -Prefix 'pr-finalize-body-123'
$b = New-ExclusiveTempFile -Prefix 'pr-finalize-body-123'
try {
$a | Should -Not -Be $b
} finally {
Remove-Item -LiteralPath $a -Force -ErrorAction SilentlyContinue
Remove-Item -LiteralPath $b -Force -ErrorAction SilentlyContinue
}
}

# These pin the actual finding-#2 behaviour. The earlier version of this test was
# vacuous: it never planted a symlink at a path the helper would try, so a
# predictable-name Set-Content write-through implementation still passed it. The
# -NameGenerator seam forces known candidates so a symlink can be planted precisely.
It 'refuses a pre-planted symlink and leaves its target untouched' {
$secret = Join-Path $script:SandboxDir 'secret-existing.txt'
Set-Content -LiteralPath $secret -Value 'ORIGINAL' -Encoding UTF8

$planted = Join-Path $script:SandboxDir 'pr-finalize-body-123-forced0.md'
New-Item -ItemType SymbolicLink -Path $planted -Target $secret | Out-Null

# $script: scope is required — a plain $i++ inside the scriptblock would mutate a
# local copy, so every attempt would re-request the planted name.
$script:ForcedIndex = 0
$path = New-ExclusiveTempFile -Prefix 'pr-finalize-body-123' -NameGenerator {
$n = "forced$($script:ForcedIndex)"; $script:ForcedIndex++; $n
}
try {
# It must have skipped the planted path entirely...
$path | Should -Not -Be $planted
'REPLACEMENT BODY' | Set-Content -LiteralPath $path -Encoding UTF8
# ...so the symlink target is untouched, and the link is still a link.
(Get-Content -Raw -LiteralPath $secret).Trim() | Should -Be 'ORIGINAL'
(Get-Item -LiteralPath $planted).LinkType | Should -Be 'SymbolicLink'
(Get-Content -Raw -LiteralPath $path).Trim() | Should -Be 'REPLACEMENT BODY'
} finally {
Remove-Item -LiteralPath $path -Force -ErrorAction SilentlyContinue
Remove-Item -LiteralPath $planted -Force -ErrorAction SilentlyContinue
}
}

It 'refuses a dangling pre-planted symlink rather than creating its target' {
$missingTarget = Join-Path $script:SandboxDir 'never-created.txt'
$planted = Join-Path $script:SandboxDir 'pr-finalize-body-123-dangle0.md'
New-Item -ItemType SymbolicLink -Path $planted -Target $missingTarget | Out-Null

$script:DangleIndex = 0
$path = New-ExclusiveTempFile -Prefix 'pr-finalize-body-123' -NameGenerator {
$n = "dangle$($script:DangleIndex)"; $script:DangleIndex++; $n
}
try {
$path | Should -Not -Be $planted
'REPLACEMENT BODY' | Set-Content -LiteralPath $path -Encoding UTF8
# Writing through a dangling link would have created the target.
Test-Path -LiteralPath $missingTarget | Should -BeFalse
} finally {
Remove-Item -LiteralPath $path -Force -ErrorAction SilentlyContinue
Remove-Item -LiteralPath $planted -Force -ErrorAction SilentlyContinue
}
}

It 'throws instead of falling back to a predictable path when every candidate is occupied' {
$secret = Join-Path $script:SandboxDir 'secret-exhaust.txt'
Set-Content -LiteralPath $secret -Value 'ORIGINAL' -Encoding UTF8

$planted = 0..4 | ForEach-Object {
$link = Join-Path $script:SandboxDir "pr-finalize-body-123-exhaust$_.md"
New-Item -ItemType SymbolicLink -Path $link -Target $secret | Out-Null
$link
}

try {
$script:ExhaustIndex = 0
{ New-ExclusiveTempFile -Prefix 'pr-finalize-body-123' -NameGenerator {
$n = "exhaust$($script:ExhaustIndex)"; $script:ExhaustIndex++; $n
} } | Should -Throw -ExpectedMessage '*after 5 attempts*'
# No fallback path was written, so the symlink target is still intact.
(Get-Content -Raw -LiteralPath $secret).Trim() | Should -Be 'ORIGINAL'
} finally {
$planted | ForEach-Object { Remove-Item -LiteralPath $_ -Force -ErrorAction SilentlyContinue }
}
}

It 'tries exactly MaxAttempts candidates before giving up' {
$secret = Join-Path $script:SandboxDir 'secret-count.txt'
Set-Content -LiteralPath $secret -Value 'ORIGINAL' -Encoding UTF8
$planted = 0..4 | ForEach-Object {
$link = Join-Path $script:SandboxDir "pr-finalize-body-123-count$_.md"
New-Item -ItemType SymbolicLink -Path $link -Target $secret | Out-Null
$link
}

try {
$script:Calls = 0
{ New-ExclusiveTempFile -Prefix 'pr-finalize-body-123' -NameGenerator { $n = "count$($script:Calls)"; $script:Calls++; $n } } |
Should -Throw
$script:Calls | Should -Be 5
} finally {
$planted | ForEach-Object { Remove-Item -LiteralPath $_ -Force -ErrorAction SilentlyContinue }
}
}

It 'surfaces a non-collision failure immediately instead of retrying it away' {
# A missing base directory can never be resolved by picking another name, so it must
# propagate rather than be masked by the generic "after N attempts" message.
$saved = $env:AGENT_TEMPDIRECTORY
$env:AGENT_TEMPDIRECTORY = $script:SandboxDir
try {
$script:Calls = 0
{ New-ExclusiveTempFile -Prefix 'missing-dir/nope/body' -NameGenerator { $script:Calls++; 'x' } } |
Should -Throw -ExpectedMessage '*Could not find a part of the path*'
$script:Calls | Should -Be 1
} finally {
$env:AGENT_TEMPDIRECTORY = $saved
}
}

It 'ignores AGENT_TEMPDIRECTORY when it points at a file rather than a directory' {
$saved = $env:AGENT_TEMPDIRECTORY
$asFile = Join-Path $script:SandboxDir 'not-a-directory.txt'
Set-Content -LiteralPath $asFile -Value 'x' -Encoding UTF8
$env:AGENT_TEMPDIRECTORY = $asFile
try {
$path = New-ExclusiveTempFile -Prefix 'pr-finalize-body-123'
try {
Test-Path -LiteralPath $path | Should -BeTrue
(Split-Path -Parent $path) | Should -Not -Be $asFile
} finally {
Remove-Item -LiteralPath $path -Force -ErrorAction SilentlyContinue
}
} finally {
$env:AGENT_TEMPDIRECTORY = $saved
}
}

It 'falls back to the system temp directory when AGENT_TEMPDIRECTORY is unset' {
$saved = $env:AGENT_TEMPDIRECTORY
$env:AGENT_TEMPDIRECTORY = $null
try {
$path = New-ExclusiveTempFile -Prefix 'pr-finalize-body-123'
try {
Test-Path -LiteralPath $path | Should -BeTrue
} finally {
Remove-Item -LiteralPath $path -Force -ErrorAction SilentlyContinue
}
} finally {
$env:AGENT_TEMPDIRECTORY = $saved
}
}

It 'ignores AGENT_TEMPDIRECTORY when it points at a missing directory' {
$saved = $env:AGENT_TEMPDIRECTORY
$env:AGENT_TEMPDIRECTORY = Join-Path $script:SandboxDir 'does-not-exist'
try {
$path = New-ExclusiveTempFile -Prefix 'pr-finalize-body-123'
try {
Test-Path -LiteralPath $path | Should -BeTrue
} finally {
Remove-Item -LiteralPath $path -Force -ErrorAction SilentlyContinue
}
} finally {
$env:AGENT_TEMPDIRECTORY = $saved
}
}
}
Loading
Loading