From ae6439ff6e0b4761183950c104dd473e9c90f6b7 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Thu, 4 Jan 2024 06:18:35 +0100 Subject: [PATCH] Sync fetch-configlet.ps1 script (#165) --- bin/fetch-configlet.ps1 | 52 +++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/bin/fetch-configlet.ps1 b/bin/fetch-configlet.ps1 index 8960c3d..a7896b2 100644 --- a/bin/fetch-configlet.ps1 +++ b/bin/fetch-configlet.ps1 @@ -1,24 +1,42 @@ -Function DownloadUrl ([string] $FileName, $Headers) { - $latestUrl = "https://api.github.com/repos/exercism/configlet/releases/latest" - $json = Invoke-RestMethod -Headers $Headers -Uri $latestUrl - $json.assets | Where-Object { $_.browser_download_url -match $FileName } | Select-Object -ExpandProperty browser_download_url -} +# This file is a copy of the +# https://github.com/exercism/configlet/blob/main/scripts/fetch-configlet.ps1 file. +# Please submit bugfixes/improvements to the above file to ensure that all tracks +# benefit from the changes. -Function Headers { - If ($GITHUB_TOKEN) { @{ Authorization = "Bearer ${GITHUB_TOKEN}" } } Else { @{ } } +$ErrorActionPreference = "Stop" +$ProgressPreference = "SilentlyContinue" + +$requestOpts = @{ + Headers = If ($env:GITHUB_TOKEN) { @{ Authorization = "Bearer ${env:GITHUB_TOKEN}" } } Else { @{ } } + MaximumRetryCount = 3 + RetryIntervalSec = 1 } -Function Arch { - If ([Environment]::Is64BitOperatingSystem) { "64bit" } Else { "32bit" } +Function Get-DownloadUrl { + $arch = If ([Environment]::Is64BitOperatingSystem) { "x86-64" } Else { "i386" } + $latestUrl = "https://api.github.com/repos/exercism/configlet/releases/latest" + Invoke-RestMethod -Uri $latestUrl -PreserveAuthorizationOnRedirect @requestOpts ` + | Select-Object -ExpandProperty assets ` + | Where-Object { $_.name -match "^configlet_.+_windows_${arch}.zip$" } ` + | Select-Object -ExpandProperty browser_download_url -First 1 } -$arch = Arch -$headers = Headers -$fileName = "configlet-windows-$arch.zip" $outputDirectory = "bin" -$outputFile = Join-Path -Path $outputDirectory -ChildPath $fileName -$zipUrl = DownloadUrl -FileName $fileName -Headers $headers +if (!(Test-Path -Path $outputDirectory)) { + Write-Output "Error: no ./bin directory found. This script should be ran from a repo root." + exit 1 +} + +Write-Output "Fetching configlet..." +$downloadUrl = Get-DownloadUrl +$outputFileName = "configlet.zip" +$outputPath = Join-Path -Path $outputDirectory -ChildPath $outputFileName +Invoke-WebRequest -Uri $downloadUrl -OutFile $outputPath @requestOpts + +$configletPath = Join-Path -Path $outputDirectory -ChildPath "configlet.exe" +if (Test-Path -Path $configletPath) { Remove-Item -Path $configletPath } +[System.IO.Compression.ZipFile]::ExtractToDirectory($outputPath, $outputDirectory) +Remove-Item -Path $outputPath -Invoke-WebRequest -Headers $headers -Uri $zipUrl -OutFile $outputFile -Expand-Archive $outputFile -DestinationPath $outputDirectory -Force -Remove-Item -Path $outputFile \ No newline at end of file +$configletVersion = (Select-String -Pattern "/releases/download/(.+?)/" -InputObject $downloadUrl -AllMatches).Matches.Groups[1].Value +Write-Output "Downloaded configlet ${configletVersion} to ${configletPath}"