mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 03:37:59 +01:00
157 lines
5.8 KiB
PowerShell
157 lines
5.8 KiB
PowerShell
Param(
|
|
# Using the default value of 1.7 for winAppSdkVersionNumber and useExperimentalVersion as false
|
|
[Parameter(Mandatory=$False,Position=1)]
|
|
[string]$winAppSdkVersionNumber = "1.7",
|
|
|
|
# When the pipeline calls the PS1 file, the passed parameters are converted to string type
|
|
[Parameter(Mandatory=$False,Position=2)]
|
|
[boolean]$useExperimentalVersion = $False,
|
|
|
|
# Root folder Path for processing
|
|
[Parameter(Mandatory=$False,Position=3)]
|
|
[string]$rootPath = $(Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path)),
|
|
|
|
# Root folder Path for processing
|
|
[Parameter(Mandatory=$False,Position=4)]
|
|
[string]$sourceLink = "https://microsoft.pkgs.visualstudio.com/ProjectReunion/_packaging/Project.Reunion.nuget.internal/nuget/v3/index.json"
|
|
)
|
|
|
|
|
|
|
|
function Read-FileWithEncoding {
|
|
param (
|
|
[string]$Path
|
|
)
|
|
|
|
$reader = New-Object System.IO.StreamReader($Path, $true) # auto-detect encoding
|
|
$content = $reader.ReadToEnd()
|
|
$encoding = $reader.CurrentEncoding
|
|
$reader.Close()
|
|
|
|
return [PSCustomObject]@{
|
|
Content = $content
|
|
Encoding = $encoding
|
|
}
|
|
}
|
|
|
|
function Write-FileWithEncoding {
|
|
param (
|
|
[string]$Path,
|
|
[string]$Content,
|
|
[System.Text.Encoding]$Encoding
|
|
)
|
|
|
|
$writer = New-Object System.IO.StreamWriter($Path, $false, $Encoding)
|
|
$writer.Write($Content)
|
|
$writer.Close()
|
|
}
|
|
|
|
# Execute nuget list and capture the output
|
|
if ($useExperimentalVersion) {
|
|
# The nuget list for experimental versions will cost more time
|
|
# So, we will not use -AllVersions to wast time
|
|
# But it can only get the latest experimental version
|
|
Write-Host "Fetching WindowsAppSDK with experimental versions"
|
|
$nugetOutput = nuget list Microsoft.WindowsAppSDK `
|
|
-Source $sourceLink `
|
|
-Prerelease
|
|
# Filter versions based on the specified version prefix
|
|
$escapedVersionNumber = [regex]::Escape($winAppSdkVersionNumber)
|
|
$filteredVersions = $nugetOutput | Where-Object { $_ -match "Microsoft.WindowsAppSDK $escapedVersionNumber\." }
|
|
$latestVersions = $filteredVersions
|
|
} else {
|
|
Write-Host "Fetching stable WindowsAppSDK versions for $winAppSdkVersionNumber"
|
|
$nugetOutput = nuget list Microsoft.WindowsAppSDK `
|
|
-Source $sourceLink `
|
|
-AllVersions
|
|
# Filter versions based on the specified version prefix
|
|
$escapedVersionNumber = [regex]::Escape($winAppSdkVersionNumber)
|
|
$filteredVersions = $nugetOutput | Where-Object { $_ -match "Microsoft.WindowsAppSDK $escapedVersionNumber\." }
|
|
$latestVersions = $filteredVersions | Sort-Object { [version]($_ -split ' ')[1] } -Descending | Select-Object -First 1
|
|
}
|
|
|
|
Write-Host "Latest versions found: $latestVersions"
|
|
# Extract the latest version number from the output
|
|
$latestVersion = $latestVersions -split "`n" | `
|
|
Select-String -Pattern 'Microsoft.WindowsAppSDK\s*([0-9]+\.[0-9]+\.[0-9]+-*[a-zA-Z0-9]*)' | `
|
|
ForEach-Object { $_.Matches[0].Groups[1].Value } | `
|
|
Sort-Object -Descending | `
|
|
Select-Object -First 1
|
|
|
|
if ($latestVersion) {
|
|
$WinAppSDKVersion = $latestVersion
|
|
Write-Host "Extracted version: $WinAppSDKVersion"
|
|
Write-Host "##vso[task.setvariable variable=WinAppSDKVersion]$WinAppSDKVersion"
|
|
} else {
|
|
Write-Host "Failed to extract version number from nuget list output"
|
|
exit 1
|
|
}
|
|
|
|
# Resolve dependencies for 1.8+
|
|
$packageVersions = @{ "Microsoft.WindowsAppSDK" = $WinAppSDKVersion }
|
|
|
|
if ($WinAppSDKVersion -match "^1\.8") {
|
|
Write-Host "Version $WinAppSDKVersion detected. Resolving split dependencies..."
|
|
$installDir = Join-Path $rootPath "localpackages\output"
|
|
New-Item -ItemType Directory -Path $installDir -Force | Out-Null
|
|
|
|
$nugetConfig = Join-Path $rootPath "nuget.config"
|
|
|
|
try {
|
|
# Download package to inspect nuspec and keep it for the build
|
|
$nugetArgs = "install Microsoft.WindowsAppSDK -Version $WinAppSDKVersion -ConfigFile ""$nugetConfig"" -OutputDirectory $installDir -NonInteractive -NoCache"
|
|
Invoke-Expression "nuget $nugetArgs" | Out-Null
|
|
|
|
# Parse dependencies from the installed folders
|
|
# Folder structure is typically {PackageId}.{Version}
|
|
$directories = Get-ChildItem -Path $installDir -Directory
|
|
foreach ($dir in $directories) {
|
|
if ($dir.Name -match "^(Microsoft\.WindowsAppSDK.*?)\.(\d.*)$") {
|
|
$pkgId = $Matches[1]
|
|
$pkgVer = $Matches[2]
|
|
$packageVersions[$pkgId] = $pkgVer
|
|
Write-Host "Found dependency: $pkgId = $pkgVer"
|
|
}
|
|
}
|
|
} catch {
|
|
Write-Warning "Failed to resolve dependencies: $_"
|
|
}
|
|
}
|
|
|
|
# Update Directory.Packages.props file
|
|
Get-ChildItem -Path $rootPath -Recurse "Directory.Packages.props" | ForEach-Object {
|
|
$file = Read-FileWithEncoding -Path $_.FullName
|
|
$content = $file.Content
|
|
$isModified = $false
|
|
|
|
foreach ($pkgId in $packageVersions.Keys) {
|
|
$ver = $packageVersions[$pkgId]
|
|
# Escape dots in package ID for regex
|
|
$pkgIdRegex = $pkgId -replace '\.', '\.'
|
|
|
|
$newVersionString = "<PackageVersion Include=""$pkgId"" Version=""$ver"" />"
|
|
$oldVersionString = "<PackageVersion Include=""$pkgIdRegex"" Version=""[-.0-9a-zA-Z]*"" />"
|
|
|
|
if ($content -match "<PackageVersion Include=""$pkgIdRegex""") {
|
|
# Update existing package
|
|
if ($content -notmatch [regex]::Escape($newVersionString)) {
|
|
$content = $content -replace $oldVersionString, $newVersionString
|
|
$isModified = $true
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($isModified) {
|
|
Write-FileWithEncoding -Path $_.FullName -Content $content -Encoding $file.encoding
|
|
Write-Host "Modified " $_.FullName
|
|
}
|
|
}
|
|
|
|
if ($installDir -and (Test-Path $installDir)) {
|
|
Write-Host "Cleaning up installed packages..."
|
|
Remove-Item -Path $installDir -Recurse -Force
|
|
}
|
|
|
|
|
|
|