Skip to content

Commit

Permalink
fetch-configlet.ps1: fix for newer PowerShell versions (#841)
Browse files Browse the repository at this point in the history
Under some conditions, running the fetch-configlet PowerShell script
could now produce an error like the below:

    $ pwsh ./fetch-configlet.ps1
    Invoke-WebRequest: /mnt/c/Users/bugma/Source/Repos/3rdParty/euphoria/bin/fetch-configlet.ps1:29
    Line |
      29 |  Invoke-WebRequest -Uri $downloadUrl -OutFile $outputFile @requestOpts
         |                         ~~~~~~~~~~~~
         | Cannot validate argument on parameter 'Uri'. The argument is null or
         | empty. Provide an argument that is not null or empty, and then try
         | the command again.

Fix that, and make the script more similar to the bash one.

Changes:

- Fix command chaining

- Move $arch closer to place of use

- Use name field to exactly match filename

- Test if script is run from repo root

- Add message for downloading

- Replace broken expand-archive with ZipFile

- Use explicit output filename

- Output download info

Closes: #839
  • Loading branch information
ErikSchierboom authored Dec 15, 2023
1 parent 38741bf commit 2630458
Showing 1 changed file with 22 additions and 11 deletions.
33 changes: 22 additions & 11 deletions scripts/fetch-configlet.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,31 @@ $requestOpts = @{
RetryIntervalSec = 1
}

$arch = If ([Environment]::Is64BitOperatingSystem) { "x86-64" } Else { "i386" }
$fileName = "configlet_.+_windows_$arch.zip"

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 { $_.browser_download_url -match $FileName }
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
}

$downloadUrl = Get-DownloadUrl
$outputDirectory = "bin"
$outputFile = Join-Path -Path $outputDirectory -ChildPath $fileName
Invoke-WebRequest -Uri $downloadUrl -OutFile $outputFile @requestOpts
Expand-Archive $outputFile -DestinationPath $outputDirectory -Force
Remove-Item -Path $outputFile
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

$configletVersion = (Select-String -Pattern "/releases/download/(.+?)/" -InputObject $downloadUrl -AllMatches).Matches.Groups[1].Value
Write-Output "Downloaded configlet ${configletVersion} to ${configletPath}"

0 comments on commit 2630458

Please sign in to comment.