# HG changeset patch # User Augie Fackler # Date 1223516221 18000 # Node ID 1f88548047953daf591756d0c6c53ed3653d43c9 # Parent 95d0109e495e1d3baf40752d565f2a01ce804506 Add tests for tags and fix a bug in the tag-finding code that was found by the tests. diff --git a/hg_delta_editor.py b/hg_delta_editor.py --- a/hg_delta_editor.py +++ b/hg_delta_editor.py @@ -293,6 +293,7 @@ class HgChangeReceiver(delta.Editor): del self.tags[t] self.tags.update(added_tags) self.branches.update(added_branches) + self._save_metadata() def commit_current_delta(self): if hasattr(self, '_exception_info'): diff --git a/tests/fixtures/basic_tag_tests.svndump b/tests/fixtures/basic_tag_tests.svndump new file mode 100644 --- /dev/null +++ b/tests/fixtures/basic_tag_tests.svndump @@ -0,0 +1,177 @@ +SVN-fs-dump-format-version: 2 + +UUID: df2126f7-00ab-4d49-b42c-7e981dde0bcf + +Revision-number: 0 +Prop-content-length: 56 +Content-length: 56 + +K 8 +svn:date +V 27 +2008-10-07T22:49:12.059692Z +PROPS-END + +Revision-number: 1 +Prop-content-length: 111 +Content-length: 111 + +K 7 +svn:log +V 11 +Empty dirs. +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T22:49:41.118037Z +PROPS-END + +Node-path: branches +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: tags +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: trunk +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Revision-number: 2 +Prop-content-length: 108 +Content-length: 108 + +K 7 +svn:log +V 9 +Add alpha +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T23:23:02.991743Z +PROPS-END + +Node-path: trunk/alpha +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 12 +Text-content-md5: 3c72ebf8bbd7fa88b1fdcee5398b5a17 +Content-length: 22 + +PROPS-END +file: alpha + + +Revision-number: 3 +Prop-content-length: 107 +Content-length: 107 + +K 7 +svn:log +V 8 +Add beta +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T23:28:22.651398Z +PROPS-END + +Node-path: trunk/beta +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 13 +Text-content-md5: 981d1eb5fd0bbe05354c292105944863 +Content-length: 23 + +PROPS-END +Data of beta + + +Revision-number: 4 +Prop-content-length: 110 +Content-length: 110 + +K 7 +svn:log +V 10 +tagging r3 +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:18:29.837825Z +PROPS-END + +Node-path: tags/tag_r3 +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 3 +Node-copyfrom-path: trunk +Prop-content-length: 34 +Content-length: 34 + +K 13 +svn:mergeinfo +V 0 + +PROPS-END + + +Revision-number: 5 +Prop-content-length: 114 +Content-length: 114 + +K 7 +svn:log +V 14 +tag from a tag +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:18:51.091356Z +PROPS-END + +Node-path: tags/copied_tag +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 4 +Node-copyfrom-path: tags/tag_r3 + + diff --git a/tests/fixtures/branch_from_tag.svndump b/tests/fixtures/branch_from_tag.svndump new file mode 100644 --- /dev/null +++ b/tests/fixtures/branch_from_tag.svndump @@ -0,0 +1,202 @@ +SVN-fs-dump-format-version: 2 + +UUID: df2126f7-00ab-4d49-b42c-7e981dde0bcf + +Revision-number: 0 +Prop-content-length: 56 +Content-length: 56 + +K 8 +svn:date +V 27 +2008-10-07T22:49:12.059692Z +PROPS-END + +Revision-number: 1 +Prop-content-length: 111 +Content-length: 111 + +K 7 +svn:log +V 11 +Empty dirs. +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T22:49:41.118037Z +PROPS-END + +Node-path: branches +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: tags +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: trunk +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Revision-number: 2 +Prop-content-length: 108 +Content-length: 108 + +K 7 +svn:log +V 9 +Add alpha +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T23:23:02.991743Z +PROPS-END + +Node-path: trunk/alpha +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 12 +Text-content-md5: 3c72ebf8bbd7fa88b1fdcee5398b5a17 +Content-length: 22 + +PROPS-END +file: alpha + + +Revision-number: 3 +Prop-content-length: 107 +Content-length: 107 + +K 7 +svn:log +V 8 +Add beta +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T23:28:22.651398Z +PROPS-END + +Node-path: trunk/beta +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 13 +Text-content-md5: 981d1eb5fd0bbe05354c292105944863 +Content-length: 23 + +PROPS-END +Data of beta + + +Revision-number: 4 +Prop-content-length: 110 +Content-length: 110 + +K 7 +svn:log +V 10 +tagging r3 +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:18:29.837825Z +PROPS-END + +Node-path: tags/tag_r3 +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 3 +Node-copyfrom-path: trunk +Prop-content-length: 34 +Content-length: 34 + +K 13 +svn:mergeinfo +V 0 + +PROPS-END + + +Revision-number: 5 +Prop-content-length: 114 +Content-length: 114 + +K 7 +svn:log +V 14 +tag from a tag +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:18:51.091356Z +PROPS-END + +Node-path: tags/copied_tag +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 4 +Node-copyfrom-path: tags/tag_r3 + + +Revision-number: 6 +Prop-content-length: 125 +Content-length: 125 + +K 7 +svn:log +V 25 +Make a branch from a tag. +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-09T00:07:48.076984Z +PROPS-END + +Node-path: branches/branch_from_tag +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 5 +Node-copyfrom-path: tags/tag_r3 + + diff --git a/tests/fixtures/remove_tag_test.svndump b/tests/fixtures/remove_tag_test.svndump new file mode 100644 --- /dev/null +++ b/tests/fixtures/remove_tag_test.svndump @@ -0,0 +1,228 @@ +SVN-fs-dump-format-version: 2 + +UUID: df2126f7-00ab-4d49-b42c-7e981dde0bcf + +Revision-number: 0 +Prop-content-length: 56 +Content-length: 56 + +K 8 +svn:date +V 27 +2008-10-07T22:49:12.059692Z +PROPS-END + +Revision-number: 1 +Prop-content-length: 111 +Content-length: 111 + +K 7 +svn:log +V 11 +Empty dirs. +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T22:49:41.118037Z +PROPS-END + +Node-path: branches +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: tags +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: trunk +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Revision-number: 2 +Prop-content-length: 108 +Content-length: 108 + +K 7 +svn:log +V 9 +Add alpha +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T23:23:02.991743Z +PROPS-END + +Node-path: trunk/alpha +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 12 +Text-content-md5: 3c72ebf8bbd7fa88b1fdcee5398b5a17 +Content-length: 22 + +PROPS-END +file: alpha + + +Revision-number: 3 +Prop-content-length: 107 +Content-length: 107 + +K 7 +svn:log +V 8 +Add beta +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T23:28:22.651398Z +PROPS-END + +Node-path: trunk/beta +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 13 +Text-content-md5: 981d1eb5fd0bbe05354c292105944863 +Content-length: 23 + +PROPS-END +Data of beta + + +Revision-number: 4 +Prop-content-length: 110 +Content-length: 110 + +K 7 +svn:log +V 10 +tagging r3 +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:18:29.837825Z +PROPS-END + +Node-path: tags/tag_r3 +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 3 +Node-copyfrom-path: trunk +Prop-content-length: 34 +Content-length: 34 + +K 13 +svn:mergeinfo +V 0 + +PROPS-END + + +Revision-number: 5 +Prop-content-length: 114 +Content-length: 114 + +K 7 +svn:log +V 14 +tag from a tag +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:18:51.091356Z +PROPS-END + +Node-path: tags/copied_tag +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 4 +Node-copyfrom-path: tags/tag_r3 + + +Revision-number: 6 +Prop-content-length: 112 +Content-length: 112 + +K 7 +svn:log +V 12 +rename a tag +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:20:23.431085Z +PROPS-END + +Node-path: tags/other_tag_r3 +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 5 +Node-copyfrom-path: tags/copied_tag + + +Node-path: tags/copied_tag +Node-action: delete + + +Revision-number: 7 +Prop-content-length: 120 +Content-length: 120 + +K 7 +svn:log +V 20 +remove a tag as well +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:21:43.223062Z +PROPS-END + +Node-path: tags/other_tag_r3 +Node-action: delete + + diff --git a/tests/fixtures/rename_tag_test.svndump b/tests/fixtures/rename_tag_test.svndump new file mode 100644 --- /dev/null +++ b/tests/fixtures/rename_tag_test.svndump @@ -0,0 +1,206 @@ +SVN-fs-dump-format-version: 2 + +UUID: df2126f7-00ab-4d49-b42c-7e981dde0bcf + +Revision-number: 0 +Prop-content-length: 56 +Content-length: 56 + +K 8 +svn:date +V 27 +2008-10-07T22:49:12.059692Z +PROPS-END + +Revision-number: 1 +Prop-content-length: 111 +Content-length: 111 + +K 7 +svn:log +V 11 +Empty dirs. +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T22:49:41.118037Z +PROPS-END + +Node-path: branches +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: tags +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Node-path: trunk +Node-kind: dir +Node-action: add +Prop-content-length: 10 +Content-length: 10 + +PROPS-END + + +Revision-number: 2 +Prop-content-length: 108 +Content-length: 108 + +K 7 +svn:log +V 9 +Add alpha +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T23:23:02.991743Z +PROPS-END + +Node-path: trunk/alpha +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 12 +Text-content-md5: 3c72ebf8bbd7fa88b1fdcee5398b5a17 +Content-length: 22 + +PROPS-END +file: alpha + + +Revision-number: 3 +Prop-content-length: 107 +Content-length: 107 + +K 7 +svn:log +V 8 +Add beta +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-07T23:28:22.651398Z +PROPS-END + +Node-path: trunk/beta +Node-kind: file +Node-action: add +Prop-content-length: 10 +Text-content-length: 13 +Text-content-md5: 981d1eb5fd0bbe05354c292105944863 +Content-length: 23 + +PROPS-END +Data of beta + + +Revision-number: 4 +Prop-content-length: 110 +Content-length: 110 + +K 7 +svn:log +V 10 +tagging r3 +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:18:29.837825Z +PROPS-END + +Node-path: tags/tag_r3 +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 3 +Node-copyfrom-path: trunk +Prop-content-length: 34 +Content-length: 34 + +K 13 +svn:mergeinfo +V 0 + +PROPS-END + + +Revision-number: 5 +Prop-content-length: 114 +Content-length: 114 + +K 7 +svn:log +V 14 +tag from a tag +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:18:51.091356Z +PROPS-END + +Node-path: tags/copied_tag +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 4 +Node-copyfrom-path: tags/tag_r3 + + +Revision-number: 6 +Prop-content-length: 112 +Content-length: 112 + +K 7 +svn:log +V 12 +rename a tag +K 10 +svn:author +V 5 +durin +K 8 +svn:date +V 27 +2008-10-08T23:20:23.431085Z +PROPS-END + +Node-path: tags/other_tag_r3 +Node-kind: dir +Node-action: add +Node-copyfrom-rev: 5 +Node-copyfrom-path: tags/copied_tag + + +Node-path: tags/copied_tag +Node-action: delete + + diff --git a/tests/run.py b/tests/run.py --- a/tests/run.py +++ b/tests/run.py @@ -7,11 +7,13 @@ sys.path.append(os.path.dirname(os.path. import test_fetch_command import test_fetch_command_regexes import test_push_command +import test_tags def suite(): return unittest.TestSuite([test_fetch_command.suite(), test_fetch_command_regexes.suite(), test_push_command.suite(), + test_tags.suite(), ]) if __name__ == '__main__': diff --git a/tests/test_tags.py b/tests/test_tags.py new file mode 100644 --- /dev/null +++ b/tests/test_tags.py @@ -0,0 +1,87 @@ +import os +import shutil +import tempfile +import unittest + +from mercurial import hg +from mercurial import node +from mercurial import ui + +import test_util + +import svncommand + +class TestTags(unittest.TestCase): + def setUp(self): + self.oldwd = os.getcwd() + self.tmpdir = tempfile.mkdtemp('svnwrap_test') + self.repo_path = '%s/testrepo' % self.tmpdir + self.wc_path = '%s/testrepo_wc' % self.tmpdir + + def tearDown(self): + shutil.rmtree(self.tmpdir) + os.chdir(self.oldwd) + + def _load_fixture_and_fetch(self, fixture_name, stupid=False): + return test_util.load_fixture_and_fetch(fixture_name, self.repo_path, + self.wc_path, stupid=stupid) + + def _test_tag_revision_info(self, repo): + self.assertEqual(node.hex(repo[0].node()), + 'a47d0ce778660a91c31bf2c21c448e9ee296ac90') + self.assertEqual(node.hex(repo['tip'].node()), + 'bf3767835b3b32ecc775a298c2fa27134dd91c11') + self.assertEqual(repo['tip'], repo[1]) + + def test_tags(self, stupid=False): + repo = self._load_fixture_and_fetch('basic_tag_tests.svndump', + stupid=stupid) + self._test_tag_revision_info(repo) + svncommand.generate_hg_tags(ui.ui(), self.wc_path) + repo = hg.repository(ui.ui(), self.wc_path) + self.assertEqual(repo['tip'].node(), repo['tag:tag_r3'].node()) + self.assertEqual(repo['tip'].node(), repo['tag:copied_tag'].node()) + + def test_tags_stupid(self): + self.test_tags(stupid=True) + + def test_remove_tag(self, stupid=False): + repo = self._load_fixture_and_fetch('remove_tag_test.svndump', + stupid=stupid) + self._test_tag_revision_info(repo) + svncommand.generate_hg_tags(ui.ui(), self.wc_path) + repo = hg.repository(ui.ui(), self.wc_path) + self.assertEqual(repo['tip'].node(), repo['tag:tag_r3'].node()) + self.assert_('tag:copied_tag' not in repo.tags()) + + def test_remove_tag_stupid(self): + self.test_remove_tag(stupid=True) + + def test_rename_tag(self, stupid=False): + repo = self._load_fixture_and_fetch('rename_tag_test.svndump', + stupid=stupid) + self._test_tag_revision_info(repo) + svncommand.generate_hg_tags(ui.ui(), self.wc_path) + repo = hg.repository(ui.ui(), self.wc_path) + self.assertEqual(repo['tip'].node(), repo['tag:tag_r3'].node()) + self.assertEqual(repo['tip'].node(), repo['tag:other_tag_r3'].node()) + self.assert_('tag:copied_tag' not in repo.tags()) + + def test_rename_tag_stupid(self): + self.test_rename_tag(stupid=True) + + def test_branch_from_tag(self, stupid=False): + repo = self._load_fixture_and_fetch('branch_from_tag.svndump', + stupid=stupid) + svncommand.generate_hg_tags(ui.ui(), self.wc_path) + repo = hg.repository(ui.ui(), self.wc_path) + self.assertEqual(repo['tip'].node(), repo['branch_from_tag'].node()) + self.assertEqual(repo[1].node(), repo['tag:tag_r3'].node()) + self.assertEqual(repo['branch_from_tag'].parents()[0].node(), + repo['tag:copied_tag'].node()) + + def test_branch_from_tag_stupid(self): + self.test_branch_from_tag(stupid=True) + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(TestTags) diff --git a/tests/test_util.py b/tests/test_util.py --- a/tests/test_util.py +++ b/tests/test_util.py @@ -20,10 +20,11 @@ def load_svndump_fixture(path, fixture_n proc.tochild.close() proc.wait() -def load_fixture_and_fetch(fixture_name, repo_path, wc_path): +def load_fixture_and_fetch(fixture_name, repo_path, wc_path, stupid=False): load_svndump_fixture(repo_path, fixture_name) fetch_command.fetch_revisions(ui.ui(), svn_url='file://%s' % repo_path, - hg_repo_path=wc_path) + hg_repo_path=wc_path, + stupid=stupid) repo = hg.repository(ui.ui(), wc_path) return repo