1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
#!/usr/bin/env bash
init_variables() {
COMMAND=${0#*-}
REPLACE=false
unset ID
unset MSG
}
usage() {
cat << EOF
usage: git ${COMMAND} [<options>] <id> [<messages>]
Options:
-r, --replace replace all previous stamps with same id
EOF
}
error() {
if [[ -n "$1" ]]; then
echo "error: $1" >&2
fi
usage
exit 1
}
stamp() {
local commit_msg=$( git log -1 --pretty=%B )
local stamp_msg
[[ -n "${MSG}" ]] && stamp_msg="${ID} ${MSG}" || stamp_msg="${ID}"
if ${REPLACE}; then
# remove previous stamps with same ID from the commit message
commit_msg=$(
echo "${commit_msg}" \
| grep --ignore-case --invert-match "^${ID}\b" \
| cat -s
)
fi
# append the stamp to the commit message in a new paragraph
git commit --amend \
--message "${commit_msg}" \
--message "${stamp_msg}" \
> /dev/null
# show result
git log -1 --pretty=full
}
parse_options() {
while [[ "$#" -gt 0 ]]; do
case "$1" in
-h)
usage
exit 0
;;
--replace|-r)
REPLACE=true
shift
;;
*)
break
;;
esac
done
ID="$1"
MSG="${*:2}"
}
validate_options() {
# ID should be set to non-empty string
if [[ -z "${ID}" ]]; then
error "missing stamp identifier"
fi
}
init_variables
parse_options "$@"
validate_options
stamp
|