#!/bin/bash # # Copyright (c) 2007 Andy Parkins # Copyright (c) 2008 Stephen Haberman # Copyright (c) 2013 Olivier Matz # # Based on post-receive-email # # This hook clone and pull the repoditory each time a commit is pushed # in the tree. Each branch will be delivered in # ${GIT_DELIVER_DIRECTORY}/branch. # ---------------------------- Functions . $(dirname $0)/functions generate_delivery() { # --- Arguments oldrev=$(git rev-parse $1) newrev=$(git rev-parse $2) refname="$3" set_change_type set_rev_types set_describe_tags # The revision type tells us what type the commit is, combined with # the location of the ref we can decide between # - working branch # - tracking branch # - unannoted tag # - annotated tag case "$refname","$rev_type" in refs/heads/*,commit) # branch refname_type="branch" function="branch" branch=${refname##refs/heads/} ;; *) # nothing to do return ;; esac if expr "$newrev" : '0*$' >/dev/null; then # nothing to do, branch is deleted return fi dstdir=${GIT_DELIVER_DIRECTORY}/${branch} if [ ! -d ${dstdir} ]; then mkdir -p ${GIT_DELIVER_DIRECTORY} || exit 2 cd ${GIT_DELIVER_DIRECTORY} git clone --branch ${branch} ${GIT_DIR} ${branch} else cd ${dstdir} unset GIT_DIR git pull --rebase fi } # ---------------------------- main() # --- Config # Set GIT_DIR either from the working directory or the environment variable. GIT_DIR=$(git rev-parse --git-dir 2>/dev/null) if [ -z "$GIT_DIR" ]; then echo >&2 "fatal: post-receive: GIT_DIR not set" exit 1 fi GIT_DIR=$(readlink -e ${GIT_DIR}) export GIT_DIR if [ -z "${GIT_DELIVER_DIRECTORY}" ]; then echo >&2 "fatal: GIT_DELIVER_DIRECTORY not set" exit 1 fi recipients=$(git config hooks.post-receive-email.mailinglist) # --- Main loop # Allow dual mode: run from the command line just like the update hook, or # if no arguments are given then run as a hook script if [ -n "$1" -a -n "$2" -a -n "$3" ]; then # Output to the terminal in command line mode - if someone wanted to # resend an email; they could redirect the output to sendmail # themselves PAGER= generate_delivery $2 $3 $1 else while read oldrev newrev refname do generate_delivery $oldrev $newrev $refname done fi