diff options
Diffstat (limited to 'tools/git-update-mirror')
-rwxr-xr-x | tools/git-update-mirror | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/tools/git-update-mirror b/tools/git-update-mirror new file mode 100755 index 00000000..1c6eea55 --- /dev/null +++ b/tools/git-update-mirror @@ -0,0 +1,94 @@ +#!/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 | sed 's!^\./!!' | 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 |