That's an awesome hook to limit svn:mergeinfo propagation, but unfortunately it is not viable for complex repositories :(.
Let's hope Subversion 1.7 helps us with this. On Wed, Jan 13, 2010 at 11:46 AM, Stein Somers <ssom...@opnet.com> wrote: >> 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 > -- Un saludo, Javier