summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorMarc Cornellà <hello@mcornella.com>2023-04-06 21:06:16 +0200
committerMarc Cornellà <hello@mcornella.com>2023-04-06 21:06:16 +0200
commit49d34d00cdaf132f318700398bf42120ff1af8e7 (patch)
tree59ea56f21e131fb7ff48d04c48996240faca2993 /plugins
parentcf0c80049288d1029aee824bf975016c4201a3ef (diff)
downloadzsh-49d34d00cdaf132f318700398bf42120ff1af8e7.tar.gz
zsh-49d34d00cdaf132f318700398bf42120ff1af8e7.tar.bz2
zsh-49d34d00cdaf132f318700398bf42120ff1af8e7.zip
fix(extract): fix conflict if compressed file has a folder of the same name
This change fixes the case where the compressed file (e.g. tools.tgz) only contains a folder with the same name (e.g. tools) in its root folder. tools.tgz: |- tools |- fileA.txt |- fileB.txt \- fileC.txt In that case, the "smart" folder creation mechanism will extract the files in a folder "tools", and this extraction folder will contain a single folder with the same name. Before this fix, the tool would try to move out the inside folder to the parent one, but there would already be a folder named "tools", so it would generate a conflict. This change first renames the inside folder to a random string, and only then it is moved outside and the old extraction folder is deleted.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/extract/extract.plugin.zsh18
1 files changed, 16 insertions, 2 deletions
diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh
index 40e67575f..34c080653 100644
--- a/plugins/extract/extract.plugin.zsh
+++ b/plugins/extract/extract.plugin.zsh
@@ -98,8 +98,22 @@ EOF
local -a content
content=("${extract_dir}"/*(DNY2))
if [[ ${#content} -eq 1 && -d "${content[1]}" ]]; then
- command mv -f "${content[1]}" .
- command rmdir "$extract_dir"
+ # The extracted folder (${content[1]}) may have the same name as $extract_dir
+ # If so, we need to rename it to avoid conflicts in a 3-step process
+ #
+ # 1. Move and rename the extracted folder to a temporary random name
+ # 2. Delete the empty folder
+ # 3. Rename the extracted folder to the original name
+ if [[ "${content[1]:t}" == "$extract_dir" ]]; then
+ # =(:) gives /tmp/zsh<random>, with :t it gives zsh<random>
+ local tmp_dir==(:); tmp_dir="${tmp_dir:t}"
+ command mv -f "${content[1]}" "$tmp_dir" \
+ && command rmdir "$extract_dir" \
+ && command mv -f "$tmp_dir" "$extract_dir"
+ else
+ command mv -f "${content[1]}" . \
+ && command rmdir "$extract_dir"
+ fi
elif [[ ${#content} -eq 0 ]]; then
command rmdir "$extract_dir"
fi