From 50d64e9464217d922afe7880af9d51e33e44990d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 20:53:39 +0000 Subject: [PATCH 1/8] Initial plan From 12ff3f666c6055a2d6cd3dceaecd424afca8f669 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 20:56:13 +0000 Subject: [PATCH 2/8] Fix case-sensitive path lookup for Performance Toolkit sample app on Linux Use Get-ChildItem -Recurse -Filter instead of hardcoded path with specific casing. This handles the casing change in BC28+ artifacts where 'testframework' became 'TestFramework'. Add tests verifying both casings. Agent-Logs-Url: https://github.com/microsoft/AL-Go/sessions/026d561f-89d6-4df2-9c41-e1f8aff4c2b5 Co-authored-by: mazhelez <43066499+mazhelez@users.noreply.github.com> --- Actions/CreateApp/CreateApp.ps1 | 4 ++-- Tests/CreateApp.Action.Test.ps1 | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Actions/CreateApp/CreateApp.ps1 b/Actions/CreateApp/CreateApp.ps1 index 879c4ff60c..446498b651 100644 --- a/Actions/CreateApp/CreateApp.ps1 +++ b/Actions/CreateApp/CreateApp.ps1 @@ -59,9 +59,9 @@ try { $sampleApp = (Get-Item -Path $sampleApp).FullName } else { - $sampleApp = Join-Path $folders[1] "Applications\testframework\performancetoolkit\Microsoft_Performance Toolkit Samples.app" + $sampleApp = Get-ChildItem -Path $folders[1] -Filter "Microsoft_Performance Toolkit Samples.app" -Recurse | Select-Object -First 1 -ExpandProperty FullName } - if (!(Test-Path -Path $sampleApp)) { + if (!$sampleApp -or !(Test-Path -Path $sampleApp)) { throw "Could not locate sample app for the Business Central version" } diff --git a/Tests/CreateApp.Action.Test.ps1 b/Tests/CreateApp.Action.Test.ps1 index 0094d60f4d..0f53f8c4ab 100644 --- a/Tests/CreateApp.Action.Test.ps1 +++ b/Tests/CreateApp.Action.Test.ps1 @@ -25,4 +25,37 @@ Describe "CreateApp Action Tests" { # Call action + It 'Should find Performance Toolkit sample app regardless of directory casing' { + # Simulate artifact folder structure with varying casing (as seen in BC28+) + $tempDir = Join-Path ([System.IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString()) + $sampleAppDir = Join-Path $tempDir "Applications" "TestFramework" "performancetoolkit" + New-Item -Path $sampleAppDir -ItemType Directory -Force | Out-Null + $sampleAppFile = Join-Path $sampleAppDir "Microsoft_Performance Toolkit Samples.app" + Set-Content -Path $sampleAppFile -Value "dummy" + + # Use the same lookup logic as in CreateApp.ps1 + $result = Get-ChildItem -Path $tempDir -Filter "Microsoft_Performance Toolkit Samples.app" -Recurse | Select-Object -First 1 -ExpandProperty FullName + + $result | Should -Not -BeNullOrEmpty + $result | Should -Be $sampleAppFile + + Remove-Item -Path $tempDir -Recurse -Force + } + + It 'Should find Performance Toolkit sample app with legacy lowercase casing' { + # Simulate artifact folder structure with old casing (pre-BC28) + $tempDir = Join-Path ([System.IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString()) + $sampleAppDir = Join-Path $tempDir "applications" "testframework" "performancetoolkit" + New-Item -Path $sampleAppDir -ItemType Directory -Force | Out-Null + $sampleAppFile = Join-Path $sampleAppDir "Microsoft_Performance Toolkit Samples.app" + Set-Content -Path $sampleAppFile -Value "dummy" + + # Use the same lookup logic as in CreateApp.ps1 + $result = Get-ChildItem -Path $tempDir -Filter "Microsoft_Performance Toolkit Samples.app" -Recurse | Select-Object -First 1 -ExpandProperty FullName + + $result | Should -Not -BeNullOrEmpty + $result | Should -Be $sampleAppFile + + Remove-Item -Path $tempDir -Recurse -Force + } } From 8ae9590b52b78c31b149971e212bca251c25b26d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 20:57:04 +0000 Subject: [PATCH 3/8] Wrap test cleanup in try/finally blocks for reliable temp directory removal Agent-Logs-Url: https://github.com/microsoft/AL-Go/sessions/026d561f-89d6-4df2-9c41-e1f8aff4c2b5 Co-authored-by: mazhelez <43066499+mazhelez@users.noreply.github.com> --- Tests/CreateApp.Action.Test.ps1 | 46 +++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/Tests/CreateApp.Action.Test.ps1 b/Tests/CreateApp.Action.Test.ps1 index 0f53f8c4ab..16c0176261 100644 --- a/Tests/CreateApp.Action.Test.ps1 +++ b/Tests/CreateApp.Action.Test.ps1 @@ -28,34 +28,40 @@ Describe "CreateApp Action Tests" { It 'Should find Performance Toolkit sample app regardless of directory casing' { # Simulate artifact folder structure with varying casing (as seen in BC28+) $tempDir = Join-Path ([System.IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString()) - $sampleAppDir = Join-Path $tempDir "Applications" "TestFramework" "performancetoolkit" - New-Item -Path $sampleAppDir -ItemType Directory -Force | Out-Null - $sampleAppFile = Join-Path $sampleAppDir "Microsoft_Performance Toolkit Samples.app" - Set-Content -Path $sampleAppFile -Value "dummy" + try { + $sampleAppDir = Join-Path $tempDir "Applications" "TestFramework" "performancetoolkit" + New-Item -Path $sampleAppDir -ItemType Directory -Force | Out-Null + $sampleAppFile = Join-Path $sampleAppDir "Microsoft_Performance Toolkit Samples.app" + Set-Content -Path $sampleAppFile -Value "dummy" - # Use the same lookup logic as in CreateApp.ps1 - $result = Get-ChildItem -Path $tempDir -Filter "Microsoft_Performance Toolkit Samples.app" -Recurse | Select-Object -First 1 -ExpandProperty FullName + # Use the same lookup logic as in CreateApp.ps1 + $result = Get-ChildItem -Path $tempDir -Filter "Microsoft_Performance Toolkit Samples.app" -Recurse | Select-Object -First 1 -ExpandProperty FullName - $result | Should -Not -BeNullOrEmpty - $result | Should -Be $sampleAppFile - - Remove-Item -Path $tempDir -Recurse -Force + $result | Should -Not -BeNullOrEmpty + $result | Should -Be $sampleAppFile + } + finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } } It 'Should find Performance Toolkit sample app with legacy lowercase casing' { # Simulate artifact folder structure with old casing (pre-BC28) $tempDir = Join-Path ([System.IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString()) - $sampleAppDir = Join-Path $tempDir "applications" "testframework" "performancetoolkit" - New-Item -Path $sampleAppDir -ItemType Directory -Force | Out-Null - $sampleAppFile = Join-Path $sampleAppDir "Microsoft_Performance Toolkit Samples.app" - Set-Content -Path $sampleAppFile -Value "dummy" + try { + $sampleAppDir = Join-Path $tempDir "applications" "testframework" "performancetoolkit" + New-Item -Path $sampleAppDir -ItemType Directory -Force | Out-Null + $sampleAppFile = Join-Path $sampleAppDir "Microsoft_Performance Toolkit Samples.app" + Set-Content -Path $sampleAppFile -Value "dummy" - # Use the same lookup logic as in CreateApp.ps1 - $result = Get-ChildItem -Path $tempDir -Filter "Microsoft_Performance Toolkit Samples.app" -Recurse | Select-Object -First 1 -ExpandProperty FullName + # Use the same lookup logic as in CreateApp.ps1 + $result = Get-ChildItem -Path $tempDir -Filter "Microsoft_Performance Toolkit Samples.app" -Recurse | Select-Object -First 1 -ExpandProperty FullName - $result | Should -Not -BeNullOrEmpty - $result | Should -Be $sampleAppFile - - Remove-Item -Path $tempDir -Recurse -Force + $result | Should -Not -BeNullOrEmpty + $result | Should -Be $sampleAppFile + } + finally { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } } } From 58e10fba17d1ddada19a1b30fe69b62202a2cac8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 21:01:25 +0000 Subject: [PATCH 4/8] Add release notes for Performance Toolkit case-sensitive path fix Agent-Logs-Url: https://github.com/microsoft/AL-Go/sessions/cabdbf3f-0b63-44e6-880f-0d10fd46ce1a Co-authored-by: mazhelez <43066499+mazhelez@users.noreply.github.com> --- RELEASENOTES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7e98ef896c..08c485272b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -26,6 +26,7 @@ The `DownloadProjectDependencies` action now downloads only artifacts from depen - Issue 2211 - Cannot create a release if a project contains only test apps - Issue 2214 - Workspace compilation not working with external dependencies - Issue 2235 - Workspace compilation: only the first `customCodeCops` entry resolved when multiple relative paths were configured. Relative `customCodeCops` paths are now resolved against the project folder before being passed to the compiler. +- Issue 2265 - Creating a Performance Test App on Ubuntu fails due to case-sensitive path lookup in BC28+ artifacts ## v9.0 From bffe34cea3fd5b8372a4454e9486c479c4c9ff0f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 21:03:38 +0000 Subject: [PATCH 5/8] Update release notes description to clarify Linux case-sensitivity issue Agent-Logs-Url: https://github.com/microsoft/AL-Go/sessions/72b80c91-f56a-4f9b-ba24-6c11625a4424 Co-authored-by: mazhelez <43066499+mazhelez@users.noreply.github.com> --- RELEASENOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 08c485272b..48be9fdae3 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -26,7 +26,7 @@ The `DownloadProjectDependencies` action now downloads only artifacts from depen - Issue 2211 - Cannot create a release if a project contains only test apps - Issue 2214 - Workspace compilation not working with external dependencies - Issue 2235 - Workspace compilation: only the first `customCodeCops` entry resolved when multiple relative paths were configured. Relative `customCodeCops` paths are now resolved against the project folder before being passed to the compiler. -- Issue 2265 - Creating a Performance Test App on Ubuntu fails due to case-sensitive path lookup in BC28+ artifacts +- Issue 2265 - Creating a Performance Test App fails on Linux due to case-sensitive path lookup for the Performance Toolkit sample app ## v9.0 From 90741e86cacae21f750088866fbf6d3a604159ca Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 21:20:34 +0000 Subject: [PATCH 6/8] Apply review feedback: add -File/-ErrorAction, improve error message, consolidate tests Agent-Logs-Url: https://github.com/microsoft/AL-Go/sessions/dbb48255-382a-4050-b1ce-8aec40a4c36c Co-authored-by: mazhelez <43066499+mazhelez@users.noreply.github.com> --- Actions/CreateApp/CreateApp.ps1 | 4 ++-- Tests/CreateApp.Action.Test.ps1 | 31 +++++++------------------------ 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/Actions/CreateApp/CreateApp.ps1 b/Actions/CreateApp/CreateApp.ps1 index 446498b651..f9273cadfb 100644 --- a/Actions/CreateApp/CreateApp.ps1 +++ b/Actions/CreateApp/CreateApp.ps1 @@ -59,10 +59,10 @@ try { $sampleApp = (Get-Item -Path $sampleApp).FullName } else { - $sampleApp = Get-ChildItem -Path $folders[1] -Filter "Microsoft_Performance Toolkit Samples.app" -Recurse | Select-Object -First 1 -ExpandProperty FullName + $sampleApp = Get-ChildItem -Path $folders[1] -Filter "Microsoft_Performance Toolkit Samples.app" -File -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName } if (!$sampleApp -or !(Test-Path -Path $sampleApp)) { - throw "Could not locate sample app for the Business Central version" + throw "Could not locate 'Microsoft_Performance Toolkit Samples.app' under '$($folders[1])'" } Extract-AppFileToFolder -appFilename $sampleApp -generateAppJson -appFolder $tmpFolder diff --git a/Tests/CreateApp.Action.Test.ps1 b/Tests/CreateApp.Action.Test.ps1 index 16c0176261..baf4214352 100644 --- a/Tests/CreateApp.Action.Test.ps1 +++ b/Tests/CreateApp.Action.Test.ps1 @@ -25,37 +25,20 @@ Describe "CreateApp Action Tests" { # Call action - It 'Should find Performance Toolkit sample app regardless of directory casing' { - # Simulate artifact folder structure with varying casing (as seen in BC28+) + It 'Should find Performance Toolkit sample app with directory casing' -TestCases @( + @{ Casing = 'PascalCase'; Dirs = @('Applications', 'TestFramework', 'performancetoolkit') } + @{ Casing = 'lowercase'; Dirs = @('applications', 'testframework', 'performancetoolkit') } + ) { + param($Casing, $Dirs) $tempDir = Join-Path ([System.IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString()) try { - $sampleAppDir = Join-Path $tempDir "Applications" "TestFramework" "performancetoolkit" + $sampleAppDir = Join-Path $tempDir $Dirs[0] $Dirs[1] $Dirs[2] New-Item -Path $sampleAppDir -ItemType Directory -Force | Out-Null $sampleAppFile = Join-Path $sampleAppDir "Microsoft_Performance Toolkit Samples.app" Set-Content -Path $sampleAppFile -Value "dummy" # Use the same lookup logic as in CreateApp.ps1 - $result = Get-ChildItem -Path $tempDir -Filter "Microsoft_Performance Toolkit Samples.app" -Recurse | Select-Object -First 1 -ExpandProperty FullName - - $result | Should -Not -BeNullOrEmpty - $result | Should -Be $sampleAppFile - } - finally { - Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue - } - } - - It 'Should find Performance Toolkit sample app with legacy lowercase casing' { - # Simulate artifact folder structure with old casing (pre-BC28) - $tempDir = Join-Path ([System.IO.Path]::GetTempPath()) ([Guid]::NewGuid().ToString()) - try { - $sampleAppDir = Join-Path $tempDir "applications" "testframework" "performancetoolkit" - New-Item -Path $sampleAppDir -ItemType Directory -Force | Out-Null - $sampleAppFile = Join-Path $sampleAppDir "Microsoft_Performance Toolkit Samples.app" - Set-Content -Path $sampleAppFile -Value "dummy" - - # Use the same lookup logic as in CreateApp.ps1 - $result = Get-ChildItem -Path $tempDir -Filter "Microsoft_Performance Toolkit Samples.app" -Recurse | Select-Object -First 1 -ExpandProperty FullName + $result = Get-ChildItem -Path $tempDir -Filter "Microsoft_Performance Toolkit Samples.app" -File -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName $result | Should -Not -BeNullOrEmpty $result | Should -Be $sampleAppFile From dedf5ba8bcb3f6bb4aa8d9bbb61ab9127e2c4066 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 13:34:30 +0000 Subject: [PATCH 7/8] Narrow recursive search to Applications subdirectory to reduce IO Agent-Logs-Url: https://github.com/microsoft/AL-Go/sessions/1dd3763f-00c6-4065-bceb-360c23be65f0 Co-authored-by: mazhelez <43066499+mazhelez@users.noreply.github.com> --- Actions/CreateApp/CreateApp.ps1 | 5 ++++- Tests/CreateApp.Action.Test.ps1 | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Actions/CreateApp/CreateApp.ps1 b/Actions/CreateApp/CreateApp.ps1 index f9273cadfb..b0ee3c2719 100644 --- a/Actions/CreateApp/CreateApp.ps1 +++ b/Actions/CreateApp/CreateApp.ps1 @@ -59,7 +59,10 @@ try { $sampleApp = (Get-Item -Path $sampleApp).FullName } else { - $sampleApp = Get-ChildItem -Path $folders[1] -Filter "Microsoft_Performance Toolkit Samples.app" -File -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName + # Narrow the search to the Applications subdirectory if present, to avoid traversing the entire artifact tree + $searchRoot = Get-ChildItem -Path $folders[1] -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq 'Applications' -or $_.Name -eq 'applications' } | Select-Object -First 1 -ExpandProperty FullName + if (!$searchRoot) { $searchRoot = $folders[1] } + $sampleApp = Get-ChildItem -Path $searchRoot -Filter "Microsoft_Performance Toolkit Samples.app" -File -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName } if (!$sampleApp -or !(Test-Path -Path $sampleApp)) { throw "Could not locate 'Microsoft_Performance Toolkit Samples.app' under '$($folders[1])'" diff --git a/Tests/CreateApp.Action.Test.ps1 b/Tests/CreateApp.Action.Test.ps1 index baf4214352..efcbea05eb 100644 --- a/Tests/CreateApp.Action.Test.ps1 +++ b/Tests/CreateApp.Action.Test.ps1 @@ -37,8 +37,10 @@ Describe "CreateApp Action Tests" { $sampleAppFile = Join-Path $sampleAppDir "Microsoft_Performance Toolkit Samples.app" Set-Content -Path $sampleAppFile -Value "dummy" - # Use the same lookup logic as in CreateApp.ps1 - $result = Get-ChildItem -Path $tempDir -Filter "Microsoft_Performance Toolkit Samples.app" -File -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName + # Use the same lookup logic as in CreateApp.ps1: narrow to Applications subdirectory first + $searchRoot = Get-ChildItem -Path $tempDir -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq 'Applications' -or $_.Name -eq 'applications' } | Select-Object -First 1 -ExpandProperty FullName + if (!$searchRoot) { $searchRoot = $tempDir } + $result = Get-ChildItem -Path $searchRoot -Filter "Microsoft_Performance Toolkit Samples.app" -File -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName $result | Should -Not -BeNullOrEmpty $result | Should -Be $sampleAppFile From 5673cc1e5fe29c035249149583e4317cef753e06 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 12 May 2026 13:35:16 +0000 Subject: [PATCH 8/8] Use -ieq for case-insensitive directory name comparison Agent-Logs-Url: https://github.com/microsoft/AL-Go/sessions/1dd3763f-00c6-4065-bceb-360c23be65f0 Co-authored-by: mazhelez <43066499+mazhelez@users.noreply.github.com> --- Actions/CreateApp/CreateApp.ps1 | 2 +- Tests/CreateApp.Action.Test.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Actions/CreateApp/CreateApp.ps1 b/Actions/CreateApp/CreateApp.ps1 index b0ee3c2719..5b76df1847 100644 --- a/Actions/CreateApp/CreateApp.ps1 +++ b/Actions/CreateApp/CreateApp.ps1 @@ -60,7 +60,7 @@ try { } else { # Narrow the search to the Applications subdirectory if present, to avoid traversing the entire artifact tree - $searchRoot = Get-ChildItem -Path $folders[1] -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq 'Applications' -or $_.Name -eq 'applications' } | Select-Object -First 1 -ExpandProperty FullName + $searchRoot = Get-ChildItem -Path $folders[1] -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -ieq 'Applications' } | Select-Object -First 1 -ExpandProperty FullName if (!$searchRoot) { $searchRoot = $folders[1] } $sampleApp = Get-ChildItem -Path $searchRoot -Filter "Microsoft_Performance Toolkit Samples.app" -File -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName } diff --git a/Tests/CreateApp.Action.Test.ps1 b/Tests/CreateApp.Action.Test.ps1 index efcbea05eb..32424b703b 100644 --- a/Tests/CreateApp.Action.Test.ps1 +++ b/Tests/CreateApp.Action.Test.ps1 @@ -38,7 +38,7 @@ Describe "CreateApp Action Tests" { Set-Content -Path $sampleAppFile -Value "dummy" # Use the same lookup logic as in CreateApp.ps1: narrow to Applications subdirectory first - $searchRoot = Get-ChildItem -Path $tempDir -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq 'Applications' -or $_.Name -eq 'applications' } | Select-Object -First 1 -ExpandProperty FullName + $searchRoot = Get-ChildItem -Path $tempDir -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -ieq 'Applications' } | Select-Object -First 1 -ExpandProperty FullName if (!$searchRoot) { $searchRoot = $tempDir } $result = Get-ChildItem -Path $searchRoot -Filter "Microsoft_Performance Toolkit Samples.app" -File -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty FullName