Git commit notifications via post-receive hook

Now that we moved our Git repositories to SourceForge, we don't need to
maintain local clones for generating commit notifications anymore, as
SourceForge provides shell access to the repositories.  Instead, we now
run git-notify as a post-receive hook on the SourceForge server.
Actually, we use a wrapper which executes git-notify with the desired
options and which makes it easy to add other post-receive hooks in the
future.
This commit is contained in:
Holger Weiss 2009-11-07 10:40:22 +01:00
parent c3e2186b15
commit 2b442ff177
2 changed files with 23 additions and 94 deletions

23
tools/git-post-receive-hook Executable file
View file

@ -0,0 +1,23 @@
#!/bin/sh
prefix="${0%/*}/notifications" # $GIT_DIR/hooks/notifications
recipient='Nagios Plugin Commits <nagiosplug-checkins@lists.sourceforge.net>'
maxcommits=100
maxdiffsize=$((300 * 1024))
gitweburl='http://nagiosplug.git.sf.net/git/gitweb.cgi?p=nagiosplug'
gitnotify="$prefix/git-notify.pl"
statefile="$prefix/git-notify.dat"
exec "$gitnotify" \
-m "$recipient" \
-n "$maxcommits" \
-s "$maxdiffsize" \
-t "$statefile" \
-u "$gitweburl" \
-A \
-C \
-H \
-S \
-T \
-X \
-z

View file

@ -1,94 +0,0 @@
#!/bin/sh
#
# Copyright (c) 2009 Nagios Plugins Development Team
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
set -u
prefix='/home/git'
PATH="$prefix/opt/git/bin:/bin:/usr/bin"
export PATH
gitnotify="$prefix/libexec/git-notify"
recipient='Nagios Plugins Commit List <nagiosplug-checkins@lists.sourceforge.net>'
maxcommits=100
maxdiffsize=$((300 * 1024))
gitweburl='http://repo.or.cz/w'
tempprefix='/dev/shm'
fourtyzeros=$(printf '%.40u' 0)
myself=${0##*/}
checkrefs()
{
turn=$1
git show-ref | while read object ref
do
refdir="$tempdir/${ref%/*}"
reffile="$tempdir/$ref"
if [ $turn -eq 2 -a -f "$reffile" ] \
&& grep "^1 $object$" "$reffile" >'/dev/null'
then # The ref has not been modified.
rm -f "$reffile"
else
mkdir -p "$refdir"
echo "$turn $object" >>"$reffile"
fi
done
}
if [ $# -lt 1 ]
then
echo >&2 "Usage: $myself <repository> ..."
exit 1
fi
tempdir=$(mktemp -d "$tempprefix/$myself.XXXXXX")
tempfile=$(mktemp "$tempprefix/$myself.XXXXXX")
trap 'rm -rf "$tempdir" "$tempfile"' EXIT
for repository in "$@"
do
cd "$repository"
checkrefs 1
if ! git remote update --prune >"$tempfile" 2>&1
then
cat >&2 "$tempfile"
exit 1
fi
git fetch --quiet --tags
checkrefs 2
find "$tempdir" -type 'f' -print | while read reffile
do
ref=${reffile#$tempdir/}
old=$(awk '$1 == "1" { print $2; exit }' "$reffile")
new=$(awk '$1 == "2" { print $2; exit }' "$reffile")
old=${old:-$fourtyzeros}
new=${new:-$fourtyzeros}
echo "$old" "$new" "$ref"
done | $gitnotify \
-m "$recipient" \
-n "$maxcommits" \
-s "$maxdiffsize" \
-u "$gitweburl"
cd "$OLDPWD"
done