diff options
| -rw-r--r-- | deployment/repositories/manifests/subversion.pp | 1 | ||||
| -rw-r--r-- | modules/subversion/manifests/repository.pp | 31 | ||||
| -rw-r--r-- | modules/subversion/templates/nonmaintainer_notify.sh | 60 |
3 files changed, 82 insertions, 10 deletions
diff --git a/deployment/repositories/manifests/subversion.pp b/deployment/repositories/manifests/subversion.pp index 742efe67..4c4ef847 100644 --- a/deployment/repositories/manifests/subversion.pp +++ b/deployment/repositories/manifests/subversion.pp @@ -51,6 +51,7 @@ class repositories::subversion { group => 'mga-packagers-committers', no_binary => true, commit_mail => ["packages-commits@ml.${::domain}"], + nonmaintainer_mail => true, } subversion::repository { '/svn/test-irker/': diff --git a/modules/subversion/manifests/repository.pp b/modules/subversion/manifests/repository.pp index b223e6ae..927ecfa1 100644 --- a/modules/subversion/manifests/repository.pp +++ b/modules/subversion/manifests/repository.pp @@ -22,7 +22,8 @@ define subversion::repository($group = 'svn', $no_binary = false, $restricted_to_user = false, $syntax_check = '', - $extract_dir = '') { + $extract_dir = '', + $nonmaintainer_mail = false) { # check permissions # https://svnbook.red-bean.com/nightly/fr/svn.serverconfig.multimethod.html # $name ==> directory of the repo @@ -108,16 +109,26 @@ define subversion::repository($group = 'svn', } } - if $extract_dir { - subversion::hook::post_commit {"${name}|extract_dir": - content => template('subversion/hook_extract.pl'), - require => [Package['perl-SVN-Notify-Mirror']], - } - } else { - file { "${name}/hooks/post-commit.d/extract_dir": - ensure => absent, - } + if $extract_dir { + subversion::hook::post_commit {"${name}|extract_dir": + content => template('subversion/hook_extract.pl'), + require => [Package['perl-SVN-Notify-Mirror']], } + } else { + file { "${name}/hooks/post-commit.d/extract_dir": + ensure => absent, + } + } + + if $nonmaintainer_mail { + subversion::hook::post_commit { "${name}|nonmaintainer_mail": + content => template('subversion/nonmaintainer_notify.sh'), + } + } else { + file { "${name}/hooks/post-commit.d/nonmaintainer_mail": + ensure => absent, + } + } pre_commit_link { "${name}/hooks/pre-commit.d/no_empty_message": } diff --git a/modules/subversion/templates/nonmaintainer_notify.sh b/modules/subversion/templates/nonmaintainer_notify.sh new file mode 100644 index 00000000..e98d44be --- /dev/null +++ b/modules/subversion/templates/nonmaintainer_notify.sh @@ -0,0 +1,60 @@ +#!/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 dirs-changed -r "$REV" "$REPOS" | \ +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}' "$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 HTML::ColorDiff \ + --header "The user $AUTHOR has submitted a change to a package for which you 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 |
