1
0
Fork 0
mirror of https://github.com/ohmyzsh/ohmyzsh.git synced 2024-11-11 00:10:08 +00:00

fix(extract): fix extract dir naming conflicts

Fixes #11642
This commit is contained in:
Marc Cornellà 2023-05-21 19:58:26 +02:00
parent bfeeda1491
commit 3a01d7df82

View file

@ -27,12 +27,20 @@ EOF
fi fi
local success=0 local success=0
local extract_dir="${1:t:r}"
local file="$1" full_path="${1:A}" local file="$1" full_path="${1:A}"
local extract_dir="${1:t:r}"
# If there's a file or directory with the same name as the archive
# add a random string to the end of the extract directory
if [[ -e "$extract_dir" ]]; then
local rnd="${(L)"${$(( [##36]$RANDOM*$RANDOM ))}":1:5}"
extract_dir="${extract_dir}-${rnd}"
fi
# Create an extraction directory based on the file name # Create an extraction directory based on the file name
command mkdir -p "$extract_dir" command mkdir -p "$extract_dir"
builtin cd -q "$extract_dir" builtin cd -q "$extract_dir"
echo "extract: extracting to $extract_dir" >&2
case "${file:l}" in case "${file:l}" in
(*.tar.gz|*.tgz) (*.tar.gz|*.tgz)
@ -107,11 +115,13 @@ EOF
if [[ "${content[1]:t}" == "$extract_dir" ]]; then if [[ "${content[1]:t}" == "$extract_dir" ]]; then
# =(:) gives /tmp/zsh<random>, with :t it gives zsh<random> # =(:) gives /tmp/zsh<random>, with :t it gives zsh<random>
local tmp_dir==(:); tmp_dir="${tmp_dir:t}" local tmp_dir==(:); tmp_dir="${tmp_dir:t}"
command mv -f "${content[1]}" "$tmp_dir" \ command mv "${content[1]}" "$tmp_dir" \
&& command rmdir "$extract_dir" \ && command rmdir "$extract_dir" \
&& command mv -f "$tmp_dir" "$extract_dir" && command mv "$tmp_dir" "$extract_dir"
else # Otherwise, if the extracted folder name already exists in the current
command mv -f "${content[1]}" . \ # directory (because of a previous file / folder), keep the extract_dir
elif [[ ! -e "${content[1]:t}" ]]; then
command mv "${content[1]}" . \
&& command rmdir "$extract_dir" && command rmdir "$extract_dir"
fi fi
elif [[ ${#content} -eq 0 ]]; then elif [[ ${#content} -eq 0 ]]; then