diff options
| author | Alexander Karatarakis <alkarata@microsoft.com> | 2017-11-15 18:07:50 -0800 |
|---|---|---|
| committer | Alexander Karatarakis <alkarata@microsoft.com> | 2017-11-15 22:37:24 -0800 |
| commit | 2abdcc1eec62fa7bd6af7abe0d7884966bd65b59 (patch) | |
| tree | 6b86a40651a8451136ac7007427d00630d62d1e5 /scripts/fetchDependency.ps1 | |
| parent | 7e3dcc4f096925f152593e3c8cd33e5dbf0b4e6f (diff) | |
| download | vcpkg-2abdcc1eec62fa7bd6af7abe0d7884966bd65b59.tar.gz vcpkg-2abdcc1eec62fa7bd6af7abe0d7884966bd65b59.zip | |
Introduce VcpkgPowershellUtils
Diffstat (limited to 'scripts/fetchDependency.ps1')
| -rw-r--r-- | scripts/fetchDependency.ps1 | 198 |
1 files changed, 7 insertions, 191 deletions
diff --git a/scripts/fetchDependency.ps1 b/scripts/fetchDependency.ps1 index b185336f5..8ea69e488 100644 --- a/scripts/fetchDependency.ps1 +++ b/scripts/fetchDependency.ps1 @@ -3,192 +3,21 @@ param( [string]$Dependency ) -function Test-Command($commandName) -{ - return [bool](Get-Command -Name $commandName -ErrorAction SilentlyContinue) -} - -function Test-CommandParameter($commandName, $parameterName) -{ - return (Get-Command $commandName).Parameters.Keys -contains $parameterName -} - -function Test-Module($moduleName) -{ - return [bool](Get-Module -ListAvailable -Name $moduleName) -} - -function Get-Credential-Backwards-Compatible() -{ - if (Test-CommandParameter -commandName 'Get-Credential' -parameterName 'Message') - { - return Get-Credential -Message "Enter credentials for Proxy Authentication" - } - else - { - Write-Host "Enter credentials for Proxy Authentication" - return Get-Credential - } -} - -function Get-Hash-SHA256() -{ - if (Test-Command -commandName 'Microsoft.PowerShell.Utility\Get-FileHash') - { - Write-Verbose("Hashing with Microsoft.PowerShell.Utility\Get-FileHash") - $downloadedFileHash = (Get-FileHash -Path $downloadPath -Algorithm SHA256).Hash - } - elseif(Test-Command -commandName 'Pscx\Get-Hash') - { - Write-Verbose("Hashing with Pscx\Get-Hash") - $downloadedFileHash = (Get-Hash -Path $downloadPath -Algorithm SHA256).HashString - } - else - { - Write-Verbose("Hashing with .NET") - $hashAlgorithm = [Security.Cryptography.HashAlgorithm]::Create("SHA256") - $fileAsByteArray = [io.File]::ReadAllBytes($downloadPath) - $hashByteArray = $hashAlgorithm.ComputeHash($fileAsByteArray) - $downloadedFileHash = -Join ($hashByteArray | ForEach-Object {"{0:x2}" -f $_}) - } - - return $downloadedFileHash.ToLower() -} - -if (Test-Module -moduleName 'BitsTransfer') -{ - Import-Module BitsTransfer -Verbose:$false -} +$scriptsDir = split-path -parent $MyInvocation.MyCommand.Definition +. "$scriptsDir\VcpkgPowershellUtils.ps1" Write-Verbose "Fetching dependency: $Dependency" - -$scriptsDir = split-path -parent $MyInvocation.MyCommand.Definition $vcpkgRootDir = & $scriptsDir\findFileRecursivelyUp.ps1 $scriptsDir .vcpkg-root $downloadsDir = "$vcpkgRootDir\downloads" function SelectProgram([Parameter(Mandatory=$true)][string]$Dependency) { - function performDownload( [Parameter(Mandatory=$true)][string]$Dependency, - [Parameter(Mandatory=$true)][string]$url, - [Parameter(Mandatory=$true)][string]$downloadDir, - [Parameter(Mandatory=$true)][string]$downloadPath, - [Parameter(Mandatory=$true)][string]$downloadVersion, - [Parameter(Mandatory=$true)][string]$requiredVersion) - { - if (Test-Path $downloadPath) - { - return - } - - if (!(Test-Path $downloadDir)) - { - New-Item -ItemType directory -Path $downloadDir | Out-Null - } - - $downloadsTemp = "$downloadDir/temp" - if (Test-Path $downloadsTemp) # Delete temp dir if it exists - { - Remove-Item $downloadsTemp -Recurse -Force - } - if (!(Test-Path $downloadsTemp)) # Recreate temp dir. It may still be there the dir was in use - { - New-Item -ItemType directory -Path $downloadsTemp | Out-Null - } - - $tempDownloadName = "$downloadsTemp/$Dependency-$downloadVersion.temp" - - $WC = New-Object System.Net.WebClient - $ProxyAuth = !$WC.Proxy.IsBypassed($url) - - # git and installerbase fail with Start-BitsTransfer - if ((Test-Command -commandName 'Start-BitsTransfer') -and ($Dependency -ne "git")-and ($Dependency -ne "installerbase")) - { - try - { - if ($ProxyAuth) - { - $ProxyCred = Get-Credential-Backwards-Compatible - $PSDefaultParameterValues.Add("Start-BitsTransfer:ProxyAuthentication","Basic") - $PSDefaultParameterValues.Add("Start-BitsTransfer:ProxyCredential", $ProxyCred) - } - Start-BitsTransfer -Source $url -Destination $tempDownloadName -ErrorAction Stop - Move-Item -Path $tempDownloadName -Destination $downloadPath - return - } - catch [System.Exception] - { - # If BITS fails for any reason, delete any potentially partially downloaded files and continue - if (Test-Path $tempDownloadName) - { - Remove-Item $tempDownloadName - } - } - } - - if ($ProxyAuth) - { - $WC.Proxy.Credentials = Get-Credential-Backwards-Compatible - } - - Write-Verbose("Downloading $Dependency...") - $WC.DownloadFile($url, $tempDownloadName) - Move-Item -Path $tempDownloadName -Destination $downloadPath - } - # Enums (without resorting to C#) are only available on powershell 5+. $ExtractionType_NO_EXTRACTION_REQUIRED = 0 $ExtractionType_ZIP = 1 $ExtractionType_SELF_EXTRACTING_7Z = 2 - - # Using this to wait for the execution to finish - function Invoke-Command() - { - param ( [Parameter(Mandatory=$true)][string]$program, - [string]$argumentString = "", - [switch]$waitForExit = $false ) - - $psi = new-object "Diagnostics.ProcessStartInfo" - $psi.FileName = $program - $psi.Arguments = $argumentString - $proc = [Diagnostics.Process]::Start($psi) - if ( $waitForExit ) - { - $proc.WaitForExit(); - } - } - - function Expand-ZIPFile($file, $destination) - { - if (!(Test-Path $destination)) - { - New-Item -ItemType Directory -Path $destination | Out-Null - } - - if (Test-Command -commandName 'Microsoft.PowerShell.Archive\Expand-Archive') - { - Write-Verbose("Extracting with Microsoft.PowerShell.Archive\Expand-Archive") - Microsoft.PowerShell.Archive\Expand-Archive -path $file -destinationpath $destination - } - elseif (Test-Command -commandName 'Pscx\Expand-Archive') - { - Write-Verbose("Extracting with Pscx\Expand-Archive") - Pscx\Expand-Archive -path $file -OutputPath $destination - } - else - { - Write-Verbose("Extracting via shell") - $shell = new-object -com shell.application - $zip = $shell.NameSpace($file) - foreach($item in $zip.items()) - { - # Piping to Out-Null is used to block until finished - $shell.Namespace($destination).copyhere($item) | Out-Null - } - } - } - if($Dependency -eq "cmake") { $requiredVersion = "3.9.5" @@ -249,23 +78,10 @@ function SelectProgram([Parameter(Mandatory=$true)][string]$Dependency) throw "Unknown program requested" } - $downloadSubdir = Split-path $downloadPath -Parent - if (!(Test-Path $downloadSubdir)) - { - New-Item -ItemType Directory -Path $downloadSubdir | Out-Null - } - - performDownload $Dependency $url $downloadsDir $downloadPath $downloadVersion $requiredVersion + vcpkgDownloadFile $url $downloadPath - $downloadedFileHash = Get-Hash-SHA256 $downloadPath - if ($expectedDownloadedFileHash -ne $downloadedFileHash) - { - Write-Host ("`nFile does not have expected hash:`n" + - " File path: [ $downloadPath ]`n" + - " Expected hash: [ $expectedDownloadedFileHash ]`n" + - " Actual hash: [ $downloadedFileHash ]`n") - throw "Invalid Hash" - } + $downloadedFileHash = vcpkgGetSHA256 $downloadPath + vcpkgCheckEqualFileHash -filePath $downloadPath -expectedHash $expectedDownloadedFileHash -actualHash $downloadedFileHash if ($extractionType -eq $ExtractionType_NO_EXTRACTION_REQUIRED) { @@ -275,14 +91,14 @@ function SelectProgram([Parameter(Mandatory=$true)][string]$Dependency) { if (-not (Test-Path $executableFromDownload)) # consider renaming the extraction folder to make sure the extraction finished { - Expand-ZIPFile -File $downloadPath -Destination $extractionFolder + vcpkgExtractFile -File $downloadPath -Destination $extractionFolder } } elseif($extractionType -eq $ExtractionType_SELF_EXTRACTING_7Z) { if (-not (Test-Path $executableFromDownload)) { - Invoke-Command $downloadPath "-y" -waitForExit:$true + vcpkgInvokeCommand $downloadPath "-y" -wait:$true } } else |
