view tests/test_revmap_migrate.py @ 1516:fbc22592f4fa

push: lock repo before calling createmarkers Previously, when devel.all-warnings is set to True, hg subversion will crash when pushing with the error: ProgrammingError: transaction requires locking Tracking that down, that is because "createmarkers" was called without locking. A comprehensive test was added to run test_push_command with obsstore turned on to cover the code paths.
author Jun Wu <quark@fb.com>
date Mon, 07 Aug 2017 18:12:16 -0700
parents 8937f19586fe
children
line wrap: on
line source

import test_util

from mercurial import util as hgutil
from hgsubversion import svnmeta, maps
from mercurial.node import hex

class TestRevMapMigrate(test_util.TestBase):

    def tearDown(self):
        # revert changes to defaultrevmapclass
        svnmeta.SVNMeta._defaultrevmapclass = maps.RevMap

    def _test_revmap_migrate(self, fromclass, toclass):
        # revmap interfaces to test
        getters = [
            lambda x: x.branchedits('the_branch', 3),
            lambda x: x.branchedits('the_branch', 4),
            lambda x: x.branchedits('the_branch', 5),
            lambda x: x.branchedits('the_branch', 6),
            lambda x: x.branchedits(None, 5),
            lambda x: x.branchedits('non_existed', 10),
            lambda x: x.branchmaxrevnum('the_branch', 3),
            lambda x: x.branchmaxrevnum('the_branch', 4),
            lambda x: x.branchmaxrevnum('the_branch', 5),
            lambda x: x.branchmaxrevnum('the_branch', 6),
            lambda x: x.branchmaxrevnum(None, 5),
            lambda x: x.branchmaxrevnum('non_existed', 10),
            lambda x: list(x.revhashes(3)),
            lambda x: list(x.revhashes(4)),
            lambda x: list(x.revhashes(42)),
            lambda x: list(x.revhashes(105)),
            lambda x: x.firstpulled,
            lambda x: x.lastpulled,
            lambda x: x.lasthash,
        ]

        svnmeta.SVNMeta._defaultrevmapclass = fromclass
        repo = self._load_fixture_and_fetch('two_heads.svndump')
        meta = svnmeta.SVNMeta(repo)
        self.assertEqual(meta.revmap.__class__, fromclass)
        origrevmap = meta.revmap

        # insert fake special (duplicated, with '\0') data
        origrevmap[103, None] = b'\0' * 20
        origrevmap[104, None] = b'\0' * 18 + b'cd'
        origrevmap[105, None] = b'ab\0cdefghijklmnopqrs'
        origrevmap[104, None] = b'\0' * 18 + b'\xff\0'
        origrevmap[105, 'ab'] = origrevmap[105, None]

        origvalues = [f(meta.revmap) for f in getters]

        # migrate to another format (transparently)
        svnmeta.SVNMeta._defaultrevmapclass = toclass
        meta = svnmeta.SVNMeta(repo)
        self.assertEqual(meta.revmap.__class__, toclass)

        # enable iteration otherwise we cannot use iteritems
        origrevmap._allowiter = True
        for k, v in origrevmap.iteritems():
            newv = meta.revmap[k]
            self.assertEqual(newv, v)
            self.assertEqual(len(newv), 20)
            self.assertEqual(meta.revmap[meta.revmap.hashes()[v]], v)

        newvalues = [f(meta.revmap) for f in getters]
        self.assertEqual(origvalues, newvalues)

    def test_revmap_migrate_up(self):
        self._test_revmap_migrate(maps.RevMap, maps.SqliteRevMap)

    def test_revmap_migrate_down(self):
        self._test_revmap_migrate(maps.SqliteRevMap, maps.RevMap)