diff options
author | Marc Cornellà <hello@mcornella.com> | 2023-04-06 21:06:16 +0200 |
---|---|---|
committer | Marc Cornellà <hello@mcornella.com> | 2023-04-06 21:06:16 +0200 |
commit | 49d34d00cdaf132f318700398bf42120ff1af8e7 (patch) | |
tree | 59ea56f21e131fb7ff48d04c48996240faca2993 /plugins | |
parent | cf0c80049288d1029aee824bf975016c4201a3ef (diff) | |
download | zsh-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.zsh | 18 |
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 |