Mercurial > hgsubversion
view tests/test_pull_fallback.py @ 933:a9f315eae67c
push: use native rebase instead of our rebase wrapper
Our rebase wrapper doesn't quite do the right thing with repect to a
just-pushed revision. In particular, it will try to rebase the
just-pushed revision on top of the version of that revision we just
pulled down from svn. This will sometimes result in a local revision
with an identical commit message as the revision from svn, but no file
changes.
This changes the rebase portion of the push command to instead use the
native rebase with a revset that excludes the revision we just pushed
to svn from the set to be rebased. It also moves to a single strip
operation that removes all of the revisions based on a pre-push or
partially pushed revision. This moves to a separate rebase and strip
operation since we now need to strip revisions we are not rebasing.
author | David Schleimer <dschleimer@fb.com> |
---|---|
date | Mon, 24 Sep 2012 10:18:28 -0700 |
parents | dfb3afa6c619 |
children | d741f536f23a |
line wrap: on
line source
import test_util import re import mercurial from mercurial import commands from hgsubversion import stupid from hgsubversion import svnwrap from hgsubversion import wrappers class TestPullFallback(test_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, } repo, repo_path = self._loadupdate( 'single_rev.svndump', stupid=True) # Passing stupid=True doesn't seem to be working - force it repo.ui.setconfig('hgsubversion', 'stupid', "true") state = repo.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.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") def suite(): import unittest, sys return unittest.findTestCases(sys.modules[__name__])