class SubversionRepositoryTestCase(unittest.TestCase): def setUp(self): self.repos = SubversionRepository(REPOS_PATH, None, logger_factory('test')) def tearDown(self): self.repos = None def test_repos_normalize_path(self): self.assertEqual('/', self.repos.normalize_path('/')) self.assertEqual('/', self.repos.normalize_path('')) self.assertEqual('/', self.repos.normalize_path(None)) self.assertEqual(u'tête', self.repos.normalize_path(u'tête')) self.assertEqual(u'tête', self.repos.normalize_path(u'/tête')) self.assertEqual(u'tête', self.repos.normalize_path(u'tête/')) self.assertEqual(u'tête', self.repos.normalize_path(u'/tête/')) def test_repos_normalize_rev(self): self.assertEqual(HEAD, self.repos.normalize_rev('latest')) self.assertEqual(HEAD, self.repos.normalize_rev('head')) self.assertEqual(HEAD, self.repos.normalize_rev('')) self.assertRaises(NoSuchChangeset, self.repos.normalize_rev, 'something else') self.assertEqual(HEAD, self.repos.normalize_rev(None)) self.assertEqual(11, self.repos.normalize_rev('11')) self.assertEqual(11, self.repos.normalize_rev(11)) def test_rev_navigation(self): self.assertEqual(1, self.repos.oldest_rev) self.assertEqual(None, self.repos.previous_rev(0)) self.assertEqual(None, self.repos.previous_rev(1)) self.assertEqual(HEAD, 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(HEAD)) self.assertRaises(NoSuchChangeset, self.repos.normalize_rev, HEAD + 1) def test_rev_path_navigation(self): self.assertEqual(1, self.repos.oldest_rev) self.assertEqual(None, self.repos.previous_rev(0, u'tête')) self.assertEqual(None, self.repos.previous_rev(1, u'tête')) self.assertEqual(HEAD, self.repos.youngest_rev) self.assertEqual(6, self.repos.next_rev(5, u'tête')) self.assertEqual(13, self.repos.next_rev(6, u'tête')) # ... self.assertEqual(None, self.repos.next_rev(HEAD, u'tête')) # test accentuated characters self.assertEqual(None, self.repos.previous_rev(17, u'tête/R\xe9sum\xe9.txt')) self.assertEqual(17, self.repos.next_rev(16, u'tête/R\xe9sum\xe9.txt')) def test_has_node(self): self.assertEqual(False, self.repos.has_node(u'/tête/dir1', 3)) self.assertEqual(True, self.repos.has_node(u'/tête/dir1', 4)) self.assertEqual(True, self.repos.has_node(u'/tête/dir1')) def test_get_node(self): node = self.repos.get_node(u'/tête') self.assertEqual(u'tête', node.name) self.assertEqual(u'/tête', node.path) self.assertEqual(Node.DIRECTORY, node.kind) self.assertEqual(HEAD, node.rev) self.assertEqual(datetime(2007,4,30,17,45,26,0,utc), node.last_modified) node = self.repos.get_node(u'/tête/README.txt') self.assertEqual('README.txt', node.name) self.assertEqual(u'/tête/README.txt', node.path) self.assertEqual(Node.FILE, node.kind) self.assertEqual(3, node.rev) self.assertEqual(datetime(2005,4,1,13,24,58,0,utc), node.last_modified) def test_get_node_specific_rev(self): node = self.repos.get_node(u'/tête', 1) self.assertEqual(u'tête', node.name) self.assertEqual(u'/tête', node.path) self.assertEqual(Node.DIRECTORY, node.kind) self.assertEqual(1, node.rev) self.assertEqual(datetime(2005,4,1,10,0,52,0,utc), node.last_modified) node = self.repos.get_node(u'/tête/README.txt', 2) self.assertEqual('README.txt', node.name) self.assertEqual(u'/tête/README.txt', node.path) self.assertEqual(Node.FILE, node.kind) self.assertEqual(2, node.rev) self.assertEqual(datetime(2005,4,1,13,12,18,0,utc), node.last_modified) def test_get_dir_entries(self): node = self.repos.get_node(u'/tête') entries = node.get_entries() self.assertEqual('dir1', entries.next().name) self.assertEqual('mpp_proc', entries.next().name) self.assertEqual('v2', entries.next().name) self.assertEqual('README3.txt', entries.next().name) self.assertEqual(u'R\xe9sum\xe9.txt', 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(u'/tête/README.txt') entries = node.get_entries() self.assertRaises(StopIteration, entries.next) def test_get_dir_content(self): node = self.repos.get_node(u'/tête') 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(u'/tête/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(u'/tête') props = f.get_properties() self.assertEqual(1, len(props)) def test_get_file_properties(self): f = self.repos.get_node(u'/tête/README.txt') props = f.get_properties() self.assertEqual('native', props['svn:eol-style']) self.assertEqual('text/plain', props['svn:mime-type']) def test_created_path_rev(self): node = self.repos.get_node(u'/tête/README3.txt', 15) self.assertEqual(14, node.rev) self.assertEqual(u'/tête/README3.txt', node.path) self.assertEqual(14, node.created_rev) self.assertEqual(u'tête/README3.txt', node.created_path) def test_created_path_rev_parent_copy(self): node = self.repos.get_node('/tags/v1/README.txt', 15) self.assertEqual(3, node.rev) self.assertEqual('/tags/v1/README.txt', node.path) self.assertEqual(3, node.created_rev) self.assertEqual(u'tête/README.txt', node.created_path) # Revision Log / node history def test_get_node_history(self): node = self.repos.get_node(u'/tête/README3.txt') history = node.get_history() self.assertEqual((u'tête/README3.txt', 14, 'copy'), history.next()) self.assertEqual((u'tête/README2.txt', 6, 'copy'), history.next()) self.assertEqual((u'tête/README.txt', 3, 'edit'), history.next()) self.assertEqual((u'tête/README.txt', 2, 'add'), history.next()) self.assertRaises(StopIteration, history.next) def test_get_node_history_limit(self): node = self.repos.get_node(u'/tête/README3.txt') history = node.get_history(2) self.assertEqual((u'tête/README3.txt', 14, 'copy'), history.next()) self.assertEqual((u'tête/README2.txt', 6, 'copy'), 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((u'tête/README.txt', 3, 'edit'), history.next()) self.assertEqual((u'tête/README.txt', 2, 'add'), history.next()) self.assertRaises(StopIteration, history.next) def test_get_copy_ancestry(self): node = self.repos.get_node('/tags/v1/README.txt') ancestry = node.get_copy_ancestry() self.assertEqual([(u'tête/README.txt', 6)], ancestry) for path, rev in ancestry: self.repos.get_node(path, rev) # shouldn't raise NoSuchNode node = self.repos.get_node(u'/tête/README3.txt') ancestry = node.get_copy_ancestry() self.assertEqual([(u'tête/README2.txt', 13), (u'tête/README.txt', 3)], ancestry) for path, rev in ancestry: self.repos.get_node(path, rev) # shouldn't raise NoSuchNode node = self.repos.get_node('/branches/v1x') ancestry = node.get_copy_ancestry() self.assertEqual([(u'tags/v1.1', 11), (u'branches/v1x', 9), (u'tags/v1', 7), (u'tête', 6)], ancestry) for path, rev in ancestry: self.repos.get_node(path, rev) # shouldn't raise NoSuchNode def test_get_copy_ancestry_for_move(self): node = self.repos.get_node(u'/tête/dir1/dir2', 5) ancestry = node.get_copy_ancestry() self.assertEqual([(u'tête/dir2', 4)], ancestry) for path, rev in ancestry: self.repos.get_node(path, rev) # shouldn't raise NoSuchNode def test_get_branch_origin(self): node = self.repos.get_node('/tags/v1/README.txt') self.assertEqual(7, node.get_branch_origin()) node = self.repos.get_node(u'/tête/README3.txt') self.assertEqual(14, node.get_branch_origin()) node = self.repos.get_node('/branches/v1x') self.assertEqual(12, node.get_branch_origin()) node = self.repos.get_node(u'/tête/dir1/dir2', 5) self.assertEqual(5, node.get_branch_origin()) # Revision Log / path history def test_get_path_history(self): history = self.repos.get_path_history(u'/tête/README2.txt', None) self.assertEqual((u'tête/README2.txt', 14, 'delete'), history.next()) self.assertEqual((u'tête/README2.txt', 6, 'copy'), history.next()) self.assertEqual((u'tête/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((u'tête/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_changes(u'tête/README.txt', 2, u'tête/README.txt', 3) self._cmp_diff(((u'tête/README.txt', 2), (u'tête/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_changes('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_changes(u'tête/README.txt', 7, 'tags/v1/README.txt', 7) self.assertRaises(StopIteration, diffs.next) def test_diff_dir_different_revs(self): diffs = self.repos.get_changes(u'tête', 4, u'tête', 8) self._cmp_diff((None, (u'tête/dir1/dir2', 8), (Node.DIRECTORY, Changeset.ADD)), diffs.next()) self._cmp_diff((None, (u'tête/dir1/dir3', 8), (Node.DIRECTORY, Changeset.ADD)), diffs.next()) self._cmp_diff((None, (u'tête/README2.txt', 6), (Node.FILE, Changeset.ADD)), diffs.next()) self._cmp_diff(((u'tête/dir2', 4), None, (Node.DIRECTORY, Changeset.DELETE)), diffs.next()) self._cmp_diff(((u'tête/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_changes(u'tête', 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_changes(u'tête', 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('', chgset.message) self.assertEqual('', chgset.author) self.assertEqual(datetime(2005,4,1,9,57,41,0,utc), 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(datetime(2005,4,1,10,0,52,0,utc), chgset.date) changes = chgset.get_changes() self.assertEqual(('branches', Node.DIRECTORY, Changeset.ADD, None, -1), changes.next()) self.assertEqual(('tags', Node.DIRECTORY, Changeset.ADD, None, -1), changes.next()) self.assertEqual((u'tête', 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(datetime(2005,4,1,13,24,58,0,utc), chgset.date) changes = chgset.get_changes() self.assertEqual((u'tête/README.txt', Node.FILE, Changeset.EDIT, u'tête/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(datetime(2005,4,1,16,25,39,0,utc), chgset.date) changes = chgset.get_changes() self.assertEqual((u'tête/dir1/dir2', Node.DIRECTORY, Changeset.MOVE, u'tête/dir2', 4), changes.next()) self.assertEqual((u'tête/dir1/dir3', Node.DIRECTORY, Changeset.MOVE, u'tête/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(datetime(2005,4,1,18,56,46,0,utc), chgset.date) changes = chgset.get_changes() self.assertEqual((u'tête/README2.txt', Node.FILE, Changeset.COPY, u'tête/README.txt', 3), changes.next()) self.assertRaises(StopIteration, changes.next) def test_changeset_root_propset(self): chgset = self.repos.get_changeset(13) self.assertEqual(13, chgset.rev) self.assertEqual('Setting property on the repository_dir root', chgset.message) changes = chgset.get_changes() self.assertEqual(('/', Node.DIRECTORY, Changeset.EDIT, '/', 12), changes.next()) self.assertEqual((u'tête', Node.DIRECTORY, Changeset.EDIT, u'tête', 6), changes.next()) self.assertRaises(StopIteration, changes.next) def test_changeset_base_path_rev(self): chgset = self.repos.get_changeset(9) self.assertEqual(9, chgset.rev) changes = chgset.get_changes() self.assertEqual(('branches/v1x/README.txt', Node.FILE, Changeset.EDIT, u'tête/README.txt', 3), changes.next()) self.assertRaises(StopIteration, changes.next) def test_changeset_rename_and_edit(self): chgset = self.repos.get_changeset(14) self.assertEqual(14, chgset.rev) changes = chgset.get_changes() self.assertEqual((u'tête/README3.txt', Node.FILE, Changeset.MOVE, u'tête/README2.txt', 13), changes.next()) self.assertRaises(StopIteration, changes.next) def test_changeset_edit_after_wc2wc_copy__original_deleted(self): chgset = self.repos.get_changeset(16) self.assertEqual(16, chgset.rev) changes = chgset.get_changes() self.assertEqual(('branches/v2', Node.DIRECTORY, Changeset.COPY, 'tags/v1.1', 14), changes.next()) self.assertEqual(('branches/v2/README2.txt', Node.FILE, Changeset.EDIT, u'tête/README2.txt', 6), changes.next()) self.assertRaises(StopIteration, changes.next) def test_fancy_rename_double_delete(self): chgset = self.repos.get_changeset(19) self.assertEqual(19, chgset.rev) changes = chgset.get_changes() self.assertEqual((u'tête/Xprimary_proc/Xprimary_pkg.vhd', Node.FILE, Changeset.DELETE, u'tête/Xprimary_proc/Xprimary_pkg.vhd', 18), changes.next()) self.assertEqual((u'tête/mpp_proc', Node.DIRECTORY, Changeset.MOVE, u'tête/Xprimary_proc', 18), changes.next()) self.assertEqual((u'tête/mpp_proc/Xprimary_proc', Node.DIRECTORY, Changeset.COPY, u'tête/Xprimary_proc', 18), changes.next()) self.assertRaises(StopIteration, changes.next) def test_changeset_utf_8(self): chgset = self.repos.get_changeset(20) self.assertEqual(20, chgset.rev) self.assertEqual(u'Chez moi ça marche\n', chgset.message) self.assertEqual(u'Jonas Borgström', chgset.author)
class SubversionRepositoryTestCase(unittest.TestCase): def setUp(self): self.repos = SubversionRepository(REPOS_PATH, None, logger_factory('test')) def tearDown(self): self.repos = None def test_repos_normalize_path(self): self.assertEqual('/', self.repos.normalize_path('/')) self.assertEqual('/', self.repos.normalize_path('')) self.assertEqual('/', self.repos.normalize_path(None)) self.assertEqual('trunk', self.repos.normalize_path('trunk')) self.assertEqual('trunk', self.repos.normalize_path('/trunk')) self.assertEqual('trunk', self.repos.normalize_path('trunk/')) self.assertEqual('trunk', self.repos.normalize_path('/trunk/')) def test_repos_normalize_rev(self): self.assertEqual(19, self.repos.normalize_rev('latest')) self.assertEqual(19, self.repos.normalize_rev('head')) self.assertEqual(19, self.repos.normalize_rev('')) self.assertEqual(19, self.repos.normalize_rev(None)) self.assertEqual(11, self.repos.normalize_rev('11')) self.assertEqual(11, self.repos.normalize_rev(11)) def test_rev_navigation(self): self.assertEqual(1, self.repos.oldest_rev) self.assertEqual(None, self.repos.previous_rev(0)) self.assertEqual(None, self.repos.previous_rev(1)) self.assertEqual(19, 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(19)) def test_rev_path_navigation(self): self.assertEqual(1, self.repos.oldest_rev) self.assertEqual(None, self.repos.previous_rev(0, 'trunk')) self.assertEqual(None, self.repos.previous_rev(1, 'trunk')) self.assertEqual(19, self.repos.youngest_rev) self.assertEqual(6, self.repos.next_rev(5, 'trunk')) self.assertEqual(13, self.repos.next_rev(6, 'trunk')) # ... self.assertEqual(None, self.repos.next_rev(19, 'trunk')) # test accentuated characters self.assertEqual( None, self.repos.previous_rev(17, u'trunk/R\xe9sum\xe9.txt')) self.assertEqual(17, self.repos.next_rev(16, u'trunk/R\xe9sum\xe9.txt')) def test_has_node(self): self.assertEqual(False, self.repos.has_node('/trunk/dir1', 3)) self.assertEqual(True, self.repos.has_node('/trunk/dir1', 4)) 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(19, node.rev) self.assertEqual(1159353687L, 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('mpp_proc', entries.next().name) self.assertEqual(u'R\xe9sum\xe9.txt', entries.next().name) self.assertEqual('dir1', entries.next().name) self.assertEqual('README3.txt', 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(1, 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']) def test_created_path_rev(self): node = self.repos.get_node('/trunk/README3.txt', 15) self.assertEqual(14, node.rev) self.assertEqual('/trunk/README3.txt', node.path) self.assertEqual(14, node.created_rev) self.assertEqual('trunk/README3.txt', node.created_path) def test_created_path_rev_parent_copy(self): node = self.repos.get_node('/tags/v1/README.txt', 15) self.assertEqual(3, node.rev) self.assertEqual('/tags/v1/README.txt', node.path) self.assertEqual(3, node.created_rev) self.assertEqual('trunk/README.txt', node.created_path) # Revision Log / node history def test_get_node_history(self): node = self.repos.get_node('/trunk/README3.txt') history = node.get_history() self.assertEqual(('trunk/README3.txt', 14, 'copy'), history.next()) 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', 14, 'delete'), history.next()) 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_changes('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_changes('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_changes('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_changes('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_changes('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_changes('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(('branches', Node.DIRECTORY, Changeset.ADD, None, -1), changes.next()) self.assertEqual(('tags', Node.DIRECTORY, Changeset.ADD, None, -1), changes.next()) self.assertEqual(('trunk', 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 test_changeset_root_propset(self): chgset = self.repos.get_changeset(13) self.assertEqual(13, chgset.rev) self.assertEqual('Setting property on the repository_dir root', chgset.message) changes = chgset.get_changes() self.assertEqual(('/', Node.DIRECTORY, Changeset.EDIT, '/', 12), changes.next()) self.assertEqual(('trunk', Node.DIRECTORY, Changeset.EDIT, 'trunk', 6), changes.next()) self.assertRaises(StopIteration, changes.next) def test_changeset_base_path_rev(self): chgset = self.repos.get_changeset(9) self.assertEqual(9, chgset.rev) changes = chgset.get_changes() self.assertEqual(('branches/v1x/README.txt', Node.FILE, Changeset.EDIT, 'trunk/README.txt', 3), changes.next()) self.assertRaises(StopIteration, changes.next) def test_changeset_rename_and_edit(self): chgset = self.repos.get_changeset(14) self.assertEqual(14, chgset.rev) changes = chgset.get_changes() self.assertEqual(('trunk/README3.txt', Node.FILE, Changeset.MOVE, 'trunk/README2.txt', 13), changes.next()) self.assertRaises(StopIteration, changes.next) def test_changeset_edit_after_wc2wc_copy__original_deleted(self): chgset = self.repos.get_changeset(16) self.assertEqual(16, chgset.rev) changes = chgset.get_changes() self.assertEqual( ('branches/v2', Node.DIRECTORY, Changeset.COPY, 'tags/v1.1', 14), changes.next()) self.assertEqual(('branches/v2/README2.txt', Node.FILE, Changeset.EDIT, 'trunk/README2.txt', 6), changes.next()) self.assertRaises(StopIteration, changes.next) def test_fancy_rename_double_delete(self): chgset = self.repos.get_changeset(19) self.assertEqual(19, chgset.rev) changes = chgset.get_changes() self.assertEqual( ('trunk/Xprimary_proc/Xprimary_pkg.vhd', Node.FILE, Changeset.DELETE, 'trunk/Xprimary_proc/Xprimary_pkg.vhd', 18), changes.next()) self.assertEqual(('trunk/mpp_proc', Node.DIRECTORY, Changeset.COPY, 'trunk/Xprimary_proc', 18), changes.next()) self.assertEqual(('trunk/mpp_proc/Xprimary_proc', Node.DIRECTORY, Changeset.MOVE, 'trunk/Xprimary_proc', 18), changes.next()) self.assertRaises(StopIteration, changes.next)