#!/bin/sh
# Mount a partition by label or device identifier automatically
set -eo pipefail
_help="$0 <device> [mountpoint] [options...]"
case $1 in
	("") # TODO include size
		arg=$(lsblk --list --noheadings --output name,label,fstype,mountpoint |
			grep -v '/' | grep ".\+ [^ ]\+" | fzf --select-1 --exit-0 |
			sed "s/^\([^ ]\+ \+\)\?\([^ ]\+\) \+[^ ]\+ *$/\2/");;
	("--help") echo "$_help" && exit 0;;
	("-u") shift
		for last; do true; done
		sudo umount --verbose "$@"
		code=$?
		sudo rm -df "$last"
		exit $code;;
	(*) arg=$1;;
esac

# FSTAB: BY LABEL
if grep --word-regexp "LABEL=$arg" /etc/fstab
then # have to mount twice as the first one might be creating the directory
	mount -L "$@" 2>/dev/null || mount -L "$@"
	exit $?
fi
# FSTAB: BY MOUNTPOINT/NAME
if grep --word-regexp "$arg" /etc/fstab
then mount "$@"; exit $?
fi

# MANUALLY
mountpoint="${2:-${MNT:-${XDG_RUNTIME_DIR}/mnt}/$(basename "$arg")}"
if grep -e "[^\w=/]$mountpoint[^\w/]" /etc/fstab
then test $# -gt 0 && shift
	 mount "$mountpoint" "$@"
	 code=$?
	 cd $mountpoint
	 exit $code
fi
case "$arg" in
	(sd*|loop*|nvme*|mm*|md*|dm*|vg*) partition="/dev/$arg";;
	(/dev/*) partition="$arg";;
	(*) partition="-L $arg";;
esac
shift $(expr 2 \& $# \> 2 \| $#)
#uid=$(id --user),gid=$(id --group), \
if ! mountpoint "$mountpoint" 2>/dev/null
then mp="/run/media/$USER/$arg" && test -e "$mp" && mountpoint="$mp"
	sudo mount -vo users,X-mount.mkdir,noatime,umask=003,gid=users,uid=$USER $partition $mountpoint "$@"
fi
cd $mountpoint
exec $SHELL
