From a775d452ff31838fa7398de8bb09883d879e1ddd Mon Sep 17 00:00:00 2001 From: Hsiao-nan Cheung Date: Sat, 18 May 2019 00:19:51 +0800 Subject: [PATCH] fix(decompress): '$ExtractDir' error with '.zip' and subdir (#3472) For some `extract_dir` in .zip that has sub-dir, the former one would remove parent dir and get error (flac, flac-1.3.2-win\win64), now use temp dir instead. And also fix .msi, in case of some installer that don't have `SourceDir`. `Expand-DarkArchive` will be used in wix extraction, so it doesn't need `-ExtractDir`. `Expand-7zipArchive` and `Expand-InnoArchive` works well. Tested: - calibre-normal (msi, PFiles\Calibre2) - flac (zip, flac-1.3.2-win\win64) - pkg-config (zip, multiple url and extract_dir) BTW, `Expand-Archive` has `-PassThru` param in PowerShell 6+, and it will be more convinient to support `-ExtractDir` with it. I'll check function's source code and plan to rewrite `Expand-ZipArchive`. Fix #3473, ref https://github.com/lukesampson/scoop/issues/3473#issuecomment-493446461 --- lib/decompress.ps1 | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/lib/decompress.ps1 b/lib/decompress.ps1 index 33ec71a9c8..3dc3f73106 100644 --- a/lib/decompress.ps1 +++ b/lib/decompress.ps1 @@ -122,6 +122,10 @@ function Expand-MsiArchive { $Removal ) $DestinationPath = $DestinationPath.TrimEnd("\") + if ($ExtractDir) { + $OriDestinationPath = $DestinationPath + $DestinationPath = "$DestinationPath\_tmp" + } if ((get_config MSIEXTRACT_USE_LESSMSI)) { $MsiPath = Get-HelperPath -Helper Lessmsi $ArgList = @('x', "`"$Path`"", "`"$DestinationPath\\`"") @@ -138,11 +142,11 @@ function Expand-MsiArchive { abort "Failed to extract files from $Path.`nLog file:`n $(friendly_path $LogPath)`n$(new_issue_msg $app $bucket 'decompress error')" } if ($ExtractDir -and (Test-Path "$DestinationPath\SourceDir")) { - movedir "$DestinationPath\SourceDir\$ExtractDir" $DestinationPath | Out-Null - Remove-Item "$DestinationPath\SourceDir" -Recurse -Force + movedir "$DestinationPath\SourceDir\$ExtractDir" $OriDestinationPath | Out-Null + Remove-Item $DestinationPath -Recurse -Force } elseif ($ExtractDir) { - Get-ChildItem $DestinationPath -Exclude $ExtractDir, $Path | Remove-Item -Recurse -Force - movedir "$DestinationPath\$ExtractDir" $DestinationPath | Out-Null + movedir "$DestinationPath\$ExtractDir" $OriDestinationPath | Out-Null + Remove-Item $DestinationPath -Recurse -Force } elseif (Test-Path "$DestinationPath\SourceDir") { movedir "$DestinationPath\SourceDir" $DestinationPath | Out-Null } @@ -207,6 +211,10 @@ function Expand-ZipArchive { [Switch] $Removal ) + if ($ExtractDir) { + $OriDestinationPath = $DestinationPath + $DestinationPath = "$DestinationPath\_tmp" + } # All methods to unzip the file require .NET4.5+ if ($PSVersionTable.PSVersion.Major -lt 5) { Add-Type -AssemblyName System.IO.Compression.FileSystem @@ -236,8 +244,8 @@ function Expand-ZipArchive { Microsoft.PowerShell.Archive\Expand-Archive -Path $Path -DestinationPath $DestinationPath -Force } if ($ExtractDir) { - Get-ChildItem $DestinationPath -Exclude $ExtractDir, $Path | Remove-Item -Recurse -Force - movedir "$DestinationPath\$ExtractDir" $DestinationPath | Out-Null + movedir "$DestinationPath\$ExtractDir" $OriDestinationPath | Out-Null + Remove-Item $DestinationPath -Recurse -Force } if ($Removal) { # Remove original archive file @@ -254,15 +262,12 @@ function Expand-DarkArchive { [Parameter(Position = 1)] [String] $DestinationPath = (Split-Path $Path), - [String] - $ExtractDir, [Parameter(ValueFromRemainingArguments = $true)] [String] $Switches, [Switch] $Removal ) - $DestinationPath = $DestinationPath.TrimEnd("\") $LogPath = "$(Split-Path $Path)\dark.log" $ArgList = @('-nologo', "-x `"$DestinationPath`"", "`"$Path`"") if ($Switches) { @@ -275,10 +280,6 @@ function Expand-DarkArchive { if (Test-Path $LogPath) { Remove-Item $LogPath -Force } - if ($ExtractDir) { - Get-ChildItem $DestinationPath -Exclude $ExtractDir, $Path | Remove-Item -Recurse -Force - movedir "$DestinationPath\$ExtractDir" $DestinationPath | Out-Null - } if ($Removal) { # Remove original archive file Remove-Item $Path -Force