aboutsummaryrefslogtreecommitdiff
#!/bin/sh
set -eu


usage() {
	cat <<-'EOF'
		Usage:
		  @NAME@ [-p PROFILE] -- COMMAND...
		  @NAME@ -h|-V
	EOF
}

help() {
	cat <<-'EOF'

		Options:
		  -p PROFILE       profile to be used for gathering and storing
		                   data (default: create one based on $PWD)
		  -h, --help       show this message
		  -V, --version    print the version number

		  COMMAND          command to be ran, reading from
		                   STDIN, writing to STDOUT


		Explanation FIXME.

		See "man @NAME@" for more information.


		Examples:

		  FIXME:

		    $ FIXME
	EOF
}

version() {
	printf '%s %s %s\n' '@NAME@' '@VERSION@' '@DATE@'
}


uuid() {
	od -xN20 /dev/urandom |
		head -n1 |
		awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'
}

tmpname() {
	echo "${TMPDIR:-/tmp}/@NAME@.tmpfile.$(uuid)"
}

mkstemp() {
	name="$(tmpname)"
	touch "$name"
	echo "$name"
}


for flag in "$@"; do
	case "$flag" in
		--)
			break
			;;
		--help)
			usage
			help
			exit
			;;
		--version)
			version
			exit
			;;
		*)
			;;
	esac
done

PROFILE_NAME="$(pwd | tr '/' '!')"
while getopts 'p:hV' flag; do
	case "$flag" in
		p)
			PROFILE_NAME="$OPTARG"
			;;
		h)
			usage
			help
			exit
			;;
		V)
			version
			exit
			;;
		*)
			usage >&2
			exit 2
			;;
	esac
done
shift $((OPTIND - 1))


if [ $# = 0 ]; then
	printf 'Missing "-- COMMAND"\n' >&2
	usage >&2
	exit 2
fi

NAME='@NAME@'
PROFILE="${XDG_DATA_HOME:-$HOME/.local/share}"/$NAME/"$PROFILE_NAME"

if [ ! -e "$PROFILE" ]; then
	mkdir -p "$(dirname "$PROFILE")"
	touch "$PROFILE"
fi

NEXT_PROFILE="$PROFILE".tmp
MERGED="$(mkstemp)"
FILTERED="$(mkstemp)"
trap 'rm -f "$NEXT_PROFILE" "$MERGED" "$FILTERED"' EXIT
CHOICE="$(
	cat - |
		sed 's/^/0 stdin /' |
		sort -k3 -k1nr - "$PROFILE" |
		tee "$MERGED" |
		awk '
			{ rest = substr($0, 3 + length($1) + length($2)) }
			$2 == "profile" { seen[rest] += $1 }
			$2 == "stdin"   { printf "%s %s\n", seen[rest]+0, rest }
		' |
		sort -k1nr |
		cut -d' ' -f2- |
		"$@"
)"

if [ -z "$CHOICE" ]; then
	exit
fi

< "$MERGED" \
	cut -d' ' -f1,3- |
	uniq -f1 |
	awk -vCHOICE="$CHOICE" '
		BEGIN { inc = 1 }

		{ rest = substr($0, 2 + length($1)) }

		rest == CHOICE {
			printf "%s profile %s\n", $1 + inc, rest
			found = 1
			next
		}

		{ printf "%s profile %s\n", $1, rest }

		END {
			if (!found) {
				printf "%s profile %s\n", 0 + inc, CHOICE
			}
		}
	' > "$NEXT_PROFILE"

mv "$NEXT_PROFILE" "$PROFILE"
printf '%s\n' "$CHOICE"