#!/bin/sh -e
# ex - archive extractor
# adapted and improved from the commonly circulating version
# detects whether unpacking into a subfolder is sensible
# and shows progress indications for some operations
# optdepends: rewrite(part of my dotfiles, for unzip line rewriting) 7z p7zip unzip
for arg do
case $arg in
	(-d) del=$(expr ${del:-0} + 1);;
	(-*) param="$arg";;
	(*)
	if test -r "$arg"; then
		fullpath="$(realpath "$arg")"
		name="$(basename "${fullpath%.*}")"
		ls --color -dlhF "$name" >&2 2>/dev/null &&
			echo "Target directory exists - archive already extracted?" >&2 &&
			continue
		namepart="$name.part"
		(
		# Create temporary subfolder if current folder contains stuff
		if test "$(ls -U | wc -l)" -gt 2; then
			mkdir -p "$namepart"
			cd "$namepart"
		fi
		echo "Extracting $arg into $PWD"
		case "$arg" in
			(*.tar.*|*.tar) tar --extract --file "$fullpath";;
			(*.tbz2)        tar xjf "$fullpath"   ;;
			(*.tgz)         tar xzf "$fullpath"   ;;
			(*.7z) 7z$(which 7z >/dev/null || echo r) x $param "$fullpath";;
			(*.z01|*.zip|*.jar)
				if which 7z >/dev/null
				then 7z x $param "$fullpath"
				else unzip "$fullpath" | rewrite
				fi;;
			(*.gz)          gunzip "$fullpath"    ;;
			(*.bz2)         bunzip2 "$fullpath"   ;;
			(*.rar)         unrar x "$fullpath"   ;;
			(*.deb)         ar x "$fullpath"      ;;
			(*.zst)         unzstd "$fullpath"    ;;
			(*.Z)           uncompress "$fullpath";;
			(*)             which 7z >/dev/null &&
					  			7z x $param "$fullpath" ||
								echo "'$arg' cannot be extracted by ex" >&2;;
		esac
		# If we created a temporary subfolder, check if it can be eliminated
		if test "$(basename "$PWD")" = "$namepart"
		then if test $# -lt 2 -a "$(ls -U | wc -l)" -lt 3
			then test "$(ls)" && mv -iv * ..
				cd .. && rm -d "$namepart"
			else cd .. && mv -ivT "$namepart" "$name"
			fi
		fi
		case $del in
			(2) rm "$arg";;
			(1) mv -v "$arg" "/tmp";;
		esac
		)
	else
		echo "'$1' is not a readable file"
	fi;;
esac
done
