aboutsummaryrefslogtreecommitdiffstats
path: root/modules/subversion/templates
diff options
context:
space:
mode:
Diffstat (limited to 'modules/subversion/templates')
-rw-r--r--modules/subversion/templates/ciabot_svn.py398
-rwxr-xr-xmodules/subversion/templates/ciabot_svn.sh125
-rw-r--r--modules/subversion/templates/converted_to_git16
-rw-r--r--modules/subversion/templates/hook_commit.sh5
-rw-r--r--modules/subversion/templates/hook_irker4
-rw-r--r--modules/subversion/templates/hook_sendmail.pl12
-rw-r--r--modules/subversion/templates/irker.conf7
-rw-r--r--modules/subversion/templates/no_binary2
-rw-r--r--modules/subversion/templates/nonmaintainer_notify.sh60
-rw-r--r--modules/subversion/templates/restricted_to_user2
-rw-r--r--modules/subversion/templates/xinetd1
11 files changed, 101 insertions, 531 deletions
diff --git a/modules/subversion/templates/ciabot_svn.py b/modules/subversion/templates/ciabot_svn.py
deleted file mode 100644
index ab7828b4..00000000
--- a/modules/subversion/templates/ciabot_svn.py
+++ /dev/null
@@ -1,398 +0,0 @@
-#!/usr/bin/env python
-#
-# This is a CIA client script for Subversion repositories, written in python.
-# It generates commit messages using CIA's XML format, and can deliver them
-# using either XML-RPC or email. See below for usage and cuztomization
-# information.
-#
-# --------------------------------------------------------------------------
-#
-# Copyright (c) 2004-2007, Micah Dowty
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# * The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# --------------------------------------------------------------------------
-#
-# This script is cleaner and much more featureful than the shell
-# script version, but won't work on systems without Python.
-#
-# To use the CIA bot in your Subversion repository...
-#
-# 1. Customize the parameters below
-#
-# 2. This script should be called from your repository's post-commit
-# hook with the repository and revision as arguments. For example,
-# you could copy this script into your repository's "hooks" directory
-# and add something like the following to the "post-commit" script,
-# also in the repository's "hooks" directory:
-#
-# REPOS="$1"
-# REV="$2"
-# $REPOS/hooks/ciabot_svn.py "$REPOS" "$REV" &
-#
-# Or, if you have multiple project hosted, you can add each
-# project's name to the commandline in that project's post-commit
-# hook:
-#
-# $REPOS/hooks/ciabot_svn.py "$REPOS" "$REV" "ProjectName" &
-#
-############# There are some parameters for this script that you can customize:
-
-class config:
- # Replace this with your project's name, or always provide a project
- # name on the commandline.
- #
- # NOTE: This shouldn't be a long description of your project. Ideally
- # it is a short identifier with no spaces, punctuation, or
- # unnecessary capitalization. This will be used in URLs related
- # to your project, as an internal identifier, and in IRC messages.
- # If you want a longer name shown for your project on the web
- # interface, please use the "title" metadata key rather than
- # putting that here.
- #
- project = "Mageia"
-
- # Subversion's normal directory hierarchy is powerful enough that
- # it doesn't have special methods of specifying modules, tags, or
- # branches like CVS does. Most projects do use a naming
- # convention though that works similarly to CVS's modules, tags,
- # and branches.
- #
- # This is a list of regular expressions that are tested against
- # paths in the order specified. If a regex matches, the 'branch'
- # and 'module' groups are stored and the matching section of the
- # path is removed.
- #
- # Several common directory structure styles are below as defaults.
- # Uncomment the ones you're using, or add your own regexes.
- # Whitespace in the each regex are ignored.
-
- pathRegexes = [
- # r"^ trunk/ (?P<module>[^/]+)/ ",
- # r"^ (branches|tags)/ (?P<branch>[^/]+)/ ",
- # r"^ (branches|tags)/ (?P<module>[^/]+)/ (?P<branch>[^/]+)/ ",
- ]
-
- # If your repository is accessible over the web, put its base URL here
- # and 'uri' attributes will be given to all <file> elements. This means
- # that in CIA's online message viewer, each file in the tree will link
- # directly to the file in your repository.
- repositoryURI = None
-
- # If your repository is accessible over the web via a tool like ViewVC
- # that allows viewing information about a full revision, put a format string
- # for its URL here. You can specify various substitution keys in the Python
- # syntax: "%(project)s" is replaced by the project name, and likewise
- # "%(revision)s" and "%(author)s" are replaced by the revision / author.
- # The resulting URI is added to the data sent to CIA. After this, in CIA's
- # online message viewer, the commit will link directly to the corresponding
- # revision page.
- revisionURI = None
- # Example (works for ViewVC as used by SourceForge.net):
- #revisionURI = "https://svn.sourceforge.net/viewcvs.cgi/%(project)s?view=rev&rev=%(revision)s"
-
- # This can be the http:// URI of the CIA server to deliver commits over
- # XML-RPC, or it can be an email address to deliver using SMTP. The
- # default here should work for most people. If you need to use e-mail
- # instead, you can replace this with "cia@cia.navi.cx"
- server = "http://cia.navi.cx"
-
- # The SMTP server to use, only used if the CIA server above is an
- # email address.
- smtpServer = "localhost"
-
- # The 'from' address to use. If you're delivering commits via email, set
- # this to the address you would normally send email from on this host.
- fromAddress = "cia-user@localhost"
-
- # When nonzero, print the message to stdout instead of delivering it to CIA.
- debug = 0
-
-
-############# Normally the rest of this won't need modification
-
-import sys, os, re, urllib, getopt
-
-class File:
- """A file in a Subversion repository. According to our current
- configuration, this may have a module, branch, and URI in addition
- to a path."""
-
- # Map svn's status letters to our action names
- actionMap = {
- 'U': 'modify',
- 'A': 'add',
- 'D': 'remove',
- }
-
- def __init__(self, fullPath, status=None):
- self.fullPath = fullPath
- self.path = fullPath
- self.action = self.actionMap.get(status)
-
- def getURI(self, repo):
- """Get the URI of this file, given the repository's URI. This
- encodes the full path and joins it to the given URI."""
- quotedPath = urllib.quote(self.fullPath)
- if quotedPath[0] == '/':
- quotedPath = quotedPath[1:]
- if repo[-1] != '/':
- repo = repo + '/'
- return repo + quotedPath
-
- def makeTag(self, config):
- """Return an XML tag for this file, using the given config"""
- attrs = {}
-
- if config.repositoryURI is not None:
- attrs['uri'] = self.getURI(config.repositoryURI)
-
- if self.action:
- attrs['action'] = self.action
-
- attrString = ''.join([' %s="%s"' % (key, escapeToXml(value,1))
- for key, value in attrs.items()])
- return "<file%s>%s</file>" % (attrString, escapeToXml(self.path))
-
-
-class SvnClient:
- """A CIA client for Subversion repositories. Uses svnlook to
- gather information"""
- name = 'Python Subversion client for CIA'
- version = '1.20'
-
- def __init__(self, repository, revision, config):
- self.repository = repository
- self.revision = revision
- self.config = config
-
- def deliver(self, message):
- if config.debug:
- print message
- else:
- server = self.config.server
- if server.startswith('http:') or server.startswith('https:'):
- # Deliver over XML-RPC
- import xmlrpclib
- xmlrpclib.ServerProxy(server).hub.deliver(message)
- else:
- # Deliver over email
- import smtplib
- smtp = smtplib.SMTP(self.config.smtpServer)
- smtp.sendmail(self.config.fromAddress, server,
- "From: %s\r\nTo: %s\r\n"
- "Subject: DeliverXML\r\n\r\n%s" %
- (self.config.fromAddress, server, message))
-
- def main(self):
- self.collectData()
- self.deliver("<message>" +
- self.makeGeneratorTag() +
- self.makeSourceTag() +
- self.makeBodyTag() +
- "</message>")
-
- def makeAttrTags(self, *names):
- """Given zero or more attribute names, generate XML elements for
- those attributes only if they exist and are non-None.
- """
- s = ''
- for name in names:
- if hasattr(self, name):
- v = getattr(self, name)
- if v is not None:
- # Recent Pythons don't need this, but Python 2.1
- # at least can't convert other types directly
- # to Unicode. We have to take an intermediate step.
- if type(v) not in (type(''), type(u'')):
- v = str(v)
-
- s += "<%s>%s</%s>" % (name, escapeToXml(v), name)
- return s
-
- def makeGeneratorTag(self):
- return "<generator>%s</generator>" % self.makeAttrTags(
- 'name',
- 'version',
- )
-
- def makeSourceTag(self):
- return "<source>%s</source>" % self.makeAttrTags(
- 'project',
- 'module',
- 'branch',
- )
-
- def makeBodyTag(self):
- return "<body><commit>%s%s</commit></body>" % (
- self.makeAttrTags(
- 'revision',
- 'author',
- 'log',
- 'diffLines',
- 'url',
- ),
- self.makeFileTags(),
- )
-
- def makeFileTags(self):
- """Return XML tags for our file list"""
- return "<files>%s</files>" % ''.join([file.makeTag(self.config)
- for file in self.files])
-
- def svnlook(self, command):
- """Run the given svnlook command on our current repository and
- revision, returning all output"""
- # We have to set LC_ALL to force svnlook to give us UTF-8 output,
- # then we explicitly slurp that into a unicode object.
- return unicode(os.popen(
- 'LC_ALL="en_US.UTF-8" svnlook %s -r "%s" "%s"' %
- (command, self.revision, self.repository)).read(),
- 'utf-8', 'replace')
-
- def collectData(self):
- self.author = self.svnlook('author').strip()
- self.project = self.config.project
- self.log = self.svnlook('log')
- self.diffLines = len(self.svnlook('diff').split('\n'))
- self.files = self.collectFiles()
- if self.config.revisionURI is not None:
- self.url = self.config.revisionURI % self.__dict__
- else:
- self.url = None
-
- def collectFiles(self):
- # Extract all the files from the output of 'svnlook changed'
- files = []
- for line in self.svnlook('changed').split('\n'):
- path = line[2:].strip()
- if path:
- status = line[0]
- files.append(File(path, status))
-
- # Try each of our several regexes. To be applied, the same
- # regex must mach every file under consideration and they must
- # all return the same results. If we find one matching regex,
- # or we try all regexes without a match, we're done.
- matchDict = None
- for regex in self.config.pathRegexes:
- matchDict = matchAgainstFiles(regex, files)
- if matchDict is not None:
- self.__dict__.update(matchDict)
- break
-
- return files
-
-
-def matchAgainstFiles(regex, files):
- """Try matching a regex against all File objects in the provided list.
- If the regex returns the same matches for every file, the matches
- are returned in a dict and the matched portions are filtered out.
- If not, returns None.
- """
- prevMatchDict = None
- compiled = re.compile(regex, re.VERBOSE)
- for f in files:
-
- match = compiled.match(f.fullPath)
- if not match:
- # Give up, it must match every file
- return None
-
- matchDict = match.groupdict()
- if prevMatchDict is not None and prevMatchDict != matchDict:
- # Give up, we got conflicting matches
- return None
-
- prevMatchDict = matchDict
-
- # If we got this far, the regex matched every file with
- # the same results. Now filter the matched portion out of
- # each file and store the matches we found.
- for f in files:
- f.path = compiled.sub('', f.fullPath)
- return prevMatchDict
-
-
-def escapeToXml(text, isAttrib=0):
- text = unicode(text)
- text = text.replace("&", "&amp;")
- text = text.replace("<", "&lt;")
- text = text.replace(">", "&gt;")
- if isAttrib == 1:
- text = text.replace("'", "&apos;")
- text = text.replace("\"", "&quot;")
- return text
-
-
-def usage():
- """Print a short usage description of this script and exit"""
- sys.stderr.write("Usage: %s [OPTIONS] REPOS-PATH REVISION [PROJECTNAME]\n" %
- sys.argv[0])
-
-
-def version():
- """Print out the version of this script"""
- sys.stderr.write("%s %s\n" % (sys.argv[0], SvnClient.version))
-
-
-def main():
- try:
- options = [ "version" ]
- for key in config.__dict__:
- if not key.startswith("_"):
- options.append(key + "=");
- opts, args = getopt.getopt(sys.argv[1:], "", options)
- except getopt.GetoptError:
- usage()
- sys.exit(2)
-
- for o, a in opts:
- if o == "--version":
- version()
- sys.exit()
- else:
- # Everything else maps straight to a config key. Just have
- # to remove the "--" prefix from the option name.
- config.__dict__[o[2:]] = a
-
- # Print a usage message when not enough parameters are provided.
- if not len(args) in (2,3):
- sys.stderr.write("%s: incorrect number of arguments\n" % sys.argv[0])
- usage();
- sys.exit(2);
-
- # If a project name was provided, override the default project name.
- if len(args) == 3:
- config.project = args[2]
-
- # Go do the real work.
- SvnClient(args[0], args[1], config).main()
-
-
-if __name__ == "__main__":
- main()
-
-### The End ###
diff --git a/modules/subversion/templates/ciabot_svn.sh b/modules/subversion/templates/ciabot_svn.sh
deleted file mode 100755
index 63aa77a8..00000000
--- a/modules/subversion/templates/ciabot_svn.sh
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/bin/sh
-#
-# This is a CIA bot client script for Subversion repositories,
-# delivering via email. See below for usage and customization information.
-#
-# --------------------------------------------------------------------------
-#
-# Copyright (c) 2004-2005, Micah Dowty
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# * The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-# --------------------------------------------------------------------------
-#
-# See http://cia.vc for more information on what the CIA bot
-# is and how it works, and links to other client scripts.
-#
-# To use the CIA bot in your Subversion repository...
-#
-# 1. Customize the parameters below, specifically the ones under
-# the "Project information" section
-#
-# 2. This script should be called from your repository's post-commit
-# hook with the repository and revision as arguments. For example,
-# you could copy this script into your repository's "hooks" directory
-# and add something like the following to the "post-commit" script,
-# also in the repository's "hooks" directory:
-#
-# REPOS="$1"
-# REV="$2"
-# $REPOS/hooks/ciabot_svn.sh "$REPOS" "$REV"&
-#
-# ------ There are some parameters for this script that you can customize:
-
-# Project information
-#
-# NOTE: This shouldn't be a long description of your project. Ideally
-# it is a short identifier with no spaces, punctuation, or
-# unnecessary capitalization. This will be used in URLs related
-# to your project, as an internal identifier, and in IRC messages.
-# If you want a longer name shown for your project on the web
-# interface, please use the "title" metadata key rather than
-# putting that here.
-#
-project_name="Mageia"
-module_name="<%= cia_module %>"
-return_address="root@<%= domain %>"
-ignore_author="<%= cia_ignore_author %>"
-
-# System
-sendmail_command="/usr/sbin/sendmail -t"
-
-############# Below this line you shouldn't have to change anything
-
-# Script arguments
-REPOS="$1"
-REV="$2"
-
-# The email address CIA lives at
-cia_address="cia@cia.vc"
-
-author=`svnlook author -r "$REV" "$REPOS" | sed 's/\&/\&amp;/g;s/</\&lt;/g;s/>/\&gt;/g'`
-if test -n "$ignore_author" && echo "$author" | grep -q "$ignore_author"
-then
- exit 0
-fi
-log=`svnlook log -r "$REV" "$REPOS" | sed 's/\&/\&amp;/g;s/</\&lt;/g;s/>/\&gt;/g'`
-diff_lines=`svnlook diff -r "$REV" "$REPOS" | wc -l`
-for file in `svnlook changed -r "$REV" "$REPOS" | cut -c 3- | sed 's/\&/\&amp;/g;s/</\&lt;/g;s/>/\&gt;/g'`; do
- files="$files<file>$file</file>"
-done
-
-url="http://svnweb.<%= domain%>/${REPOS/\/svn\//}?view=revision&amp;revision=$REV"
-
-# Send an email with the final XML message
-(cat <<EOF
-From: $return_address
-To: $cia_address
-Subject: DeliverXML
-
-<message>
- <generator>
- <name>Subversion CIA Bot client shell script</name>
- <version>1.1</version>
- </generator>
- <source>
- <project>$project_name</project>
- <module>$module_name</module>
- </source>
- <body>
- <commit>
- <revision>$REV</revision>
- <author>$author</author>
- <files>$files</files>
- <log>$log</log>
- <url>$url</url>
- <diffLines>$diff_lines</diffLines>
- </commit>
- </body>
-</message>
-EOF
-) | $sendmail_command
-
-### The End ###
diff --git a/modules/subversion/templates/converted_to_git b/modules/subversion/templates/converted_to_git
new file mode 100644
index 00000000..8f137506
--- /dev/null
+++ b/modules/subversion/templates/converted_to_git
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+REPOS="$1"
+TXN="$2"
+
+if [ ! -f "$REPOS/conf/git.conf" ]; then
+ exit 0
+fi
+
+REGEX=$(cat "$REPOS/conf/git.conf" | grep -v "^#" | grep -v "^ *$" | xargs | sed 's/ /|/g')
+
+if (svnlook dirs-changed -t $TXN "$REPOS" | grep -qE "^($REGEX)"); then
+ echo "The subversion path you have attempted to commit to has been converted to git." >&2
+ echo "Please see: https://wiki.mageia.org/en/Git_Migration" >&2
+ exit 1
+fi
diff --git a/modules/subversion/templates/hook_commit.sh b/modules/subversion/templates/hook_commit.sh
index ec7ea1cb..2b1b6ff3 100644
--- a/modules/subversion/templates/hook_commit.sh
+++ b/modules/subversion/templates/hook_commit.sh
@@ -9,9 +9,9 @@ author=$(svnlook author -t "$TXN" "$REP")
# We will be able to remove it when updating to a better send mail hook
if [ "$author" = 'schedbot' ]; then
- LIST= `ls $0.d/* | grep -v send_mail`
+ LIST=`ls -1 $0.d/* | grep -v send_mail`
else
- LIST=`ls $0.d/*`
+ LIST=`ls -1 $0.d/*`
fi
for script in $LIST; do
@@ -25,4 +25,3 @@ for script in $LIST; do
$script $@ || exit 1
done
-
diff --git a/modules/subversion/templates/hook_irker b/modules/subversion/templates/hook_irker
new file mode 100644
index 00000000..8fd7a874
--- /dev/null
+++ b/modules/subversion/templates/hook_irker
@@ -0,0 +1,4 @@
+#!/bin/sh
+REPO=$1
+REV=$2
+<%= irkerhook_path %> --repository=$REPO $REV
diff --git a/modules/subversion/templates/hook_sendmail.pl b/modules/subversion/templates/hook_sendmail.pl
index aab1db5a..cf3be6a4 100644
--- a/modules/subversion/templates/hook_sendmail.pl
+++ b/modules/subversion/templates/hook_sendmail.pl
@@ -7,7 +7,11 @@
alternative: HTML::ColorDiff
with-diff: 1
max_diff_length: 20000
- from: root@<%= domain %>
+ ticket_map:
+ '(\bmga#(\d+)\b)': 'https://bugs.mageia.org/show_bug.cgi?id=%s'
+ revision-url: "https://svnweb.mageia.org/packages/?revision=%s&view=revision"
+ subject_cx: 1
+ from: subversion_noreply@ml.<%= @domain %>
to:
<%- commit_mail.each do |mail| -%>
- <%= mail %>
@@ -19,6 +23,10 @@
alternative: HTML::ColorDiff
with-diff: 1
max_diff_length: 20000
- from: root@<%= domain %>
+ ticket_map:
+ '(\bmga#(\d+)\b)': 'https://bugs.mageia.org/show_bug.cgi?id=%s'
+ revision-url: "https://svnweb.mageia.org/packages/?revision=%s&view=revision"
+ subject_cx: 1
+ from: subversion_noreply@ml.<%= @domain %>
to: <%= i18n_mail %>
<%- end -%>
diff --git a/modules/subversion/templates/irker.conf b/modules/subversion/templates/irker.conf
new file mode 100644
index 00000000..d037a120
--- /dev/null
+++ b/modules/subversion/templates/irker.conf
@@ -0,0 +1,7 @@
+<%-
+ content = ''
+ @irker_conf.keys.sort.each {|key|
+ content += key + ' = ' + @irker_conf[key] + "\n"
+ }
+-%>
+<%= content %>
diff --git a/modules/subversion/templates/no_binary b/modules/subversion/templates/no_binary
index a7f2eb94..284642e5 100644
--- a/modules/subversion/templates/no_binary
+++ b/modules/subversion/templates/no_binary
@@ -3,7 +3,7 @@
REP="$1"
TXN="$2"
-# Filter some binary files based on common filename extentions.
+# Filter some binary files based on common filename extensions.
# It does not fully prevent commit of binary files, this script is only
# here to avoid simple mistakes
if svnlook changed -t "$TXN" "$REP" | grep -qi '\.\(gz\|bz2\|xz\|lzma\|Z\|7z\|tar\|tgz\|zip\|jpg\|gif\|png\|ogg\|mp3\|wav\|rar\|pdf\)$'
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
diff --git a/modules/subversion/templates/restricted_to_user b/modules/subversion/templates/restricted_to_user
index 5c70132e..98297627 100644
--- a/modules/subversion/templates/restricted_to_user
+++ b/modules/subversion/templates/restricted_to_user
@@ -6,7 +6,7 @@ TXN="$2"
author=$(svnlook author -t "$TXN" "$REP")
if [ "$author" != '<%= restricted_to_user %>' ]; then
- echo "this repository is restrected to user <%= restricted_to_user %>" >&2
+ echo "this repository is restricted to user <%= restricted_to_user %>" >&2
exit 1
fi
diff --git a/modules/subversion/templates/xinetd b/modules/subversion/templates/xinetd
index 87827ec2..0919ae60 100644
--- a/modules/subversion/templates/xinetd
+++ b/modules/subversion/templates/xinetd
@@ -12,4 +12,3 @@ service svnserve
server_args = -i -r <%= svn_base_path %>
flags = IPv6
}
-