#!/bin/sh # # fbi-announce — announce Git commits to the FBI mail-to-IRC gateway # # Copyright (c) 2006 Fernando J. Pereda # Copyright (c) 2008 Joerg Jaspert # Copyright © 2009–2010 martin f. krafft # # Distributed under the terms of the GNU General Public License v2 # # This script is based on Git ciabot.pl by Petr Baudis. # # # # The script is meant to be configured using git-config with the following keys: # hooks.fbi-project the project name known to FBI # hooks.fbi-component an optional component name # hooks.fbi-url-template the template to the gitweb URL (containing @@sha1@@) # hooks.fbi-emailsender the sender address to use in the email # hooks.fbi-emailcc carbon-copy recipients (comma-separated) if the message # hooks.fbi-refwidth the width of references to show (default 7) # hooks.fbi-noisy include the entire log message in the announcement # hooks.fbi-msg-template the template for the message to be sent (default: # {@@component@@/}@@project@@[@@ref@@]: @@author@@: \ # @@logmessage@@ [@@url@@]) # # The hook is meant ot be run from the Git post-receive hook. # set -eu # we need to ensure we know $GIT_DIR for the git-config calls GIT_DIR=$(git rev-parse --git-dir 2>/dev/null) if [ -z "$GIT_DIR" ]; then echo >&2 "E: post-receive: GIT_DIR not set" exit 1 fi export GIT_DIR project=$(git config hooks.fbi-project 2>/dev/null) || { echo >&2 "E: FBI project not set (hooks.fbi-project)" exit 1 } component=$(git config hooks.fbi-component 2>/dev/null ||:) url=$(git config hooks.fbi-url-template 2>/dev/null ||:) noisy=$(git config hooks.fbi-noisy 2>/dev/null || echo false) from=$(git config hooks.fbi-emailsender 2>/dev/null ||:) to="commit@commit.ganneff.de" #TODO: possibly factor out to config cc=$(git config hooks.fbi-emailcc 2>/dev/null ||:) # mail submission client to use if [ -n "${FBI_ANNOUNCE_TO_STDOUT:-}" ]; then sendmail="cat" echo >&2 'I: outputting to stdout since $FBI_ANNOUNCE_TO_STDOUT is set.' else sendmail="/usr/sbin/sendmail -t" fi if [ $# -eq 0 ] ; then # figure out refs from HEAD since they aren't passed refname=$(git symbolic-ref HEAD 2>/dev/null) merged=$(git rev-parse HEAD) else refname=$1 merged=$(git rev-parse $2) fi refname=${refname##refs/heads/} refwidth=$(git config hooks.fbi-refwidth 2>/dev/null || echo 7) ref=$(git describe ${merged} 2>/dev/null || echo ${merged} | cut -c1-${refwidth}) url=$(echo "$url" | sed -e "s,@@sha1@@,${merged},") rawcommit=$(git cat-file commit ${merged}) author=$(echo "${rawcommit}" | sed -rne 's,^author (.+) <.*,\1,p') logmessage=$(echo "${rawcommit}" | sed -e '1,/^$/d') ${noisy} || logmessage=$(echo "${logmessage}" | head -n2) ts=$(echo "${rawcommit}" | sed -n -e '/^author .*> \([0-9]\+\).*$/s--\1-p') ts=$(date -d "@${ts}") msg=$(git config hooks.fbi-msg-template 2>/dev/null ||:) if [ -z "${msg}" ]; then msg="${component:+$component/}${refname}[${ref}]: ${author}: ${logmessage} [${url}]" else msg=$(echo "$msg" | sed -re 's,@@([^@]+)@@,${\1},g') eval "msg=\"$msg\"" fi # trim $msg of empty []'s in case no URL was provided, might be better done in # the above by making the generation conditional, but this will also do for # now. msg="${msg% []}" ${sendmail} <<_eom ${from:+From: ${from} }To: ${to} ${cc:+Cc: ${cc} }Subject: Announce ${project} Message-Id: Content-type: text/plain; charset=utf-8 ${msg} _eom