#!/bin/bash # Send an e-mail to the maintainer of a package someone else has committed to. # Exit on any error set -e set -o pipefail # Maximum number of packages changed in a single commit and still notify people readonly MAXCHANGES=10 # Location of the maintdb database readonly MAINTDB=/var/www/bs/data/maintdb.txt # Repository base directory readonly REPOS="$1" # Revision of the change readonly REV="$2" # Author of the commit readonly AUTHOR="$(svnlook author -r "$REV" "$REPOS")" if [[ "$AUTHOR" == "schedbot" || "$AUTHOR" == "umeabot" ]]; then # We don't send any e-mails from these automated committers exit 0 fi PKGSLIST="$(mktemp)" trap 'rm -f "$PKGSLIST"' EXIT # Only look at changes in package files svnlook changed -r "$REV" "$REPOS" | \ sed 's/^....//' | \ pcregrep -o1 -o2 '^(?:(?:cauldron|misc)/([-+._a-zA-Z0-9]+)/)|(?:(?:updates|backports)/(?:[^/ ]+)/([-+._a-zA-Z0-9]+))' | \ sort -u > "$PKGSLIST" if [[ "$(wc -l "$PKGSLIST" | awk '{print $1}')" -gt "$MAXCHANGES" ]]; then # A bunch of directories were changed at once, possibly in some kind of # bulk operation. Ignore these entirely to avoid spamming people. echo Too many packages were changed. Not notifying the maintainers. 1>&2 exit 0 fi # Send up to one e-mail per package modified in the commit for PACKAGE in $(cat "$PKGSLIST"); do MAINTAINER="$(awk '{if ($1 == "'"$PACKAGE"'") {print $2; exit;}}' "$MAINTDB")" # Only notify if the commit author is not the maintainer if [[ -n "$MAINTAINER" && "$MAINTAINER" != "nobody" && "$MAINTAINER" != "$AUTHOR" ]]; then svnnotify \ --repos-path "$REPOS" \ --revision "$REV" \ --subject-cx \ --no-first-line \ --handler Alternative \ --alternative HTML::ColorDiff \ --header "The user $AUTHOR has submitted a change to a package for which you ($MAINTAINER) are the registered maintainer." \ --revision-url "https://svnweb.<%= @domain %>/packages/?revision=%s&view=revision" \ --author-url "https://people.<%= @domain %>/u/%s.html" \ --to "$MAINTAINER@<%= @domain %>" \ --from "subversion_noreply@ml.<%= @domain %>" fi done