From 6e45eddab6208e979a672ff23271cb132642e479 Mon Sep 17 00:00:00 2001 From: Simon Rieger Date: Fri, 24 Jan 2025 19:23:38 +0100 Subject: [PATCH] add transfer support for zsh --- .chezmoitemplates/zshrc_linux.tmpl | 111 +++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/.chezmoitemplates/zshrc_linux.tmpl b/.chezmoitemplates/zshrc_linux.tmpl index c8f237d..9ee9d36 100644 --- a/.chezmoitemplates/zshrc_linux.tmpl +++ b/.chezmoitemplates/zshrc_linux.tmpl @@ -106,6 +106,117 @@ function preexec { print -Pn "\e]0;${(q)1}\e\\" } +transfer() +{ + local file + declare -a file_array + file_array=("${@}") + + if [[ "${file_array[@]}" == "" || "${1}" == "--help" || "${1}" == "-h" ]] + then + echo "${0} - Upload arbitrary files to \"transfer.sh\"." + echo "" + echo "Usage: ${0} [options] []..." + echo "" + echo "OPTIONS:" + echo " -h, --help" + echo " show this message" + echo "" + echo "EXAMPLES:" + echo " Upload a single file from the current working directory:" + echo " ${0} \"image.img\"" + echo "" + echo " Upload multiple files from the current working directory:" + echo " ${0} \"image.img\" \"image2.img\"" + echo "" + echo " Upload a file from a different directory:" + echo " ${0} \"/tmp/some_file\"" + echo "" + echo " Upload all files from the current working directory. Be aware of the webserver's rate limiting!:" + echo " ${0} *" + echo "" + echo " Upload a single file from the current working directory and filter out the delete token and download link:" + echo " ${0} \"image.img\" | awk --field-separator=\": \" '/Delete token:/ { print \$2 } /Download link:/ { print \$2 }'" + echo "" + echo " Show help text from \"transfer.sh\":" + echo " curl --request GET \"https://transfer.sh\"" + return 0 + else + for file in "${file_array[@]}" + do + if [[ ! -f "${file}" ]] + then + echo -e "\e[01;31m'${file}' could not be found or is not a file.\e[0m" >&2 + return 1 + fi + done + unset file + fi + + local upload_files + local curl_output + local awk_output + + du -c -k -L "${file_array[@]}" >&2 + # be compatible with "bash" + if [[ "${ZSH_NAME}" == "zsh" ]] + then + read $'upload_files?\e[01;31mDo you really want to upload the above files ('"${#file_array[@]}"$') to "transfer.sh"? (Y/n): \e[0m' + elif [[ "${BASH}" == *"bash"* ]] + then + read -p $'\e[01;31mDo you really want to upload the above files ('"${#file_array[@]}"$') to "transfer.sh"? (Y/n): \e[0m' upload_files + fi + + case "${upload_files:-y}" in + "y"|"Y") + # for the sake of the progress bar, execute "curl" for each file. + # the parameters "--include" and "--form" will suppress the progress bar. + for file in "${file_array[@]}" + do + # show delete link and filter out the delete token from the response header after upload. + # it is important to save "curl's" "stdout" via a subshell to a variable or redirect it to another command, + # which just redirects to "stdout" in order to have a sane output afterwards. + # the progress bar is redirected to "stderr" and is only displayed, + # if "stdout" is redirected to something; e.g. ">/dev/null", "tee /dev/null" or "| ". + # the response header is redirected to "stdout", so redirecting "stdout" to "/dev/null" does not make any sense. + # redirecting "curl's" "stderr" to "stdout" ("2>&1") will suppress the progress bar. + curl_output=$(curl --request PUT --progress-bar --dump-header - --upload-file "${file}" "https://transfer.sh/") + awk_output=$(awk \ + 'gsub("\r", "", $0) && tolower($1) ~ /x-url-delete/ \ + { + delete_link=$2; + print "Delete command: curl --request DELETE " "\""delete_link"\""; + + gsub(".*/", "", delete_link); + delete_token=delete_link; + print "Delete token: " delete_token; + } + + END{ + print "Download link: " $0; + }' <<< "${curl_output}") + + # return the results via "stdout", "awk" does not do this for some reason. + echo -e "${awk_output}\n" + + # avoid rate limiting as much as possible; nginx: too many requests. + if (( ${#file_array[@]} > 4 )) + then + sleep 5 + fi + done + ;; + + "n"|"N") + return 1 + ;; + + *) + echo -e "\e[01;31mWrong input: '${upload_files}'.\e[0m" >&2 + return 1 + esac +} + export PNPM_HOME="$HOME/.local/share/pnpm" export PATH="$PATH:$HOME/bin:$HOME/.local/bin" export PATH=$PATH:/usr/local/go/bin