summaryrefslogtreecommitdiff
path: root/tools/dev/verify-history.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/dev/verify-history.py')
-rwxr-xr-xtools/dev/verify-history.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/tools/dev/verify-history.py b/tools/dev/verify-history.py
new file mode 100755
index 0000000..a408cc7
--- /dev/null
+++ b/tools/dev/verify-history.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#
+
+# This program is used to verify the FS history code.
+#
+# The basic gist is this: given a repository, a path in that
+# repository, and a revision at which to begin plowing through history
+# (towards revision 1), verify that each history object returned by
+# the svn_fs_history_prev() interface -- indirectly via
+# svn_repos_history() -- represents a revision in which the node being
+# tracked actually changed, or where a parent directory of the node
+# was copied, according to the list of paths changed as reported by
+# svn_fs_paths_changed().
+#
+# A fun way to run this:
+#
+# #!/bin/sh
+#
+# export VERIFY=/path/to/verify-history.py
+# export MYREPOS=/path/to/repos
+#
+# # List the paths in HEAD of the repos (filtering out the directories)
+# for VCFILE in `svn ls -R file://${MYREPOS} | grep -v '/$'`; do
+# echo "Checking ${VCFILE}"
+# ${VERIFY} ${MYREPOS} ${VCFILE}
+# done
+
+import sys
+import string
+from svn import core, repos, fs
+
+class HistoryChecker:
+ def __init__(self, fs_ptr):
+ self.fs_ptr = fs_ptr
+
+ def _check_history(self, path, revision):
+ root = fs.revision_root(self.fs_ptr, revision)
+ changes = fs.paths_changed(root)
+ while True:
+ if path in changes:
+ return 1
+ if path == '/':
+ return 0
+ idx = path.rfind('/')
+ if idx != -1:
+ path = path[:idx]
+ else:
+ return 0
+
+ def add_history(self, path, revision, pool=None):
+ if not self._check_history(path, revision):
+ print("**WRONG** %8d %s" % (revision, path))
+ else:
+ print(" %8d %s" % (revision, path))
+
+
+def check_history(fs_ptr, path, revision):
+ history = HistoryChecker(fs_ptr)
+ repos.history(fs_ptr, path, history.add_history, 1, revision, 1)
+
+
+def main():
+ argc = len(sys.argv)
+ if argc < 3 or argc > 4:
+ print("Usage: %s PATH-TO-REPOS PATH-IN-REPOS [REVISION]" % sys.argv[0])
+ sys.exit(1)
+
+ fs_ptr = repos.fs(repos.open(sys.argv[1]))
+ if argc == 3:
+ revision = fs.youngest_rev(fs_ptr)
+ else:
+ revision = int(sys.argv[3])
+ check_history(fs_ptr, sys.argv[2], revision)
+ sys.exit(0)
+
+
+if __name__ == '__main__':
+ main()