diff options
Diffstat (limited to 'templates/hooks--update')
-rw-r--r-- | templates/hooks--update | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/templates/hooks--update b/templates/hooks--update new file mode 100644 index 0000000000..76d5ac2477 --- /dev/null +++ b/templates/hooks--update @@ -0,0 +1,89 @@ +#!/bin/sh +# +# An example hook script to mail out commit update information. +# It also blocks tags that aren't annotated. +# Called by git-receive-pack with arguments: refname sha1-old sha1-new +# +# To enable this hook: +# (1) change the recipient e-mail address +# (2) make this file executable by "chmod +x update". +# + +project=$(cat $GIT_DIR/description) +recipients="commit-list@somewhere.com commit-list@somewhereelse.com" + +ref_type=$(git cat-file -t "$3") + +# Only allow annotated tags in a shared repo +# Remove this code to treat dumb tags the same as everything else +case "$1","$ref_type" in +refs/tags/*,commit) + echo "*** Un-annotated tags are not allowed in this repo" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." + exit 1;; +refs/tags/*,tag) + echo "### Pushing version '${1##refs/tags/}' to the masses" >&2 + # recipients="release-announce@somwehere.com announce@somewhereelse.com" + ;; +esac + +# set this to 'cat' to get a very detailed listing. +# short only kicks in when an annotated tag is added +short='git shortlog' + +# see 'date --help' for info on how to write this +# The default is a human-readable iso8601-like format with minute +# precision ('2006-01-25 15:58 +0100' for example) +date_format="%F %R %z" + +(if expr "$2" : '0*$' >/dev/null +then + # new ref + case "$1" in + refs/tags/*) + # a pushed and annotated tag (usually) means a new version + tag="${1##refs/tags/}" + if [ "$ref_type" = tag ]; then + eval $(git cat-file tag $3 | \ + sed -n '4s/tagger \([^>]*>\)[^0-9]*\([0-9]*\).*/tagger="\1" ts="\2"/p') + date=$(date --date="1970-01-01 00:00:00 $ts seconds" +"$date_format") + echo "Tag '$tag' created by $tagger at $date" + git cat-file tag $3 | sed -n '5,$p' + echo + fi + prev=$(git describe "$3^" | sed 's/-g.*//') + # the first tag in a repo will yield no $prev + if [ -z "$prev" ]; then + echo "Changes since the dawn of time:" + git rev-list --pretty $3 | $short + else + echo "Changes since $prev:" + git rev-list --pretty $prev..$3 | $short + echo --- + git diff --stat $prev..$3 + echo --- + fi + ;; + + refs/heads/*) + branch="${1##refs/heads/}" + echo "New branch '$branch' available with the following commits:" + git-rev-list --pretty "$3" $(git-rev-parse --not --all) + ;; + esac +else + base=$(git-merge-base "$2" "$3") + case "$base" in + "$2") + git diff --stat "$3" "^$base" + echo + echo "New commits:" + ;; + *) + echo "Rebased ref, commits from common ancestor:" + ;; + esac + git-rev-list --pretty "$3" "^$base" +fi) | +mail -s "$project: Changes to '${1##refs/heads/}'" $recipients +exit 0 |