from trac.versioncontrol.svn_fs import Pool
from trac.util import TracError
from svn import repos, fs, delta

import sys
import os

class ChangeCollectorChecker(object):
    def __init__(self, path):
        self.pool = Pool()
        
        # Remove any trailing slash or else subversion might abort
        path = os.path.normpath(path).replace('\\', '/')
        self.path = repos.svn_repos_find_root_path(path, self.pool())
        if self.path is None:
            raise TracError, \
                  "%s does not appear to be a Subversion repository." % path

        self.repos = repos.svn_repos_open(self.path, self.pool())
        self.fs_ptr = repos.svn_repos_fs(self.repos)

    def check(self, rev):
        pool = Pool(self.pool)
        root = fs.revision_root(self.fs_ptr, rev, pool())
        editor = repos.RevisionChangeCollector(self.fs_ptr, rev, pool())
        e_ptr, e_baton = delta.make_editor(editor, pool())
        repos.svn_repos_replay(root, e_ptr, e_baton, pool())


if __name__ == '__main__':
    try:
        path = sys.argv[1]
        rev = sys.argv[2]
        ChangeCollectorChecker(path).check(int(rev))
        import gc
        print "Checked revision %s (%d objects unreachable)" % (rev, gc.collect())
    except:
        import traceback
        traceback.print_exc(file=sys.stderr)
        print>>sys.stderr, "Usage: python check_repos.py <repository_path> <revision>"
        sys.exit(2)

