#!/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"