Mercurial > hgsubversion
view tests/comprehensive/test_updatemeta.py @ 1134:a9b6e38d6dc9
util: add visitor pattern for scrubbing json
These functions are for future patches that will add safer serialization via
json. '_convert' is a visitor pattern that will be used for lists,
dictionaries, and strings for helping convert None to the empty string since
json forbids 'null' as a key for a dictionary.
None -> '' is a safe mapping because this is for the 'branch_info' variable
which already maps the empty string to None.
Note, also, that json is chosen instead of, say, csv because json has a concept
of 'null' and will better handle utf8 strings (which subversion supports).
Important: this changes the requirement of hgsubversion to python 2.6+.
author | Sean Farley <sean.michael.farley@gmail.com> |
---|---|
date | Mon, 17 Feb 2014 11:10:38 -0600 |
parents | cd0d14e25757 |
children | c6b01fd34694 |
line wrap: on
line source
import os import pickle import sys import unittest # wrapped in a try/except because of weirdness in how # run.py works as compared to nose. try: import test_util except ImportError: sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) import test_util import test_rebuildmeta from mercurial import context from mercurial import extensions from mercurial import hg from mercurial import ui from hgsubversion import svncommands from hgsubversion import svnmeta def _do_case(self, name, layout): subdir = test_util.subdir.get(name, '') single = layout == 'single' u = ui.ui() config = {} if layout == 'custom': config['hgsubversion.layout'] = 'custom' u.setconfig('hgsubversion', 'layout', 'custom') for branch, path in test_util.custom.get(name, {}).iteritems(): config['hgsubversionbranch.%s' % branch] = path u.setconfig('hgsubversionbranch', branch, path) repo, repo_path = self.load_and_fetch(name, subdir=subdir, layout=layout, config=config) assert test_util.repolen(self.repo) > 0 wc2_path = self.wc_path + '_clone' src, dest = test_util.hgclone(u, self.wc_path, wc2_path, update=False) src = test_util.getlocalpeer(src) dest = test_util.getlocalpeer(dest) # insert a wrapper that prevents calling changectx.children() def failfn(orig, ctx): self.fail('calling %s is forbidden; it can cause massive slowdowns ' 'when rebuilding large repositories' % orig) origchildren = getattr(context.changectx, 'children') extensions.wrapfunction(context.changectx, 'children', failfn) # test updatemeta on an empty repo try: svncommands.updatemeta(u, dest, args=[test_util.fileurl(repo_path + subdir), ]) finally: # remove the wrapper context.changectx.children = origchildren self._run_assertions(name, single, src, dest, u) def _run_assertions(self, name, single, src, dest, u): test_rebuildmeta._run_assertions(self, name, single, src, dest, u) skip = set([ 'project_root_not_repo_root.svndump', 'corrupt.svndump', ]) attrs = {'_do_case': _do_case, '_run_assertions': _run_assertions, 'stupid_mode_tests': True, } for case in [f for f in os.listdir(test_util.FIXTURES) if f.endswith('.svndump')]: # this fixture results in an empty repository, don't use it if case in skip: continue bname = 'test_' + case[:-len('.svndump')] attrs[bname] = test_rebuildmeta.buildmethod(case, bname, 'auto') attrs[bname + '_single'] = test_rebuildmeta.buildmethod(case, bname + '_single', 'single') if case in test_util.custom: attrs[bname + '_custom'] = test_rebuildmeta.buildmethod(case, bname + '_custom', 'custom') UpdateMetaTests = type('UpdateMetaTests', (test_util.TestBase,), attrs)