"C. Michael Pilato" <cmpilato@collab.net> writes:
> > THE HOOK ALTERNATIVE:
> +1
> > THE PROPOSAL:
> -1
Well, I didn't want to be all talk and no action :-).
Please review this pre-commit hook script. Once any needed tweaks are
made, I'll check it into tools/hook-scripts/. I'm in favor of running
this on Subversion's own repository, but that's a separate thread;
I'll bring it up after the script is committed.
--------------------8-<-------cut-here---------8-<-----------------------
#!/usr/bin/python
# log-police.py: Ensure that log messages end with a single newline.
# See usage() function for details, or just run with no arguments.
import os
import sys
import getopt
import svn
import svn.fs
import svn.repos
import svn.core
# Pretend we have true booleans on older python versions
try:
True
except:
True = 1
False = 0
def fix_up_txn(fs, txn_name):
"Fix up the log message for txn TXN_NAME in FS."
txn = svn.fs.svn_fs_open_txn(fs, txn_name)
log_message = svn.fs.svn_fs_txn_prop(txn, "svn:log")
if log_message is not None:
log_message = log_message.rstrip() + "\n"
svn.fs.svn_fs_change_txn_prop(txn, "svn:log", log_message)
def fix_up_rev(fs, revnum):
"Fix up the log message for revision REVNUM in FS."
log_message = svn.fs.svn_fs_revision_prop(fs, revnum, 'svn:log')
if log_message is not None:
log_message = log_message.rstrip() + "\n"
svn.fs.svn_fs_change_rev_prop(fs, revnum, "svn:log", log_message)
def main(ignored_pool, argv):
repos_path = None
txn_name = None
rev_name = None
all_revs = False
try:
opts, args = getopt.getopt(argv[1:], 't:r:h?', ["help", "all-revs"])
except:
sys.stderr.write("ERROR: problem processing arguments / options.\n\n")
usage(sys.stderr)
sys.exit(1)
for opt, value in opts:
if opt == '--help' or opt == '-h' or opt == '-?':
usage()
sys.exit(0)
elif opt == '-t':
txn_name = value
elif opt == '-r':
rev_name = value
elif opt == '--all-revs':
all_revs = True
else:
sys.stderr.write("ERROR: unknown option '%s'.\n\n" % opt)
usage(sys.stderr)
sys.exit(1)
if txn_name is not None and rev_name is not None:
sys.stderr.write("ERROR: Cannot pass both -t and -r.\n\n")
usage(sys.stderr)
sys.exit(1)
if txn_name is not None and all_revs:
sys.stderr.write("ERROR: Cannot pass --all-revs with -t.\n\n")
usage(sys.stderr)
sys.exit(1)
if rev_name is not None and all_revs:
sys.stderr.write("ERROR: Cannot pass --all-revs with -r.\n\n")
usage(sys.stderr)
sys.exit(1)
if rev_name is None and txn_name is None and not all_revs:
usage(sys.stderr)
sys.exit(1)
if len(args) > 1:
sys.stderr.write("ERROR: only one argument allowed (the repository).\n\n")
usage(sys.stderr)
sys.exit(1)
repos_path = args[0]
# A non-bindings version of this could be implemented by calling out
# to 'svnlook getlog' and 'svnadmin setlog'. However, using the
# bindings results in much simpler code.
fs = svn.repos.svn_repos_fs(svn.repos.svn_repos_open(repos_path))
if txn_name is not None:
fix_up_txn(fs, txn_name)
elif rev_name is not None:
fix_up_rev(fs, int(rev_name))
elif all_revs:
last_youngest = 0
while True:
youngest = svn.fs.svn_fs_youngest_rev(fs)
if youngest >= last_youngest:
for this_rev in range(last_youngest, youngest + 1):
fix_up_rev(fs, this_rev)
last_youngest = youngest + 1
else:
break
def usage(outfile=sys.stdout):
outfile.write("USAGE: %s [-t TXN_NAME | -r REV_NUM | --all-revs] REPOS\n"
% (sys.argv[0]))
outfile.write(
"\n"
"Ensure that log messages end with exactly one newline and no\n"
"other whitespace characters. Use as a pre-commit hook by passing\n"
"'-t TXN_NAME'; fix up a single revision by passing '-r REV_NUM';\n"
"fix up all revisions by passing '--all-revs'. (When used as a\n"
"pre-commit hook, may modify the svn:log property on the txn.)\n")
if __name__ == '__main__':
sys.exit(svn.core.run_app(main, sys.argv))
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Fri Mar 3 20:18:20 2006