aboutsummaryrefslogtreecommitdiff
path: root/scripts/fetchDependency.ps1
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/fetchDependency.ps1')
-rw-r--r--scripts/fetchDependency.ps1168
1 files changed, 113 insertions, 55 deletions
diff --git a/scripts/fetchDependency.ps1 b/scripts/fetchDependency.ps1
index 773ebeac4..16ba984e6 100644
--- a/scripts/fetchDependency.ps1
+++ b/scripts/fetchDependency.ps1
@@ -3,7 +3,36 @@ param(
[string]$Dependency
)
-if ($PSVersionTable.PSEdition -ne "Core") {
+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
+ }
+}
+
+if (Test-Module -moduleName 'BitsTransfer')
+{
Import-Module BitsTransfer -Verbose:$false
}
@@ -28,42 +57,59 @@ function SelectProgram([Parameter(Mandatory=$true)][string]$Dependency)
return
}
- # Can't print because vcpkg captures the output and expects only the path that is returned at the end of this script file
- # Write-Host "A suitable version of $Dependency was not found (required v$requiredVersion). Downloading portable $Dependency v$downloadVersion..."
-
if (!(Test-Path $downloadDir))
{
New-Item -ItemType directory -Path $downloadDir | Out-Null
}
- $WC = New-Object System.Net.WebClient
- $ProxyAuth = !$WC.Proxy.IsBypassed($url)
- if ($ProxyAuth)
+ $downloadsTemp = "$downloadDir/temp"
+ if (Test-Path $downloadsTemp) # Delete temp dir if it exists
{
- $ProxyCred = Get-Credential -Message "Enter credentials for Proxy Authentication"
- $PSDefaultParameterValues.Add("Start-BitsTransfer:ProxyAuthentication","Basic")
- $PSDefaultParameterValues.Add("Start-BitsTransfer:ProxyCredential",$ProxyCred)
- $WC.Proxy.Credentials=$ProxyCred
+ 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)
- if (($PSVersionTable.PSEdition -ne "Core") -and ($Dependency -ne "git")) # git fails with BITS
+ # git and installerbase fail with Start-BitsTransfer
+ if ((Test-Command -commandName 'Start-BitsTransfer') -and ($Dependency -ne "git")-and ($Dependency -ne "installerbase"))
{
- try {
- Start-BitsTransfer -Source $url -Destination $downloadPath -ErrorAction Stop
+ 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] {
+ catch [System.Exception]
+ {
# If BITS fails for any reason, delete any potentially partially downloaded files and continue
- if (Test-Path $downloadPath)
+ if (Test-Path $tempDownloadName)
{
- Remove-Item $downloadPath
+ Remove-Item $tempDownloadName
}
}
}
- if (!(Test-Path $downloadPath))
+
+ if ($ProxyAuth)
{
- Write-Verbose("Downloading $Dependency...")
- $WC.DownloadFile($url, $downloadPath)
+ $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+.
@@ -96,58 +142,65 @@ function SelectProgram([Parameter(Mandatory=$true)][string]$Dependency)
New-Item -ItemType Directory -Path $destination | Out-Null
}
- $shell = new-object -com shell.application
- $zip = $shell.NameSpace($file)
- foreach($item in $zip.items())
+ if (Test-Command -commandName 'Expand-Archive')
+ {
+ Expand-Archive -path $file -destinationpath $destination
+ }
+ else
{
- # Piping to Out-Null is used to block until finished
- $shell.Namespace($destination).copyhere($item) | Out-Null
+ $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.3"
- $downloadVersion = "3.9.3"
- $url = "https://cmake.org/files/v3.9/cmake-3.9.3-win32-x86.zip"
- $downloadPath = "$downloadsDir\cmake-3.9.3-win32-x86.zip"
- $expectedDownloadedFileHash = "47870e3d4c9a5aa019e71020cd85cc60b6f2d2569fb239eaec204cd991e512f1"
- $executableFromDownload = "$downloadsDir\cmake-3.9.3-win32-x86\bin\cmake.exe"
+ $requiredVersion = "3.9.5"
+ $downloadVersion = "3.9.5"
+ $url = "https://cmake.org/files/v3.9/cmake-3.9.5-win32-x86.zip"
+ $downloadPath = "$downloadsDir\cmake-3.9.5-win32-x86.zip"
+ $expectedDownloadedFileHash = "dd3e183254c12f7c338d3edfa642f1ac84a763b8b9a2feabb4ad5fccece5dff9"
+ $executableFromDownload = "$downloadsDir\cmake-3.9.5-win32-x86\bin\cmake.exe"
$extractionType = $ExtractionType_ZIP
$extractionFolder = $downloadsDir
}
elseif($Dependency -eq "nuget")
{
- $requiredVersion = "4.3.0"
- $downloadVersion = "4.3.0"
- $url = "https://dist.nuget.org/win-x86-commandline/v4.3.0/nuget.exe"
+ $requiredVersion = "4.4.0"
+ $downloadVersion = "4.4.0"
+ $url = "https://dist.nuget.org/win-x86-commandline/v4.4.0/nuget.exe"
$downloadPath = "$downloadsDir\nuget-$downloadVersion\nuget.exe"
- $expectedDownloadedFileHash = "386da77a8cf2b63d1260b7020feeedabfe3b65ab31d20e6a313a530865972f3a"
+ $expectedDownloadedFileHash = "2cf9b118937eef825464e548f0c44f7f64090047746de295d75ac3dcffa3e1f6"
$executableFromDownload = $downloadPath
$extractionType = $ExtractionType_NO_EXTRACTION_REQUIRED
}
elseif($Dependency -eq "vswhere")
{
- $requiredVersion = "2.2.3"
- $downloadVersion = "2.2.3"
- $url = "https://github.com/Microsoft/vswhere/releases/download/2.2.3/vswhere.exe"
+ $requiredVersion = "2.2.11"
+ $downloadVersion = "2.2.11"
+ $url = "https://github.com/Microsoft/vswhere/releases/download/2.2.11/vswhere.exe"
$downloadPath = "$downloadsDir\vswhere-$downloadVersion\vswhere.exe"
- $expectedDownloadedFileHash = "5f19066ac91635ad17d33fe0f79fc63c672a46f98c0358589a90163bcb2733e8"
+ $expectedDownloadedFileHash = "0235c2cb6341978abdf32e27fcf1d7af5cb5514c035e529c4cd9283e6f1a261f"
$executableFromDownload = $downloadPath
$extractionType = $ExtractionType_NO_EXTRACTION_REQUIRED
}
elseif($Dependency -eq "git")
{
- $requiredVersion = "2.14.1"
- $downloadVersion = "2.14.1"
- $url = "https://github.com/git-for-windows/git/releases/download/v2.14.1.windows.1/MinGit-2.14.1-32-bit.zip" # We choose the 32-bit version
- $downloadPath = "$downloadsDir\MinGit-2.14.1-32-bit.zip"
- $expectedDownloadedFileHash = "77b468e0ead1e7da4cb3a1cf35dabab5210bf10457b4142f5e9430318217cdef"
+ $requiredVersion = "2.15.0"
+ $downloadVersion = "2.15.0"
+ $url = "https://github.com/git-for-windows/git/releases/download/v2.15.0.windows.1/MinGit-2.15.0-32-bit.zip"
+ $downloadPath = "$downloadsDir\MinGit-2.15.0-32-bit.zip"
+ $expectedDownloadedFileHash = "69c035ab7b75c42ce5dd99e8927d2624ab618fab73c5ad84c9412bd74c343537"
# There is another copy of git.exe in MinGit\bin. However, an installed version of git add the cmd dir to the PATH.
# Therefore, choosing the cmd dir here as well.
- $executableFromDownload = "$downloadsDir\MinGit-2.14.1-32-bit\cmd\git.exe"
+ $executableFromDownload = "$downloadsDir\MinGit-2.15.0-32-bit\cmd\git.exe"
$extractionType = $ExtractionType_ZIP
- $extractionFolder = "$downloadsDir\MinGit-2.14.1-32-bit"
+ $extractionFolder = "$downloadsDir\MinGit-2.15.0-32-bit"
}
elseif($Dependency -eq "installerbase")
{
@@ -174,21 +227,26 @@ function SelectProgram([Parameter(Mandatory=$true)][string]$Dependency)
performDownload $Dependency $url $downloadsDir $downloadPath $downloadVersion $requiredVersion
#calculating the hash
- if ($PSVersionTable.PSEdition -ne "Core")
+ if (Test-Command -commandName 'Get-FileHash')
+ {
+ $downloadedFileHash = (Get-FileHash -Path $downloadPath -Algorithm SHA256).Hash
+ }
+ else
{
$hashAlgorithm = [Security.Cryptography.HashAlgorithm]::Create("SHA256")
$fileAsByteArray = [io.File]::ReadAllBytes($downloadPath)
$hashByteArray = $hashAlgorithm.ComputeHash($fileAsByteArray)
$downloadedFileHash = -Join ($hashByteArray | ForEach-Object {"{0:x2}" -f $_})
}
- else
- {
- $downloadedFileHash = (Get-FileHash -Path $downloadPath -Algorithm SHA256).Hash
- }
+ $downloadedFileHash = $downloadedFileHash.ToLower()
if ($expectedDownloadedFileHash -ne $downloadedFileHash)
{
- throw [System.IO.FileNotFoundException] ("Mismatching hash of the downloaded " + $Dependency)
+ Write-Host ("`nFile does not have expected hash:`n" +
+ " File path: [ $downloadPath ]`n" +
+ " Expected hash: [ $expectedDownloadedFileHash ]`n" +
+ " Actual hash: [ $downloadedFileHash ]`n")
+ throw "Invalid Hash"
}
if ($extractionType -eq $ExtractionType_NO_EXTRACTION_REQUIRED)
@@ -217,12 +275,12 @@ function SelectProgram([Parameter(Mandatory=$true)][string]$Dependency)
if (-not (Test-Path $executableFromDownload))
{
- throw [System.IO.FileNotFoundException] ("Could not detect or download " + $Dependency)
+ throw ("Could not detect or download " + $Dependency)
}
return $executableFromDownload
}
-SelectProgram $Dependency
-
+$path = SelectProgram $Dependency
Write-Verbose "Fetching dependency: $Dependency. Done."
+return "<sol>::$path::<eol>"