Here a quick rough edit to the code in the above link. This should work for you. I haven't tested it though (I don't have SVN repo to test it now).
#!/bin/env python
" Example Subversion pre-commit hook. "
def command_output(cmd):
" Capture a command's standard output. "
import subprocess
return subprocess.Popen(
cmd.split(), stdout=subprocess.PIPE).communicate()[0]
def files_changed(look_cmd):
""" List the files added or updated by this transaction.
"svnlook changed" gives output like:
U trunk/file1.cpp
A trunk/file2.cpp
"""
def filename(line):
return line[4:]
def added_or_updated(line):
return line and line[0] in ("A", "U")
return [
filename(line)
for line in command_output(look_cmd % "changed").split("\n")
if added_or_updated(line)]
def check_filesname(look_cmd):
" Check for invalid filenames. \
It allows Alphabets, Numbers, dashes(-), Underscores(_) and dots(.) "
allowedRegex=re.compile("^[a-zA-Z0-9\-_\.]*$")
invalid_files = [
ff for ff in files_changed(look_cmd)
if not allowedRegex.match(ff)]
if len(invalid_files) > 0:
sys.stderr.write("The following files have invalid filename:\n%s\n"
% "\n".join(invalid_files))
return len(invalid_files)
def main():
usage = """usage: %prog REPOS TXN
Run pre-commit options on a repository transaction."""
from optparse import OptionParser
parser = OptionParser(usage=usage)
parser.add_option("-r", "--revision",
help="Test mode. TXN actually refers to a revision.",
action="store_true", default=False)
errors = 0
try:
(opts, (repos, txn_or_rvn)) = parser.parse_args()
look_opt = ("--transaction", "--revision")[opts.revision]
look_cmd = "svnlook %s %s %s %s" % (
"%s", repos, look_opt, txn_or_rvn)
errors += check_filesname(look_cmd)
except:
parser.print_help()
errors += 1
return errors
if __name__ == "__main__":
import sys
sys.exit(main())