From df0f25975a85ad9a39e17550849f53cf6b1d31ed Mon Sep 17 00:00:00 2001 From: James Ruskin Date: Thu, 4 Jul 2024 10:51:27 +0100 Subject: [PATCH] (maint) Adds Get-GitHubRepositoryFileContent script This can be used to improve performance of any update that requires you to grab the content of a file from a repository, e.g. a changelog. --- scripts/Get-GitHubRelease.ps1 | 2 +- scripts/Get-GitHubRepositoryFileContent.ps1 | 65 +++++++++++++++++++++ scripts/au_extensions.psm1 | 1 + 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 scripts/Get-GitHubRepositoryFileContent.ps1 diff --git a/scripts/Get-GitHubRelease.ps1 b/scripts/Get-GitHubRelease.ps1 index a71bd922dc4..1084cb82ee9 100644 --- a/scripts/Get-GitHubRelease.ps1 +++ b/scripts/Get-GitHubRelease.ps1 @@ -16,7 +16,7 @@ [Parameter(Mandatory, Position = 1)] [string]$Name, - # The Name of the tag to get the relase for. Will default to the latest release. + # The Name of the tag to get the release for. Will default to the latest release. [string]$TagName, # GitHub token, used to reduce rate-limiting or access private repositories (needs repo scope) diff --git a/scripts/Get-GitHubRepositoryFileContent.ps1 b/scripts/Get-GitHubRepositoryFileContent.ps1 new file mode 100644 index 00000000000..a70a762ec3e --- /dev/null +++ b/scripts/Get-GitHubRepositoryFileContent.ps1 @@ -0,0 +1,65 @@ +function Get-GitHubRepositoryFileContent { + <# + .Synopsis + Returns the content of a given file in a repository via the REST API + + .Link + https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28 + + .Example + Get-GitHubRepositoryFileContent Kubernetes Kubernetes CHANGELOG/README.md + + .Notes + Seems to be a lot faster than IWRing raw files. + #> + [CmdletBinding()] + param( + # The owner of the repository + [Parameter(Mandatory)] + [string]$Owner, + + # The repository containing the file + [Parameter(Mandatory)] + [string]$Repository, + + # The path to the file within the repository + [Parameter(ValueFromPipeline)] + [string]$Path, + + # The branch, tag, or reference to get the content from. Defaults to the repository's default branch. + [Alias('ref', 'Tag')] + [string]$Branch, + + # Returns the raw response + [switch]$Raw + ) + process { + $restArgs = @{ + Uri = "https://api.github.com/repos/$($Owner)/$($Repository)/contents/$($Path.TrimStart('/'))" + Headers = @{ + 'Accept' = 'application/vnd.github+json' + 'X-GitHub-Api-Version' = '2022-11-28' + } + } + if ($Branch) { + $restArgs.Body = @{ref = $Branch} + } + if ($env:github_api_key) { + $restArgs.Headers.Authorization = "Bearer $($env:github_api_key)" + } + + $Result = Invoke-RestMethod @restArgs -UseBasicParsing + + if ($Raw) { + $Result + } elseif ($Result.encoding -eq 'base64') { + # Assumption made about the file being UTF8, here + [System.Text.Encoding]::UTF8.GetString( + [System.Convert]::FromBase64String($Result.content) + ) + } else { + Write-Warning "$($Path) encoded as '$($Result.encoding)'" + $Result.content + } + } +} diff --git a/scripts/au_extensions.psm1 b/scripts/au_extensions.psm1 index aa8af62f54a..3053bbac914 100644 --- a/scripts/au_extensions.psm1 +++ b/scripts/au_extensions.psm1 @@ -9,6 +9,7 @@ $funcs = @( 'Clear-DependenciesList' 'Get-AllGitHubReleases' 'Get-GitHubRelease' + 'Get-GitHubRepositoryFileContent' 'Set-DescriptionFromReadme' 'Update-ChangelogVersion' 'Update-OnETagChanged'