#!/bin/sh -eu # shellcheck source=./lib.sh . "$(dirname -- "$0")/lib.sh" usage() { abort "usage: tm commit-tree [-p ]... " } parents= while getopts p: opt; do case "$opt" in p) ref="$(tm resolve-ref "$OPTARG")" \ || abort "error: invalid ref $OPTARG" parents="$parents $ref" ;; ?) usage ;; esac done shift "$((OPTIND - 1))" if [ $# -ne 1 ]; then usage fi set +u [ -z "$TM_AUTHOR" ] && abort "error: TM_AUTHOR unset" set -u TM_COMMITTER="${TM_COMMITTER:-$TM_AUTHOR}" # POSIX equivalent of date -u +%s. Enjoy your nightmares TM_DATE="${TM_DATE:-$(($(date -u +"((%Y-1600)*365+(%Y-1601)/4-(%Y-1601)/100+(%Y-1601)/400+1%j-1000-135140)*86400+(1%H-100)*3600+(1%M-100)*60+(1%S-100)")))}" tmp="$TMPDIR/commit-tree" printf 'commit\n' >>"$tmp" ref="$(tm resolve-ref "$1")" || abort "error: invalid ref $1" printf "tree %s\n" "$ref" >>"$tmp" for parent in $parents; do printf "parent %s\n" "$parent" >>"$tmp" done printf 'author %s\ncomitter %s\ndate %s\n' "$TM_AUTHOR" \ "$TM_COMMITTER" "$TM_DATE" >>"$tmp" tty >/dev/null && printf 'Commit subject:\n' >&2 IFS= read -r "subject" [ "$(printf "%s" "$subject" | wc -c)" -gt 72 ] \ && abort "error: subject is longer than 72 chars" [ "$(printf "%s" "$subject" | wc -c)" -gt 50 ] \ && echo "warning: subject is longer than 50 chars" printf '%s\n' "$subject" >>"$tmp" tty >/dev/null && printf 'Commit message:\n' >&2 cat >>"$tmp" write <"$tmp"