1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
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,
}
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")
|