Hi all, This worked out really well for us. We use the Apache SVN server on Windows, so we never managed to use the SVN Python modules (my coworker who did most of this work never managed to find a Windows-compatible distribution for Python 3.x.)
Instead, we inspected the transaction file and parsed it manually. I don't generally like this, but a pure-Python solution was far preferable to us at this stage. One snag is that it seems like authorization happens before the precommit hook, so we can't lock users out of Subversion without also locking them out of the gated commit. Now that we're aware of this, we can figure out ways of countering it. Thanks for your excellent suggestions! Here's the little module we use (transcribed, I might have made syntax mistakes): ---- import os def parse_revprops(revprop_data): revprops = {} for index, line in enumerate(revprop_data): if line == "END" or line == "": continue if (index % 4) == 1: current_key = line elif (index % 4) == 3: revprops[current_key] = line return revprops def serialize_revprops(revprops): output = "" for key, value in revprops.items(): output += "K %d\n" % len(key) output += "%s\n" % key output += "V %d\n" % len(value) output += "%s\n" % value return output + "END\n" def rewrite_author(subversion_folder, transaction_id): # Read revprops transaction file directly. props_file = os.path.join(subversion_folder, "db", "transactions", transaction_id + ".txn", "props") with open(props_file, "r") as fd: revprops = parse_revprops(fd.read().splitlines()) # Only rewrite author for bot commits if revprops["svn:author"] != "bot": return True # If there's no on-behalf-of specified, just commit as bot directly. if "on-behalf-of" not in revprops: return True # Move svn:author to committed-by property, and on-behalf-of to svn:author. revprops["committed-by"] = revprops["svn:author"] revprops["svn:author"] = revprops["on-behalf-of"] del revprops["on-behalf-of"] # Write back. with open(props_file, "w", newline="\n") as fd: fd.write(serialize_revprops(revprops)) return True ---- - Kim