eng/scripts/BulkUpdatePackagePlannedDates.ps1 (103 lines of code) (raw):

[CmdletBinding()] param( [string]$CSVPath = $null, [string]$pkgFilter = $null ) #Requires -Version 7.0 Set-StrictMode -Version 3 if (!(Get-Command az -ErrorAction SilentlyContinue)) { Write-Error 'You must have the Azure CLI installed: https://aka.ms/azure-cli' exit 1 } az account show *> $null if (!$?) { Write-Host 'Running az login...' az login *> $null } az extension show -n azure-devops *> $null if (!$?){ Write-Host 'Installing azure-devops extension' az extension add --name azure-devops } . (Join-Path $PSScriptRoot .. common scripts SemVer.ps1) . (Join-Path $PSScriptRoot .. common scripts Helpers DevOps-WorkItem-Helpers.ps1) . (Join-Path $PSScriptRoot PackageList-Helpers.ps1) CheckDevOpsAccess $unchangedPkgList = Get-CombinedPackageListForPlannedVersions $pkgFilter $uniqueName = "" if (!$CSVPath) { $uniqueName = "plannedpackages_$([System.IO.Path]::GetRandomFileName()).csv" $CSVPath = $uniqueName $seedString = "Seeded CSV file with existing packages " if ($pkgFilter) { $seedString += "that match '$pkgFilter' " } $seedString += "and opening it in excel." Write-Host $seedString Write-Host " - Provide PlannedVersion (X.Y.Z[-beta.N]) and PlannedDate (MM/dd/yyyy) values for each package." Write-Host " - If you adding a brand new package not in the list add a new row and fill in all field values." Write-Host " - If you want to add multiple planned versions and dates for a package duplicate the entire" Write-Host " row and only update the PlannedVersion and PlannedDate for each row." Write-Host " - Delete or leave Planned fields empty for any packages you don't want to add planned dates." Write-Host "Once done editing save the file and close excel..." $unchangedPkgList | ConvertTo-CSV -NoTypeInformation -UseQuotes Always | Out-File $CSVPath -encoding ascii Start-Process -wait excel -argumentlist $CSVPath } $changedPkgList = Get-Content $CSVPath | ConvertFrom-Csv | Where-Object { if (!$_.PlannedDate -or !$_.PlannedVersion) { return $false } $pkgName = $_.Package $pkgPlannedVersion = $_.PlannedVersion $pkgPlannedDate = $_.PlannedDate $parsedVersion = new-object AzureEngSemanticVersion($pkgPlannedVersion) if (!$parsedVersion.IsSemVerFormat) { Write-Host "Skipping update for $pkgName as the version format is incorrect $pkgPlannedVersion" return $false } $matchingPkg = $unchangedPkgList.Where({ if ($pkgName -ne $_.Package) { return $false } if (($pkgPlannedDate -as [DateTime]) -ne ($_.PlannedDate -as [DateTime])) { return $false } if ($pkgPlannedVersion -ne $_.PlannedVersion) { return $false } return $true }) if ($matchingPkg.Count -gt 0) { return $false } Write-Host "$pkgName has changes $pkgPlannedVersion $pkgPlannedDate" return $true } if (!$changedPkgList -or $changedPkgList.Count -eq 0) { Write-Host "Didn't find any packages with a planned version and date in [$CSVPath]." if ($uniqueName) { Write-Host "In some cases excel is delayed in saving a file so if you made changes try re-running the script passing in the file like:" Write-Host ".\eng\scripts\BulkUpdatePackagePlannedDates.ps1 $CSVPath" } exit 0 } foreach ($pkg in $changedPkgList) { Write-Host "Updating package $($pkg.Package) with planned version $($pkg.PlannedVersion) on $($pkg.PlannedDate)" $plannedVersion = [AzureEngSemanticVersion]::ParseVersionString($pkg.PlannedVersion) if (!$plannedVersion) { Write-Warning "Skipping because version '$($pkg.PlannedVersion)' is not a valid version." continue } $verMajorMinor = "" + $plannedVersion.Major + "." + $plannedVersion.Minor $packageInfo = [PSCustomObject][ordered]@{ Package = $pkg.Package DisplayName = $pkg.DisplayName ServiceName = $pkg.ServiceName RepoPath = $pkg.RepoPath Type = $pkg.Type New = $pkg.New }; $plannedVersions = @( [PSCustomObject][ordered]@{ Type = $plannedVersion.VersionType Version = $plannedVersion.RawVersion Date = ([DateTime]$pkg.PlannedDate).ToString("MM/dd/yyyy") } ) $pkgWI = FindOrCreateClonePackageWorkItem $pkg.Language $packageInfo $verMajorMinor -outputCommand $false $pkgWI = UpdatePackageVersions $pkgWI -plannedVersions $plannedVersions Write-Host "https://dev.azure.com/azure-sdk/Release/_workitems/edit/$($pkgWI.id)/" }