| 1 | from trac.versioncontrol.svn_fs import Pool |
|---|
| 2 | from trac.util import TracError |
|---|
| 3 | from svn import repos, fs, delta |
|---|
| 4 | |
|---|
| 5 | import sys |
|---|
| 6 | import os |
|---|
| 7 | |
|---|
| 8 | class ChangeCollectorChecker(object): |
|---|
| 9 | def __init__(self, path): |
|---|
| 10 | self.pool = Pool() |
|---|
| 11 | |
|---|
| 12 | # Remove any trailing slash or else subversion might abort |
|---|
| 13 | path = os.path.normpath(path).replace('\\', '/') |
|---|
| 14 | self.path = repos.svn_repos_find_root_path(path, self.pool()) |
|---|
| 15 | if self.path is None: |
|---|
| 16 | raise TracError, \ |
|---|
| 17 | "%s does not appear to be a Subversion repository." % path |
|---|
| 18 | |
|---|
| 19 | self.repos = repos.svn_repos_open(self.path, self.pool()) |
|---|
| 20 | self.fs_ptr = repos.svn_repos_fs(self.repos) |
|---|
| 21 | |
|---|
| 22 | def check(self, rev): |
|---|
| 23 | pool = Pool(self.pool) |
|---|
| 24 | root = fs.revision_root(self.fs_ptr, rev, pool()) |
|---|
| 25 | editor = repos.RevisionChangeCollector(self.fs_ptr, rev, pool()) |
|---|
| 26 | e_ptr, e_baton = delta.make_editor(editor, pool()) |
|---|
| 27 | repos.svn_repos_replay(root, e_ptr, e_baton, pool()) |
|---|
| 28 | |
|---|
| 29 | |
|---|
| 30 | if __name__ == '__main__': |
|---|
| 31 | try: |
|---|
| 32 | path = sys.argv[1] |
|---|
| 33 | rev = sys.argv[2] |
|---|
| 34 | ChangeCollectorChecker(path).check(int(rev)) |
|---|
| 35 | import gc |
|---|
| 36 | print "Checked revision %s (%d objects unreachable)" % (rev, gc.collect()) |
|---|
| 37 | except: |
|---|
| 38 | import traceback |
|---|
| 39 | traceback.print_exc(file=sys.stderr) |
|---|
| 40 | print>>sys.stderr, "Usage: python check_repos.py <repository_path> <revision>" |
|---|
| 41 | sys.exit(2) |
|---|