Mercurial > hgsubversion
view tests/test_utility_commands.py @ 637:92f4a4b60696
rebuildmeta: optimize by removing quadratic time usage
Calling ctx.children() for revision R visits all revisions greater than
R. If I remember my algorithmics right, that's O(n^2). Performing an
extra traversal, however, is O(n).
A quick benchmark on a repository ~20k revisions:
before: 445.27s user 1.10s system
after: 7.25s user 0.25s system
The resulting `svn' directories are exactly the same, and the tests
continue to pass.
author | Dan Villiom Podlaski Christiansen <danchr@gmail.com> |
---|---|
date | Fri, 09 Jul 2010 22:18:27 +0200 |
parents | de384e4e0423 |
children | d2ef7220a079 |
line wrap: on
line source
import os import unittest from hgext import rebase from mercurial import hg from mercurial import revlog from mercurial import context from mercurial import node from mercurial import commands from hgsubversion import util from hgsubversion import svncommands import test_util from hgsubversion import wrappers expected_info_output = '''URL: %(repourl)s/%(branch)s Repository Root: %(repourl)s Repository UUID: df2126f7-00ab-4d49-b42c-7e981dde0bcf Revision: %(rev)s Node Kind: directory Last Changed Author: durin Last Changed Rev: %(rev)s Last Changed Date: %(date)s ''' class UtilityTests(test_util.TestBase): @property def repourl(self): return util.normalize_url(test_util.fileurl(self.repo_path)) def test_info_output(self): self._load_fixture_and_fetch('two_heads.svndump') hg.update(self.repo, 'the_branch') u = self.ui() u.pushbuffer() svncommands.info(u, self.repo) actual = u.popbuffer() expected = (expected_info_output % {'date': '2008-10-08 01:39:05 +0000 (Wed, 08 Oct 2008)', 'repourl': self.repourl, 'branch': 'branches/the_branch', 'rev': 5, }) self.assertEqual(actual, expected) hg.update(self.repo, 'default') u.pushbuffer() svncommands.info(u, self.repo) actual = u.popbuffer() expected = (expected_info_output % {'date': '2008-10-08 01:39:29 +0000 (Wed, 08 Oct 2008)', 'repourl': self.repourl, 'branch': 'trunk', 'rev': 6, }) self.assertEqual(actual, expected) hg.update(self.repo, 'default') u.pushbuffer() svncommands.info(u, self.repo, rev=3) actual = u.popbuffer() expected = (expected_info_output % {'date': '2008-10-08 01:39:05 +0000 (Wed, 08 Oct 2008)', 'repourl': self.repourl, 'branch': 'branches/the_branch', 'rev': 5, }) self.assertEqual(actual, expected) def test_info_single(self): self._load_fixture_and_fetch('two_heads.svndump', subdir='trunk') hg.update(self.repo, 'tip') u = self.ui() u.pushbuffer() svncommands.info(u, self.repo) actual = u.popbuffer() expected = (expected_info_output % {'date': '2008-10-08 01:39:29 +0000 (Wed, 08 Oct 2008)', 'repourl': self.repourl, 'branch': 'trunk', 'rev': 6, }) self.assertStringEqual(expected, actual) def test_parent_output(self): self._load_fixture_and_fetch('two_heads.svndump') u = self.ui() u.pushbuffer() parents = (self.repo['the_branch'].node(), revlog.nullid, ) def filectxfn(repo, memctx, path): return context.memfilectx(path=path, data='added', islink=False, isexec=False, copied=False) ctx = context.memctx(self.repo, parents, 'automated test', ['added_bogus_file', 'other_added_file', ], filectxfn, 'testy', '2008-12-21 16:32:00 -0500', {'branch': 'localbranch', }) new = self.repo.commitctx(ctx) hg.update(self.repo, new) wrappers.parents(lambda x, y: None, u, self.repo, svn=True) actual = u.popbuffer() self.assertEqual(actual, '3:4e256962fc5d\n') hg.update(self.repo, 'default') # Make sure styles work u.pushbuffer() wrappers.parents(lambda x, y: None, u, self.repo, svn=True, style='compact') actual = u.popbuffer() self.assertEqual(actual, '4:1083037b18d8\n') # custom templates too u.pushbuffer() wrappers.parents(lambda x, y: None, u, self.repo, svn=True, template='{node}\n') actual = u.popbuffer() self.assertEqual(actual, '1083037b18d85cd84fa211c5adbaeff0fea2cd9f\n') u.pushbuffer() wrappers.parents(lambda x, y: None, u, self.repo, svn=True) actual = u.popbuffer() self.assertEqual(actual, '4:1083037b18d8\n') def test_outgoing_output(self): self._load_fixture_and_fetch('two_heads.svndump') u = self.ui() parents = (self.repo['the_branch'].node(), revlog.nullid, ) def filectxfn(repo, memctx, path): return context.memfilectx(path=path, data='added', islink=False, isexec=False, copied=False) ctx = context.memctx(self.repo, parents, 'automated test', ['added_bogus_file', 'other_added_file', ], filectxfn, 'testy', '2008-12-21 16:32:00 -0500', {'branch': 'localbranch', }) new = self.repo.commitctx(ctx) hg.update(self.repo, new) u.pushbuffer() commands.outgoing(u, self.repo, self.repourl) actual = u.popbuffer() self.assertTrue(node.hex(self.repo['localbranch'].node())[:8] in actual) self.assertEqual(actual.strip(), '5:6de15430fa20') hg.update(self.repo, 'default') u.pushbuffer() commands.outgoing(u, self.repo, self.repourl) actual = u.popbuffer() self.assertEqual(actual, '') def test_rebase(self): self._load_fixture_and_fetch('two_revs.svndump') parents = (self.repo[0].node(), revlog.nullid, ) def filectxfn(repo, memctx, path): return context.memfilectx(path=path, data='added', islink=False, isexec=False, copied=False) ctx = context.memctx(self.repo, parents, 'automated test', ['added_bogus_file', 'other_added_file', ], filectxfn, 'testy', '2008-12-21 16:32:00 -0500', {'branch': 'localbranch', }) self.repo.commitctx(ctx) self.assertEqual(self.repo['tip'].branch(), 'localbranch') beforerebasehash = self.repo['tip'].node() hg.update(self.repo, 'tip') wrappers.rebase(rebase.rebase, self.ui(), self.repo, svn=True) self.assertEqual(self.repo['tip'].branch(), 'localbranch') self.assertEqual(self.repo['tip'].parents()[0].parents()[0], self.repo[0]) self.assertNotEqual(beforerebasehash, self.repo['tip'].node()) def test_genignore(self): """ Test generation of .hgignore file. """ test_util.load_fixture_and_fetch('ignores.svndump', self.repo_path, self.wc_path, noupdate=False) u = self.ui() u.pushbuffer() svncommands.genignore(u, self.repo, self.wc_path) self.assertEqual(open(os.path.join(self.wc_path, '.hgignore')).read(), '.hgignore\nsyntax:glob\nblah\notherblah\nbaz/magic\n') def test_genignore_single(self): self._load_fixture_and_fetch('ignores.svndump', subdir='trunk') hg.update(self.repo, 'tip') u = self.ui() u.pushbuffer() svncommands.genignore(u, self.repo, self.wc_path) self.assertStringEqual(open(os.path.join(self.wc_path, '.hgignore')).read(), '.hgignore\nsyntax:glob\nblah\notherblah\nbaz/magic\n') def test_list_authors(self): test_util.load_svndump_fixture(self.repo_path, 'replace_trunk_with_branch.svndump') u = self.ui() u.pushbuffer() svncommands.listauthors(u, args=[test_util.fileurl(self.repo_path)], authors=None) actual = u.popbuffer() self.assertEqual(actual, 'Augie\nevil\n') def test_list_authors_map(self): test_util.load_svndump_fixture(self.repo_path, 'replace_trunk_with_branch.svndump') author_path = os.path.join(self.repo_path, 'authors') svncommands.listauthors(self.ui(), args=[test_util.fileurl(self.repo_path)], authors=author_path) self.assertEqual(open(author_path).read(), 'Augie=\nevil=\n') def suite(): all = [unittest.TestLoader().loadTestsFromTestCase(UtilityTests), ] return unittest.TestSuite(all)