I have a pre-commit hook to detect mergeinfo
below root, and remove it whenever it occurs

For clarity: the pre-commit hook detects and rejects. The one removing the mergeinfo is me, using svn propdel.

Someone asked for the hook code, here it is. It's not my submission for a beauty contest and there are some unrelated checks in there. I use the SVN command line instead of python bindings because I can't find the slightest explanation on them.

--8>----------------------------------------------------

#!/usr/bin/python

# PRE-COMMIT HOOK
SVNLOOK = '/usr/bin/svnlook'

import subprocess
import sys

repos, txn = sys.argv[1:]

rc = 0

"""
logmsg = subprocess.Popen([SVNLOOK, 'log', repos, '--transaction', txn], stdout=subprocess.PIPE).stdout.read()
if logmsg.isspace():
        sys.stderr.write("Empty log message\n")
        rc = 1
"""

changes = subprocess.Popen([SVNLOOK, 'changed', repos, '--transaction', txn], stdout=subprocess.PIPE).stdout.readlines()
for change in changes:
        action = change[0]
        assert(change[3] == ' ')
path = change[4:-1] # strip 2 leading change type characters followed by a space, and strip trailing newline
        is_dir = path.endswith('/')
        is_top_dir = False
        if is_dir:
                path_parts = path.split('/')
                assert(path_parts[-1] == '')
                if len(path_parts) == 2 and path_parts[0] == 'trunk':
                        is_top_dir = True
if len(path_parts) == 3 and path_parts[0] in ('branches', 'tags'):
                        is_top_dir = True

        if action != 'D': # Delete
                props = []
for entry in subprocess.Popen([SVNLOOK, 'proplist', repos, '--transaction', txn, path], stdout=subprocess.PIPE).stdout:
                        assert(entry.startswith('  '))
                        prop = entry[2:-1]
                        props.append(prop)

                if is_top_dir and not 'svn:mergeinfo' in props:
sys.stderr.write(path + ": missing svn:mergeinfo\n")
                        rc = 1
                if not is_top_dir and 'svn:mergeinfo' in props:
sys.stderr.write(path + ": unexpected svn:mergeinfo\n")
                        rc = 1
                if not is_top_dir and 'bugtraq:url' in props:
sys.stderr.write(path + ": unexpected bugtraq:url\n")
                        rc = 1
                if not is_top_dir and 'bugtraq:logregex' in props:
sys.stderr.write(path + ": unexpected bugtraq:logregex\n")
                        rc = 1
if not is_dir and not 'svn:mimetype' in props: # then it's some kind of text file for line in subprocess.Popen([SVNLOOK, 'cat', repos, '--transaction', txn, path], stdout=subprocess.PIPE).stdout:
                                if "DO_NOT_COMMIT" in line:
sys.stderr.write(path + ": found DO_NOT_COMMIT\n")
                                        rc = 1
                                        break

sys.exit(rc)

--8>----------------------------------------------------

--
Stein

Reply via email to