-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
update-hook: Major overhaul (handling tags, mainly).
This is the update hook we use in all our git-repos. It has some improvements over the original version, namely: * Don't send every commit since dawn of time when adding a new tag. * When updating an annotated tag, just send the diffs since the last tag. * Add diffstat output for 'normal' commits (top) and annotated tags (bottom). * Block un-annotated tags in shared repos. I'm a bit uncertain about that last one, but it demonstrates how to disallow updates of a ref which we use, so I kept it. Note that git-describe is needed for the "changes since last annotated tag" thing to work. Signed-off-by: Andreas Ericsson <ae@op5.se> Signed-off-by: Junio C Hamano <junkio@cox.net>
- Loading branch information
Andreas Ericsson
authored and
Junio C Hamano
committed
Jan 25, 2006
1 parent
dcc6e28
commit 8a3ee7c
Showing
1 changed file
with
65 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,30 +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". | ||
# | ||
|
||
recipient="commit-list@example.com" | ||
project=$(cat $GIT_DIR/description) | ||
recipients="commit-list@somewhere.com commit-list@somewhereelse.com" | ||
|
||
if expr "$2" : '0*$' >/dev/null | ||
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 | ||
echo "Created a new ref, with the following commits:" | ||
git-rev-list --pretty "$3" | ||
# 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 $prev..$3 | diffstat -p1 | ||
echo --- | ||
fi | ||
;; | ||
|
||
refs/heads/*) | ||
branch="${1##refs/heads/}" | ||
echo "New branch '$branch' available with the following commits:" | ||
git-rev-list --pretty "$3" | ||
;; | ||
esac | ||
else | ||
base=$(git-merge-base "$2" "$3") | ||
case "$base" in | ||
"$2") | ||
git diff "$3" "^$base" | diffstat -p1 | ||
echo | ||
echo "New commits:" | ||
;; | ||
*) | ||
echo "Rebased ref, commits from common ancestor:" | ||
;; | ||
esac | ||
git-rev-list --pretty "$3" "^$base" | ||
fi | | ||
mail -s "Changes to ref $1" "$recipient" | ||
fi) | | ||
mail -s "$project: Changes to '${1##refs/heads/}'" $recipients | ||
exit 0 |