⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svn_fs.py

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 PY
字号:
## Copyright (C) 2005 Edgewall Software# Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>## This software is licensed as described in the file# LICENSE_FOR_PYTHON_BINDINGS, which you should have received as part# of this distribution.  The terms are also available at# < http://subversion.tigris.org/license-for-python-bindings.html >.# If newer versions of this license are posted there, you may use a# newer version instead, at your option.## Author: Christopher Lenz <cmlenz@gmx.de>import os.pathimport statimport shutilimport sysimport tempfileimport unittestfrom urllib import pathname2urltry:    from cStringIO import StringIOexcept ImportError:    from StringIO import StringIOfrom svn import core, reposfrom trac.test import TestSetupfrom trac.versioncontrol import Changeset, Nodefrom trac.versioncontrol.svn_fs import SubversionRepositoryREPOS_PATH = os.path.join(tempfile.gettempdir(), 'trac-svnrepos')REPOS_URL = pathname2url(REPOS_PATH)if REPOS_URL.startswith("///"):  # Don't add extra slashes if they're already present.  # (This is important for Windows compatibility).  REPOS_URL = "file:" + REPOS_URLelse:  # If the URL simply starts with '/', we need to add two  # extra slashes to make it a valid 'file://' URL  REPOS_URL = "file://" + REPOS_URLclass SubversionRepositoryTestSetup(TestSetup):    def setUp(self):        dumpfile = open(os.path.join(os.path.split(__file__)[0],                                     'svnrepos.dump'))        # Remove the trac-svnrepos directory, so that we can        # ensure a fresh start.        self.tearDown()        r = repos.svn_repos_create(REPOS_PATH, '', '', None, None)        repos.svn_repos_load_fs2(r, dumpfile, StringIO(),                                repos.svn_repos_load_uuid_default, '',                                0, 0, None)    def tearDown(self):        if os.path.exists(REPOS_PATH):            if os.name == 'nt':                # The Windows version of 'shutil.rmtree' doesn't override the                # permissions of read-only files, so we have to do it                # ourselves:                db_format_file = os.path.join(REPOS_PATH, 'db', 'format')                if os.path.isfile(db_format_file):                    os.chmod(db_format_file, stat.S_IRWXU)                format_file = os.path.join(REPOS_PATH, 'format')                if os.path.isfile(format_file):                    os.chmod(format_file, stat.S_IRWXU)            shutil.rmtree(REPOS_PATH)class SubversionRepositoryTestCase(unittest.TestCase):    def setUp(self):        self.repos = SubversionRepository(REPOS_PATH, None)    def tearDown(self):        self.repos = None    def test_rev_navigation(self):        self.assertEqual(0, self.repos.oldest_rev)        self.assertEqual(None, self.repos.previous_rev(0))        self.assertEqual(0, self.repos.previous_rev(1))        self.assertEqual(12, self.repos.youngest_rev)        self.assertEqual(6, self.repos.next_rev(5))        self.assertEqual(7, self.repos.next_rev(6))        # ...        self.assertEqual(None, self.repos.next_rev(12))    def test_get_node(self):        node = self.repos.get_node('/trunk')        self.assertEqual('trunk', node.name)        self.assertEqual('/trunk', node.path)        self.assertEqual(Node.DIRECTORY, node.kind)        self.assertEqual(6, node.rev)        self.assertEqual(1112381806, node.last_modified)        node = self.repos.get_node('/trunk/README.txt')        self.assertEqual('README.txt', node.name)        self.assertEqual('/trunk/README.txt', node.path)        self.assertEqual(Node.FILE, node.kind)        self.assertEqual(3, node.rev)        self.assertEqual(1112361898, node.last_modified)    def test_get_node_specific_rev(self):        node = self.repos.get_node('/trunk', 1)        self.assertEqual('trunk', node.name)        self.assertEqual('/trunk', node.path)        self.assertEqual(Node.DIRECTORY, node.kind)        self.assertEqual(1, node.rev)        self.assertEqual(1112349652, node.last_modified)        node = self.repos.get_node('/trunk/README.txt', 2)        self.assertEqual('README.txt', node.name)        self.assertEqual('/trunk/README.txt', node.path)        self.assertEqual(Node.FILE, node.kind)        self.assertEqual(2, node.rev)        self.assertEqual(1112361138, node.last_modified)    def test_get_dir_entries(self):        node = self.repos.get_node('/trunk')        entries = node.get_entries()        self.assertEqual('README2.txt', entries.next().name)        self.assertEqual('dir1', entries.next().name)        self.assertEqual('README.txt', entries.next().name)        self.assertRaises(StopIteration, entries.next)    def test_get_file_entries(self):        node = self.repos.get_node('/trunk/README.txt')        entries = node.get_entries()        self.assertRaises(StopIteration, entries.next)    def test_get_dir_content(self):        node = self.repos.get_node('/trunk')        self.assertEqual(None, node.content_length)        self.assertEqual(None, node.content_type)        self.assertEqual(None, node.get_content())    def test_get_file_content(self):        node = self.repos.get_node('/trunk/README.txt')        self.assertEqual(8, node.content_length)        self.assertEqual('text/plain', node.content_type)        self.assertEqual('A test.\n', node.get_content().read())    def test_get_dir_properties(self):        f = self.repos.get_node('/trunk')        props = f.get_properties()        self.assertEqual(0, len(props))    def test_get_file_properties(self):        f = self.repos.get_node('/trunk/README.txt')        props = f.get_properties()        self.assertEqual('native', props['svn:eol-style'])        self.assertEqual('text/plain', props['svn:mime-type'])    # Revision Log / node history     def test_get_node_history(self):        node = self.repos.get_node('/trunk/README2.txt')        history = node.get_history()        self.assertEqual(('trunk/README2.txt', 6, 'copy'), history.next())        self.assertEqual(('trunk/README.txt', 3, 'edit'), history.next())        self.assertEqual(('trunk/README.txt', 2, 'add'), history.next())        self.assertRaises(StopIteration, history.next)    def test_get_node_history_follow_copy(self):        node = self.repos.get_node('/tags/v1/README.txt')        history = node.get_history()        self.assertEqual(('tags/v1/README.txt', 7, 'copy'), history.next())        self.assertEqual(('trunk/README.txt', 3, 'edit'), history.next())        self.assertEqual(('trunk/README.txt', 2, 'add'), history.next())        self.assertRaises(StopIteration, history.next)    # Revision Log / path history     def test_get_path_history(self):        history = self.repos.get_path_history('/trunk/README2.txt', None)        self.assertEqual(('trunk/README2.txt', 6, 'copy'), history.next())        self.assertEqual(('trunk/README.txt', 3, 'unknown'), history.next())        self.assertRaises(StopIteration, history.next)    def test_get_path_history_copied_file(self):        history = self.repos.get_path_history('/tags/v1/README.txt', None)        self.assertEqual(('tags/v1/README.txt', 7, 'copy'), history.next())        self.assertEqual(('trunk/README.txt', 3, 'unknown'), history.next())        self.assertRaises(StopIteration, history.next)            def test_get_path_history_copied_dir(self):        history = self.repos.get_path_history('/branches/v1x', None)        self.assertEqual(('branches/v1x', 12, 'copy'), history.next())        self.assertEqual(('tags/v1.1', 10, 'unknown'), history.next())        self.assertEqual(('branches/v1x', 11, 'delete'), history.next())        self.assertEqual(('branches/v1x', 9, 'edit'), history.next())        self.assertEqual(('branches/v1x', 8, 'copy'), history.next())        self.assertEqual(('tags/v1', 7, 'unknown'), history.next())        self.assertRaises(StopIteration, history.next)    # Diffs    def _cmp_diff(self, expected, got):        if expected[0]:            old = self.repos.get_node(*expected[0])            self.assertEqual((old.path, old.rev), (got[0].path, got[0].rev))        if expected[1]:            new = self.repos.get_node(*expected[1])            self.assertEqual((new.path, new.rev), (got[1].path, got[1].rev))        self.assertEqual(expected[2], (got[2], got[3]))            def test_diff_file_different_revs(self):        diffs = self.repos.get_deltas('trunk/README.txt', 2, 'trunk/README.txt', 3)        self._cmp_diff((('trunk/README.txt', 2),                        ('trunk/README.txt', 3),                        (Node.FILE, Changeset.EDIT)), diffs.next())        self.assertRaises(StopIteration, diffs.next)    def test_diff_file_different_files(self):        diffs = self.repos.get_deltas('branches/v1x/README.txt', 12,                                      'branches/v1x/README2.txt', 12)        self._cmp_diff((('branches/v1x/README.txt', 12),                        ('branches/v1x/README2.txt', 12),                        (Node.FILE, Changeset.EDIT)), diffs.next())        self.assertRaises(StopIteration, diffs.next)    def test_diff_file_no_change(self):        diffs = self.repos.get_deltas('trunk/README.txt', 7,                                      'tags/v1/README.txt', 7)        self.assertRaises(StopIteration, diffs.next)     def test_diff_dir_different_revs(self):        diffs = self.repos.get_deltas('trunk', 4, 'trunk', 8)        self._cmp_diff((None, ('trunk/dir1/dir2', 8),                        (Node.DIRECTORY, Changeset.ADD)), diffs.next())        self._cmp_diff((None, ('trunk/dir1/dir3', 8),                        (Node.DIRECTORY, Changeset.ADD)), diffs.next())        self._cmp_diff((None, ('trunk/README2.txt', 6),                        (Node.FILE, Changeset.ADD)), diffs.next())        self._cmp_diff((('trunk/dir2', 4), None,                        (Node.DIRECTORY, Changeset.DELETE)), diffs.next())        self._cmp_diff((('trunk/dir3', 4), None,                        (Node.DIRECTORY, Changeset.DELETE)), diffs.next())        self.assertRaises(StopIteration, diffs.next)    def test_diff_dir_different_dirs(self):        diffs = self.repos.get_deltas('trunk', 1, 'branches/v1x', 12)        self._cmp_diff((None, ('branches/v1x/dir1', 12),                        (Node.DIRECTORY, Changeset.ADD)), diffs.next())        self._cmp_diff((None, ('branches/v1x/dir1/dir2', 12),                        (Node.DIRECTORY, Changeset.ADD)), diffs.next())        self._cmp_diff((None, ('branches/v1x/dir1/dir3', 12),                        (Node.DIRECTORY, Changeset.ADD)), diffs.next())        self._cmp_diff((None, ('branches/v1x/README.txt', 12),                        (Node.FILE, Changeset.ADD)), diffs.next())        self._cmp_diff((None, ('branches/v1x/README2.txt', 12),                        (Node.FILE, Changeset.ADD)), diffs.next())        self.assertRaises(StopIteration, diffs.next)    def test_diff_dir_no_change(self):        diffs = self.repos.get_deltas('trunk', 7,                                      'tags/v1', 7)        self.assertRaises(StopIteration, diffs.next)            # Changesets    def test_changeset_repos_creation(self):        chgset = self.repos.get_changeset(0)        self.assertEqual(0, chgset.rev)        self.assertEqual(None, chgset.message)        self.assertEqual(None, chgset.author)        self.assertEqual(1112349461, chgset.date)        self.assertRaises(StopIteration, chgset.get_changes().next)    def test_changeset_added_dirs(self):        chgset = self.repos.get_changeset(1)        self.assertEqual(1, chgset.rev)        self.assertEqual('Initial directory layout.', chgset.message)        self.assertEqual('john', chgset.author)        self.assertEqual(1112349652, chgset.date)        changes = chgset.get_changes()        self.assertEqual(('trunk', Node.DIRECTORY, Changeset.ADD, None, -1),                         changes.next())        self.assertEqual(('branches', Node.DIRECTORY, Changeset.ADD, None, -1),                         changes.next())        self.assertEqual(('tags', Node.DIRECTORY, Changeset.ADD, None, -1),                         changes.next())        self.assertRaises(StopIteration, changes.next)    def test_changeset_file_edit(self):        chgset = self.repos.get_changeset(3)        self.assertEqual(3, chgset.rev)        self.assertEqual('Fixed README.\n', chgset.message)        self.assertEqual('kate', chgset.author)        self.assertEqual(1112361898, chgset.date)        changes = chgset.get_changes()        self.assertEqual(('trunk/README.txt', Node.FILE, Changeset.EDIT,                          'trunk/README.txt', 2), changes.next())        self.assertRaises(StopIteration, changes.next)    def test_changeset_dir_moves(self):        chgset = self.repos.get_changeset(5)        self.assertEqual(5, chgset.rev)        self.assertEqual('Moved directories.', chgset.message)        self.assertEqual('kate', chgset.author)        self.assertEqual(1112372739, chgset.date)        changes = chgset.get_changes()        self.assertEqual(('trunk/dir1/dir2', Node.DIRECTORY, Changeset.MOVE,                          'trunk/dir2', 4), changes.next())        self.assertEqual(('trunk/dir1/dir3', Node.DIRECTORY, Changeset.MOVE,                          'trunk/dir3', 4), changes.next())        self.assertRaises(StopIteration, changes.next)    def test_changeset_file_copy(self):        chgset = self.repos.get_changeset(6)        self.assertEqual(6, chgset.rev)        self.assertEqual('More things to read', chgset.message)        self.assertEqual('john', chgset.author)        self.assertEqual(1112381806, chgset.date)        changes = chgset.get_changes()        self.assertEqual(('trunk/README2.txt', Node.FILE, Changeset.COPY,                          'trunk/README.txt', 3), changes.next())        self.assertRaises(StopIteration, changes.next)def suite():    return unittest.makeSuite(SubversionRepositoryTestCase, 'test',                              suiteClass=SubversionRepositoryTestSetup)if __name__ == '__main__':    runner = unittest.TextTestRunner()    runner.run(suite())

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -