mirror of
https://github.com/facebook/sapling.git
synced 2024-10-12 09:48:05 +03:00
c12e300bb8
Summary: Move top-level Python packages `mercurial`, `hgext` and `hgdemandimport` to a new top-level package `edenscm`. This allows the Python packages provided by the upstream Mercurial to be installed side-by-side. To maintain compatibility, `edenscm/` gets added to `sys.path` in `mercurial/__init__.py`. Reviewed By: phillco, ikostia Differential Revision: D13853115 fbshipit-source-id: b296b0673dc54c61ef6a591ebc687057ff53b22e
112 lines
2.9 KiB
Python
112 lines
2.9 KiB
Python
import edenscm.mercurial as mercurial
|
|
import test_hgsubversion_util
|
|
from edenscm.hgext.hgsubversion import stupid
|
|
from edenscm.mercurial import commands
|
|
|
|
|
|
class TestPullFallback(test_hgsubversion_util.TestBase):
|
|
def setUp(self):
|
|
super(TestPullFallback, self).setUp()
|
|
|
|
def _loadupdate(self, fixture_name, *args, **kwargs):
|
|
kwargs = kwargs.copy()
|
|
kwargs.update(noupdate=False)
|
|
repo, repo_path = self.load_and_fetch(fixture_name, *args, **kwargs)
|
|
return repo, repo_path
|
|
|
|
def test_stupid_fallback_to_stupid_fullrevs(self):
|
|
return
|
|
to_patch = {
|
|
"mercurial.patch.patchbackend": _patchbackend_raise,
|
|
"stupid.diff_branchrev": stupid.diff_branchrev,
|
|
"stupid.fetch_branchrev": stupid.fetch_branchrev,
|
|
}
|
|
|
|
expected_calls = {
|
|
"mercurial.patch.patchbackend": 1,
|
|
"stupid.diff_branchrev": 1,
|
|
"stupid.fetch_branchrev": 1,
|
|
}
|
|
|
|
self.stupid = True
|
|
repo, repo_path = self._loadupdate("single_rev.svndump")
|
|
self.stupid = False
|
|
|
|
# Passing stupid=True doesn't seem to be working - force it
|
|
repo.ui.setconfig("hgsubversion", "stupid", "true")
|
|
state = repo[None].parents()
|
|
|
|
calls, replaced = _monkey_patch(to_patch)
|
|
|
|
try:
|
|
self.add_svn_rev(repo_path, {"trunk/alpha": "Changed"})
|
|
commands.pull(self.repo.ui, repo, update=True)
|
|
self.failIfEqual(state, repo[None].parents())
|
|
self.assertTrue("tip" in repo[None].tags())
|
|
self.assertEqual(expected_calls, calls)
|
|
|
|
finally:
|
|
_monkey_unpatch(replaced)
|
|
|
|
|
|
def _monkey_patch(to_patch, start=None):
|
|
if start is None:
|
|
import sys
|
|
|
|
start = sys.modules[__name__]
|
|
|
|
calls = {}
|
|
replaced = {}
|
|
|
|
for path, replacement in to_patch.iteritems():
|
|
obj = start
|
|
owner, attr = path.rsplit(".", 1)
|
|
|
|
for a in owner.split(".", -1):
|
|
obj = getattr(obj, a)
|
|
|
|
replaced[path] = getattr(obj, attr)
|
|
calls[path] = 0
|
|
|
|
def outer(path=path, calls=calls, replacement=replacement):
|
|
def wrapper(*p, **kw):
|
|
calls[path] += 1
|
|
return replacement(*p, **kw)
|
|
|
|
return wrapper
|
|
|
|
setattr(obj, attr, outer())
|
|
|
|
return calls, replaced
|
|
|
|
|
|
def _monkey_unpatch(to_patch, start=None):
|
|
if start is None:
|
|
import sys
|
|
|
|
start = sys.modules[__name__]
|
|
|
|
replaced = {}
|
|
|
|
for path, replacement in to_patch.iteritems():
|
|
obj = start
|
|
owner, attr = path.rsplit(".", 1)
|
|
|
|
for a in owner.split(".", -1):
|
|
obj = getattr(obj, a)
|
|
|
|
replaced[path] = getattr(obj, attr)
|
|
setattr(obj, attr, replacement)
|
|
|
|
return replaced
|
|
|
|
|
|
def _patchbackend_raise(*p, **kw):
|
|
raise mercurial.patch.PatchError("patch failed")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import silenttestrunner
|
|
|
|
silenttestrunner.main(__name__)
|