* Apply a few changes to Get-PRPackageProperties to make it more customizable for our users. Remove wonky gap + extra spacing that should pass the patch application process now that we've manually aligned common.ps1 * account for feedback -- rename CanaryPackages to AdditionalValidationPackages * dependentPackagesforInclusion -> additionalValidationPackages --------- Co-authored-by: Scott Beddall <scbedd@microsoft.com>
215 lines
7.0 KiB
PowerShell
215 lines
7.0 KiB
PowerShell
# Helper functions for retireving useful information from azure-sdk-for-* repo
|
|
. "${PSScriptRoot}\logging.ps1"
|
|
|
|
class PackageProps
|
|
{
|
|
[string]$Name
|
|
[string]$Version
|
|
[string]$DevVersion
|
|
[string]$DirectoryPath
|
|
[string]$ServiceDirectory
|
|
[string]$ReadMePath
|
|
[string]$ChangeLogPath
|
|
[string]$Group
|
|
[string]$SdkType
|
|
[boolean]$IsNewSdk
|
|
[string]$ArtifactName
|
|
[string]$ReleaseStatus
|
|
[string[]]$AdditionalValidationPackages
|
|
|
|
PackageProps([string]$name, [string]$version, [string]$directoryPath, [string]$serviceDirectory)
|
|
{
|
|
$this.Initialize($name, $version, $directoryPath, $serviceDirectory)
|
|
}
|
|
|
|
PackageProps([string]$name, [string]$version, [string]$directoryPath, [string]$serviceDirectory, [string]$group = "")
|
|
{
|
|
$this.Initialize($name, $version, $directoryPath, $serviceDirectory, $group)
|
|
}
|
|
|
|
hidden [void]Initialize(
|
|
[string]$name,
|
|
[string]$version,
|
|
[string]$directoryPath,
|
|
[string]$serviceDirectory
|
|
)
|
|
{
|
|
$this.Name = $name
|
|
$this.Version = $version
|
|
$this.DirectoryPath = $directoryPath
|
|
$this.ServiceDirectory = $serviceDirectory
|
|
|
|
if (Test-Path (Join-Path $directoryPath "README.md"))
|
|
{
|
|
$this.ReadMePath = Join-Path $directoryPath "README.md"
|
|
}
|
|
else
|
|
{
|
|
$this.ReadMePath = $null
|
|
}
|
|
|
|
if (Test-Path (Join-Path $directoryPath "CHANGELOG.md"))
|
|
{
|
|
$this.ChangeLogPath = Join-Path $directoryPath "CHANGELOG.md"
|
|
# Get release date for current version and set in package property
|
|
$changeLogEntry = Get-ChangeLogEntry -ChangeLogLocation $this.ChangeLogPath -VersionString $this.Version
|
|
if ($changeLogEntry -and $changeLogEntry.ReleaseStatus)
|
|
{
|
|
$this.ReleaseStatus = $changeLogEntry.ReleaseStatus.Trim().Trim("()")
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$this.ChangeLogPath = $null
|
|
}
|
|
}
|
|
|
|
hidden [void]Initialize(
|
|
[string]$name,
|
|
[string]$version,
|
|
[string]$directoryPath,
|
|
[string]$serviceDirectory,
|
|
[string]$group
|
|
)
|
|
{
|
|
$this.Initialize($name, $version, $directoryPath, $serviceDirectory)
|
|
$this.Group = $group
|
|
}
|
|
}
|
|
|
|
# Takes package name and service Name
|
|
# Returns important properties of the package relative to the language repo
|
|
# Returns a PS Object with properties @ { pkgName, pkgVersion, pkgDirectoryPath, pkgReadMePath, pkgChangeLogPath }
|
|
# Note: python is required for parsing python package properties.
|
|
function Get-PkgProperties
|
|
{
|
|
Param
|
|
(
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$PackageName,
|
|
[string]$ServiceDirectory
|
|
)
|
|
|
|
$allPkgProps = Get-AllPkgProperties -ServiceDirectory $ServiceDirectory
|
|
$pkgProps = $allPkgProps.Where({ $_.Name -eq $PackageName -or $_.ArtifactName -eq $PackageName });
|
|
|
|
if ($pkgProps.Count -ge 1)
|
|
{
|
|
if ($pkgProps.Count -gt 1)
|
|
{
|
|
Write-Host "Found more than one project with the name [$PackageName], choosing the first one under $($pkgProps[0].DirectoryPath)"
|
|
}
|
|
return $pkgProps[0]
|
|
}
|
|
|
|
LogError "Failed to retrieve Properties for [$PackageName]"
|
|
return $null
|
|
}
|
|
|
|
function Get-PrPkgProperties([string]$InputDiffJson) {
|
|
$packagesWithChanges = @()
|
|
|
|
$allPackageProperties = Get-AllPkgProperties
|
|
$diff = Get-Content $InputDiffJson | ConvertFrom-Json
|
|
$targetedFiles = $diff.ChangedFiles
|
|
|
|
$additionalValidationPackages = @()
|
|
$lookup = @{}
|
|
|
|
foreach ($pkg in $allPackageProperties)
|
|
{
|
|
$pkgDirectory = Resolve-Path "$($pkg.DirectoryPath)"
|
|
$lookupKey = ($pkg.DirectoryPath).Replace($RepoRoot, "").SubString(1)
|
|
$lookup[$lookupKey] = $pkg
|
|
|
|
foreach ($file in $targetedFiles)
|
|
{
|
|
$filePath = Resolve-Path (Join-Path $RepoRoot $file)
|
|
$shouldInclude = $filePath -like "$pkgDirectory*"
|
|
if ($shouldInclude) {
|
|
$packagesWithChanges += $pkg
|
|
|
|
if ($pkg.AdditionalValidationPackages) {
|
|
$additionalValidationPackages += $pkg.AdditionalValidationPackages
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach ($addition in $additionalValidationPackages) {
|
|
$key = $addition.Replace($RepoRoot, "").SubString(1)
|
|
|
|
if ($lookup[$key]) {
|
|
$packagesWithChanges += $lookup[$key]
|
|
}
|
|
}
|
|
|
|
if ($AdditionalValidationPackagesFromPackageSetFn -and (Test-Path "Function:$AdditionalValidationPackagesFromPackageSetFn"))
|
|
{
|
|
$packagesWithChanges += &$AdditionalValidationPackagesFromPackageSetFn $packagesWithChanges $diff
|
|
}
|
|
|
|
return $packagesWithChanges
|
|
}
|
|
|
|
# Takes ServiceName and Repo Root Directory
|
|
# Returns important properties for each package in the specified service, or entire repo if the serviceName is not specified
|
|
# Returns a Table of service key to array values of PS Object with properties @ { pkgName, pkgVersion, pkgDirectoryPath, pkgReadMePath, pkgChangeLogPath }
|
|
function Get-AllPkgProperties ([string]$ServiceDirectory = $null)
|
|
{
|
|
$pkgPropsResult = @()
|
|
|
|
if (Test-Path "Function:Get-AllPackageInfoFromRepo")
|
|
{
|
|
$pkgPropsResult = Get-AllPackageInfoFromRepo -ServiceDirectory $serviceDirectory
|
|
}
|
|
else
|
|
{
|
|
if ([string]::IsNullOrEmpty($ServiceDirectory))
|
|
{
|
|
foreach ($dir in (Get-ChildItem (Join-Path $RepoRoot "sdk") -Directory))
|
|
{
|
|
$pkgPropsResult += Get-PkgPropsForEntireService -serviceDirectoryPath $dir.FullName
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$pkgPropsResult = Get-PkgPropsForEntireService -serviceDirectoryPath (Join-Path $RepoRoot "sdk" $ServiceDirectory)
|
|
}
|
|
}
|
|
|
|
return $pkgPropsResult
|
|
}
|
|
|
|
# Given the metadata url under https://github.com/Azure/azure-sdk/tree/main/_data/releases/latest,
|
|
# the function will return the csv metadata back as part of the response.
|
|
function Get-CSVMetadata ([string]$MetadataUri=$MetadataUri)
|
|
{
|
|
$metadataResponse = Invoke-RestMethod -Uri $MetadataUri -method "GET" -MaximumRetryCount 3 -RetryIntervalSec 10 | ConvertFrom-Csv
|
|
return $metadataResponse
|
|
}
|
|
|
|
function Get-PkgPropsForEntireService ($serviceDirectoryPath)
|
|
{
|
|
$projectProps = @() # Properties from every project in the service
|
|
$serviceDirectory = $serviceDirectoryPath -replace '^.*[\\/]+sdk[\\/]+([^\\/]+).*$', '$1'
|
|
|
|
if (!$GetPackageInfoFromRepoFn -or !(Test-Path "Function:$GetPackageInfoFromRepoFn"))
|
|
{
|
|
LogError "The function for '$GetPackageInfoFromRepoFn' was not found.`
|
|
Make sure it is present in eng/scripts/Language-Settings.ps1 and referenced in eng/common/scripts/common.ps1.`
|
|
See https://github.com/Azure/azure-sdk-tools/blob/main/doc/common/common_engsys.md#code-structure"
|
|
}
|
|
|
|
foreach ($directory in (Get-ChildItem $serviceDirectoryPath -Directory))
|
|
{
|
|
$pkgProps = &$GetPackageInfoFromRepoFn $directory.FullName $serviceDirectory
|
|
if ($null -ne $pkgProps)
|
|
{
|
|
$projectProps += $pkgProps
|
|
}
|
|
}
|
|
|
|
return $projectProps
|
|
}
|