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