From b53818ffd84cf53c858492eb879a49a92bf65d27 Mon Sep 17 00:00:00 2001 From: Mathias Bynens Date: Wed, 1 May 2013 11:12:35 +0200 Subject: .functions: Improve `targz` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Only use `zopfli` when it’s available and if the `.tar` file is smaller than 50 MB. * Use `pigz` instead of `gzip` when it’s available. * Always exclude `.DS_Store` files when creating a tarball. Closes #199. --- .functions | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) (limited to '.functions') diff --git a/.functions b/.functions index da26384..c16972c 100644 --- a/.functions +++ b/.functions @@ -26,18 +26,32 @@ function cdf() { # short for `cdfinder` cd "$(osascript -e 'tell app "Finder" to POSIX path of (insertion location as alias)')" } -# Create a .tar.gz archive, using `zopfli` or `gzip` for compression +# Create a .tar.gz archive, using `zopfli`, `pigz` or `gzip` for compression function targz() { - if zopfli > /dev/null 2>&1; then + local tmpFile="${@}.tar" + tar -cvf "${tmpFile}" --exclude=".DS_Store" "${@}" || return 1 + + size=$( + stat -f"%z" "${tmpFile}" 2> /dev/null; # OS X `stat` + stat -c"%s" "${tmpFile}" 2> /dev/null # GNU `stat` + ) + + local cmd="" + if (( size < 52428800 )) && hash zopfli 2> /dev/null; then + # the .tar file is smaller than 50 MB and Zopfli is available; use it cmd="zopfli" else - cmd="gzip" + if hash pigz 2> /dev/null; then + cmd="pigz" + else + cmd="gzip" + fi fi - local tmpFile="${1}.tar" - tar -cvf "${tmpFile}" "${1}" && - "${cmd}" "${tmpFile}" && - rm "${tmpFile}" 2> /dev/null && - echo "${tmpFile}.gz created successfully (compressed using \`${cmd}\`)." + + echo "Compressing .tar using \`${cmd}\`…" + "${cmd}" -v "${tmpFile}" || return 1 + [ -f "${tmpFile}" ] && rm "${tmpFile}" + echo "${tmpFile}.gz created successfully." } # Determine size of a file or total size of a directory -- cgit v1.2.3