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