On Thu, Jan 14, 2010 at 7:58 AM, Javier Sanz <jscebal...@gmail.com> wrote: > 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>---------------------------------------------------- >> The Subversion Hook Framework wiki (http://sourceforge.net/apps/mediawiki/svnhook) has an example pre-commit action for this.
<FilterCommitList> <PathRegex>(?i)/(branches|tags|trunk)/</PathRegex> <FilterPath> <PathRegex sense="false">(?i)/(trunk|branches/[^/]+|tags/[^/]+)/$</PathRegex> <FilterPropList> <PropNameRegex>^svn:mergeinfo$</PropNameRegex> <SendError> Merge info not allowed on path "${Path}"! Please revert the changes and merge at the root level. </SendError> </FilterPropList> </FilterPath> </FilterCommitList> Could be read as - look for anything under branches/tags/trunk and prevent setting mergeinfo anywhere but at the root. -- Geoff Rowell geoff.row...@gmail.com