| #!/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])) |
| |