浏览代码

fix(extract): fix extract dir naming conflicts

Fixes #11642
Marc Cornellà 1 年之前
父节点
当前提交
3a01d7df82
共有 1 个文件被更改,包括 15 次插入5 次删除
  1. 15 5
      plugins/extract/extract.plugin.zsh

+ 15 - 5
plugins/extract/extract.plugin.zsh

@@ -27,12 +27,20 @@ EOF
     fi
 
     local success=0
-    local extract_dir="${1:t:r}"
     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
     command mkdir -p "$extract_dir"
     builtin cd -q "$extract_dir"
+    echo "extract: extracting to $extract_dir" >&2
 
     case "${file:l}" in
       (*.tar.gz|*.tgz)
@@ -107,11 +115,13 @@ EOF
       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 mv "${content[1]}" "$tmp_dir" \
         && command rmdir "$extract_dir" \
-        && command mv -f "$tmp_dir" "$extract_dir"
-      else
-        command mv -f "${content[1]}" . \
+        && command mv "$tmp_dir" "$extract_dir"
+      # Otherwise, if the extracted folder name already exists in the current
+      # 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"
       fi
     elif [[ ${#content} -eq 0 ]]; then