mirror of
https://github.com/ScoopInstaller/Scoop.git
synced 2025-12-10 18:15:37 +00:00
Close scoopinstaller/scoop-main#19 Close scoopinstaller/scoop-main#20 Close lukesampson/scoop-extras#2078
210 lines
7.1 KiB
PowerShell
210 lines
7.1 KiB
PowerShell
function Test-7ZipRequirement {
|
|
[CmdletBinding(DefaultParameterSetName = "URL")]
|
|
[OutputType([Boolean])]
|
|
param(
|
|
[Parameter(Mandatory = $true, ParameterSetName = "URL")]
|
|
[String[]]
|
|
$URL,
|
|
[Parameter(Mandatory = $true, ParameterSetName = "File")]
|
|
[String]
|
|
$File
|
|
)
|
|
if ($URL) {
|
|
if ((get_config 7ZIPEXTRACT_USE_EXTERNAL)) {
|
|
return $false
|
|
} else {
|
|
return ($URL | Where-Object { Test-7ZipRequirement -File $_ }).Count -gt 0
|
|
}
|
|
} else {
|
|
return $File -match '\.((gz)|(tar)|(tgz)|(lzma)|(bz)|(bz2)|(7z)|(rar)|(iso)|(xz)|(lzh)|(nupkg))$'
|
|
}
|
|
}
|
|
|
|
function Test-LessMSIRequirement {
|
|
[CmdletBinding()]
|
|
[OutputType([Boolean])]
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[String[]]
|
|
$URL
|
|
)
|
|
if ((get_config MSIEXTRACT_USE_LESSMSI)) {
|
|
return ($URL | Where-Object { $_ -match '\.msi$' }).Count -gt 0
|
|
} else {
|
|
return $false
|
|
}
|
|
}
|
|
|
|
function Expand-7ZipArchive {
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
|
|
[String]
|
|
$Path,
|
|
[Parameter(Position = 1)]
|
|
[String]
|
|
$DestinationPath = (Split-Path $Path),
|
|
[Switch]
|
|
$Removal
|
|
)
|
|
$LogLocation = "$(Split-Path $Path)\7zip.log"
|
|
if ((get_config 7ZIPEXTRACT_USE_EXTERNAL)) {
|
|
try {
|
|
7z x "$Path" -o"$DestinationPath" -y | Out-File $LogLocation
|
|
} catch [System.Management.Automation.CommandNotFoundException] {
|
|
abort "Cannot find external 7Zip (7z.exe) while '7ZIPEXTRACT_USE_EXTERNAL' is 'true'!`nRun 'scoop config 7ZIPEXTRACT_USE_EXTERNAL false' or install 7Zip manually and try again."
|
|
}
|
|
} else {
|
|
&(file_path 7zip 7z.exe) x "$Path" -o"$DestinationPath" -y | Out-File $LogLocation
|
|
}
|
|
if ($LASTEXITCODE -ne 0) {
|
|
abort "Failed to extract files from $Path.`nLog file:`n $(friendly_path $LogLocation)"
|
|
}
|
|
if (Test-Path $LogLocation) {
|
|
Remove-Item $LogLocation -Force
|
|
}
|
|
if ((strip_ext $Path) -match '\.tar$' -or $Path -match '\.tgz$') {
|
|
# Check for tar
|
|
$ArchivedFile = &(file_path 7zip 7z.exe) l "$Path"
|
|
if ($LASTEXITCODE -eq 0) {
|
|
$TarFile = $ArchivedFile[-3] -replace '.{53}(.*)', '$1' # get inner tar file name
|
|
Expand-7ZipArchive "$DestinationPath\$TarFile" $DestinationPath -Removal
|
|
} else {
|
|
abort "Failed to list files in $Path.`nNot a 7Zip supported archive file."
|
|
}
|
|
}
|
|
if ($Removal) {
|
|
# Remove original archive file
|
|
Remove-Item $Path -Force
|
|
}
|
|
}
|
|
|
|
function Expand-MSIArchive {
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
|
|
[String]
|
|
$Path,
|
|
[Parameter(Position = 1)]
|
|
[String]
|
|
$DestinationPath = (Split-Path $Path),
|
|
[Switch]
|
|
$Removal
|
|
)
|
|
$LogLocation = "$(Split-Path $Path)\msi.log"
|
|
if ((get_config MSIEXTRACT_USE_LESSMSI)) {
|
|
&(file_path lessmsi lessmsi.exe) x "$Path" "$DestinationPath\" | Out-File $LogLocation
|
|
if ($LASTEXITCODE -ne 0) {
|
|
abort "Failed to extract files from $Path.`nLog file:`n $(friendly_path $LogLocation)"
|
|
}
|
|
if (Test-Path "$DestinationPath\SourceDir") {
|
|
movedir "$DestinationPath\SourceDir" "$DestinationPath" | Out-Null
|
|
}
|
|
} else {
|
|
$ok = run 'msiexec' @('/a', "`"$Path`"", '/qn', "TARGETDIR=`"$DestinationPath`"", "/lwe `"$LogLocation`"")
|
|
if (!$ok) {
|
|
abort "Failed to extract files from $Path.`nLog file:`n $(friendly_path $LogLocation)"
|
|
}
|
|
Remove-Item "$DestinationPath\$(fname $Path)" -Force
|
|
}
|
|
if (Test-Path $LogLocation) {
|
|
Remove-Item $LogLocation -Force
|
|
}
|
|
if ($Removal) {
|
|
# Remove original archive file
|
|
Remove-Item $Path -Force
|
|
}
|
|
}
|
|
|
|
function Expand-InnoArchive {
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
|
|
[String]
|
|
$Path,
|
|
[Parameter(Position = 1)]
|
|
[String]
|
|
$DestinationPath = (Split-Path $Path),
|
|
[Switch]
|
|
$Removal
|
|
)
|
|
$LogLocation = "$(Split-Path $Path)\innounp.log"
|
|
&(file_path innounp innounp.exe) -x -d"$DestinationPath" -c'{app}' "$Path" -y | Out-File $LogLocation
|
|
if ($LASTEXITCODE -ne 0) {
|
|
abort "Failed to extract files from $Path.`nLog file:`n $(friendly_path $LogLocation)"
|
|
}
|
|
if (Test-Path $LogLocation) {
|
|
Remove-Item $LogLocation -Force
|
|
}
|
|
if ($Removal) {
|
|
# Remove original archive file
|
|
Remove-Item $Path -Force
|
|
}
|
|
}
|
|
|
|
function Expand-ZipArchive {
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
|
|
[String]
|
|
$Path,
|
|
[Parameter(Position = 1)]
|
|
[String]
|
|
$DestinationPath = (Split-Path $Path),
|
|
[Switch]
|
|
$Removal
|
|
)
|
|
# All methods to unzip the file require .NET4.5+
|
|
if ($PSVersionTable.PSVersion.Major -lt 5) {
|
|
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
|
try {
|
|
[System.IO.Compression.ZipFile]::ExtractToDirectory($Path, $DestinationPath)
|
|
} catch [System.IO.PathTooLongException] {
|
|
# try to fall back to 7zip if path is too long
|
|
if (7zip_installed) {
|
|
Expand-7ZipArchive $Path $DestinationPath -Removal
|
|
return
|
|
} else {
|
|
abort "Unzip failed: Windows can't handle the long paths in this zip file.`nRun 'scoop install 7zip' and try again."
|
|
}
|
|
} catch [System.IO.IOException] {
|
|
if (7zip_installed) {
|
|
Expand-7ZipArchive $Path $DestinationPath -Removal
|
|
return
|
|
} else {
|
|
abort "Unzip failed: Windows can't handle the file names in this zip file.`nRun 'scoop install 7zip' and try again."
|
|
}
|
|
} catch {
|
|
abort "Unzip failed: $_"
|
|
}
|
|
} else {
|
|
# Use Expand-Archive to unzip in PowerShell 5+
|
|
# Compatible with Pscx (https://github.com/Pscx/Pscx)
|
|
Microsoft.PowerShell.Archive\Expand-Archive -Path $Path -DestinationPath $DestinationPath -Force
|
|
}
|
|
if ($Removal) {
|
|
# Remove original archive file
|
|
Remove-Item $Path -Force
|
|
}
|
|
}
|
|
|
|
function extract_7zip($path, $to, $removal) {
|
|
Show-DeprecatedWarning $MyInvocation 'Expand-7ZipArchive'
|
|
Expand-7ZipArchive -Path $path -DestinationPath $to -Removal:$removal
|
|
}
|
|
|
|
function extract_msi($path, $to, $removal) {
|
|
Show-DeprecatedWarning $MyInvocation 'Expand-MSIArchive'
|
|
Expand-MSIArchive -Path $path -DestinationPath $to -Removal:$removal
|
|
}
|
|
|
|
function unpack_inno($path, $to, $removal) {
|
|
Show-DeprecatedWarning $MyInvocation 'Expand-InnoArchive'
|
|
Expand-InnoArchive -Path $path -DestinationPath $to -Removal:$removal
|
|
}
|
|
|
|
function extract_zip($path, $to, $removal) {
|
|
Show-DeprecatedWarning $MyInvocation 'Expand-ZipArchive'
|
|
Expand-ZipArchive -Path $path -DestinationPath $to -Removal:$removal
|
|
}
|