scripts/windows/dev-bundle-lib.psm1
# This is the "/scripts" directory, useful for accessing other scripts.
$scriptsDir = (Get-Item $PSScriptRoot).parent.FullName
# This is the root of the Meteor repository.
$rootDir = (Get-Item $scriptsDir).parent.FullName
# This is the "meteor" shell script.
$meteorSh = Join-Path $rootDir 'meteor'
<#
.Synopsis
Get the architecture for the Meteor Dev Bundle
.Description
Determine the architecture (64-bit/32-bit) from the environment,
taking into consideration the PLATFORM override environment variable,
which is used by Jenkins when building the dev bundle for Windows.
Otherwise, use logic similar to that of Chocolatey's
Get-OSArchitectureWidth method, as seen here: https://git.io/vd2e9
#>
Function Get-MeteorPlatform {
if (Test-Path env:PLATFORM) {
$PLATFORM = (Get-Item env:PLATFORM).Value
} elseif (([System.IntPtr]::Size -eq 4) -and (Test-Path env:\PROCESSOR_ARCHITEW6432)) {
$PLATFORM = "windows_x64"
} elseif ([System.IntPtr]::Size -eq 4) {
$PLATFORM = "windows_x86"
} else {
$PLATFORM = "windows_x64"
}
$PLATFORM
}
<#
.Synopsis
Get a shell script variable out of a regular Bash script.
#>
Function Read-VariableFromShellScript {
Param (
[Parameter(Mandatory=$True, Position=0)]
[string]$Path,
[Parameter(Mandatory=$True, Position=1)]
[string]$Name
)
$v = Select-String -Path $Path -Pattern "^\s*${Name}=(\S+)" |
% { $_.Matches[0].Groups[1].Value } |
Select-Object -First 1
$v = $v.Trim()
$v
}
<#
.Synopsis
Create and return a unique temporary directory.
#>
Function New-TemporaryDirectory {
$parent = [System.IO.Path]::GetTempPath()
[string] $name = [System.Guid]::NewGuid()
New-Item -ItemType Directory -Path (Join-Path $parent $name)
}
<#
.Synopsis
Recursively remove a directory using force, and avoiding
filesystem tools.
.Description
Some of the more complex file structures created by npm node_modules'
directories pose a problem for native Windows filesystem tools. This
command takes a different approach by using Windows' "Robocopy" tool to
clone the directory with an empty directory, and purge files which are
not present in the empty directory.
#>
Function Remove-DirectoryRecursively {
Param (
[Parameter(Mandatory=$True, Position=0)]
[string]$Path
)
if (Test-Path -LiteralPath $Path -PathType 'Container') {
$emptyTempDir = New-TemporaryDirectory
& robocopy.exe $emptyTempDir $Path /purge | Out-Null
Remove-Item $Path -Recurse -Force
Remove-Item $emptyTempDir -Force
}
}
<#
.Synopsis
Extract a .tar.gz file to a directory using 7z.
.Description
7z doesn't have the capability to deal with both tar and gz in a single
operation so this function chains them together in a piped operation.
#>
Function Expand-TarGzToDirectory {
Param (
[Parameter(Mandatory=$True, Position=0)]
[string]$Path,
[Parameter(Mandatory=$True, Position=1)]
[string]$Destination,
[string]$Binary = "7z.exe"
)
& cmd /C "$Binary x $Path -so | $Binary x -aoa -si -ttar -o$Destination"
if ($LASTEXITCODE -eq 0) {
return $True
}
$False
}
<#
.Synopsis
Extract a .7z archive to a directory using 7z.
.Description
Purely a shorthand function to simplify 7z extraction.
#>
Function Expand-7zToDirectory {
Param (
[Parameter(Mandatory=$True, Position=0)]
[string]$Path,
[Parameter(Mandatory=$True, Position=1)]
[string]$Destination,
[string]$Binary = "7z.exe"
)
& "$Binary" x "$Path" -o"$Destination" | Out-Null
}
Export-ModuleMember -Function `
Expand-7zToDirectory,
Expand-TarGzToDirectory,
Get-MeteorPlatform,
Read-VariableFromShellScript,
Remove-DirectoryRecursively