#!/usr/bin/env python # ==================================================================== # Copyright (c) 2004-2005 CollabNet. All rights reserved. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at http://subversion.tigris.org/license.html. # If newer versions of this license are posted there, you may use a # newer version instead, at your option. # # This software consists of voluntary contributions made by many # individuals. For exact contribution history, see the revision # history and logs, available at http://subversion.tigris.org/. # ==================================================================== import sys import os import os.path from svn import repos, fs, delta, core ### DEAR USER: Please populate the test_props() and test_path_change() ### to do your bidding. def test_props(props): """Validate the PROPS (a dictionary mapping property names to values) set on the transaction. Return 0 if all is well, non-zero otherwise.""" ### Test the transaction (revision-to-be) properties. If there is ### bogosity, write to sys.stderr and return non-zero. return 0 def test_path_change(path, change): """Validate the CHANGE made to PATH in the transaction. Return 0 if all is well, non-zero otherwise.""" # The svn_node_kind of the path. item_kind = change.item_kind # Non-zero iff properties of this path were changed. prop_changes = change.prop_changes # Non-zero iff path is a file, and its text was changed. text_changed = change.text_changed # The location of the previous revision of this resource, if any. base_path = change.base_path base_rev = change.base_rev # Non-zero iff this change represents an addition (see # base_path/base_rev for whether it was an addition with history). added = change.added ### Test the path change as you see fit. If there is bogosity, ### write to sys.stderr and return non-zero. return 1 def main(pool, repos_dir, txn): # Construct a ChangeCollector to fetch our changes. fs_ptr = repos.svn_repos_fs(repos.svn_repos_open(repos_dir, pool)) root = fs.txn_root(fs.open_txn(fs_ptr, txn, pool), pool) cc = repos.ChangeCollector(fs_ptr, root, pool) # Call the transaction property validator. Might as well get the # cheap checks outta the way first. retval = test_props(cc.get_root_props()) if retval: return retval # Generate the path-based changes list. e_ptr, e_baton = delta.make_editor(cc, pool) repos.svn_repos_replay(root, e_ptr, e_baton, pool) # Call the path change validator. changes = cc.get_changes() paths = changes.keys() paths.sort(lambda a, b: core.svn_path_compare_paths(a, b)) for path in paths: change = changes[path] retval = test_path_change(path, change) if retval: return retval return 0 def _usage_and_exit(): sys.stderr.write("USAGE: %s REPOS-DIR TXN-NAME\n" % (sys.argv[0])) sys.exit(1) if __name__ == '__main__': if len(sys.argv) < 3: _usage_and_exit() sys.exit(core.run_app(main, sys.argv[1], sys.argv[2]))