eng/common/scripts/Update-DocsMsPackages.ps1 (98 lines of code) (raw):

<# .SYNOPSIS Update docs.microsoft.com CI configuration with provided metadata .DESCRIPTION Update docs.microsoft.com CI configuration with metadata in the docs.microsoft.com repo's /metadata folder. The docs.microsoft.com repo's /metadata folder allows onboarding of packages which have not released to a central package manager. * Onboard new packages, update existing tracked packages, leave other packages in place. (This is implemented on a per-language basis by $UpdateDocsMsPackagesFn) .PARAMETER DocRepoLocation Location of the docs.microsoft.com reference docs repo. .PARAMETER PackageSourceOverride Optional parameter to supply a different package source (useful for daily dev docs generation from pacakges which are not published to the default feed). This variable is meant to be used in the domain-specific business logic in &$UpdateDocsMsPackagesFn #> param ( [Parameter(Mandatory = $true)] [string] $DocRepoLocation, # the location of the cloned doc repo [Parameter(Mandatory = $false)] [string] $PackageSourceOverride ) . (Join-Path $PSScriptRoot common.ps1) . "$PSScriptRoot/../../scripts/docs/Docs-Onboarding.ps1" Set-StrictMode -Version 3 function GetMetadata($moniker) { $jsonFiles = Get-ChildItem -Path (Join-Path $DocRepoLocation "metadata/$moniker") -Filter *.json $metadata = @() foreach ($jsonFile in $jsonFiles) { # Converting to a hashtable gives more beneficial semantics for handling # metadata (easier to check existence of property, easier to add new # properties) $metadata += Get-Content $jsonFile -Raw | ConvertFrom-Json -AsHashtable } return $metadata } function PackageIsValidForDocsOnboarding($package) { if (!(Test-Path "Function:$ValidateDocsMsPackagesFn")) { return $true } return &$ValidateDocsMsPackagesFn ` -PackageInfo $package ` -DocRepoLocation $DocRepoLocation } $MONIKERS = @('latest', 'preview', 'legacy') foreach ($moniker in $MONIKERS) { try { Write-Host "Onboarding packages for moniker: $moniker" $metadata = GetMetadata $moniker $alreadyOnboardedPackages = &$GetDocsPackagesAlreadyOnboarded $DocRepoLocation $moniker # Sort the metadata entries by package name so that the output is # deterministic (more simple diffs) $sortedMetadata = $metadata | Sort-Object -Property '_DocsOnboardingOrdinal', 'Name' $outputPackages = @() foreach ($package in $sortedMetadata) { $packageIdentity = $package.Name if (Test-Path "Function:$GetPackageIdentity") { $packageIdentity = &$GetPackageIdentity $package } if (!($alreadyOnboardedPackages.ContainsKey($packageIdentity))) { Write-Host "Evaluating package for onboarding: $($packageIdentity)" if ($package.ContainsKey('_SkipDocsValidation') -and $true -eq $package['_SkipDocsValidation']) { Write-Host "Skip validation for package: $($packageIdentity)" } elseif (!(PackageIsValidForDocsOnboarding $package)) { LogWarning "Skip adding package that did not pass validation: $($packageIdentity)" continue } Write-Host "Add new package: $($packageIdentity)@$($package.Version)" $outputPackages += $package continue } $oldPackage = $alreadyOnboardedPackages[$packageIdentity] if ($oldPackage.Version -ne $package.Version) { if (!(PackageIsValidForDocsOnboarding $package)) { LogWarning "Omitting package that failed validation: $($packageIdentity)@$($package.Version)" continue } Write-Host "Update package: $($packageIdentity)@$($oldPackage.Version) to $($packageIdentity)@$($package.Version)" $outputPackages += $package continue } Write-Host "Unchanged package: $($packageIdentity)@$($package.Version)" $outputPackages += $package } &$SetDocsPackageOnboarding $moniker $outputPackages $DocRepoLocation $PackageSourceOverride } catch { Write-Host "Error onboarding packages for moniker: $moniker" Write-Host "Error: $_" Write-Host "Stacktrace: $($_.ScriptStackTrace)" Write-Error $_ exit 1 } } exit 0