aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--deployment/repositories/manifests/subversion.pp1
-rw-r--r--modules/subversion/manifests/repository.pp31
-rw-r--r--modules/subversion/templates/nonmaintainer_notify.sh60
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