~bzr-pqm/bzr/bzr.dev

5557.1.15 by John Arbash Meinel
Merge bzr.dev 5597 to resolve NEWS, aka bzr-2.3.txt
1
# Copyright (C) 2005-2009, 2011 Canonical Ltd
1685.1.80 by Wouter van Heyst
more code cleanup
2
#
1185.54.23 by Aaron Bentley
Added unit tests for find_unmerged
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1685.1.80 by Wouter van Heyst
more code cleanup
7
#
1185.54.23 by Aaron Bentley
Added unit tests for find_unmerged
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1685.1.80 by Wouter van Heyst
more code cleanup
12
#
1185.54.23 by Aaron Bentley
Added unit tests for find_unmerged
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
16
3427.3.1 by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions
17
from bzrlib import (
18
    missing,
19
    tests,
20
    )
2490.1.2 by John Arbash Meinel
Cleanup according to PEP8 and some other small whitespace fixes
21
from bzrlib.missing import (
2466.8.1 by Kent Gibson
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters.
22
    iter_log_revisions,
23
    )
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
24
from bzrlib.tests import TestCaseWithTransport
25
1534.4.28 by Robert Collins
first cut at merge from integration.
26
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
27
class TestMissing(TestCaseWithTransport):
28
3677.1.8 by Vincent Ladeuil
Fixed as per jam's review.
29
    def assertUnmerged(self, expected, source, target, restrict='all',
30
                       backward=False):
31
        unmerged = missing.find_unmerged(source, target, restrict=restrict,
32
                                         backward=backward)
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
33
        self.assertEqual(expected, unmerged)
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
34
1185.54.23 by Aaron Bentley
Added unit tests for find_unmerged
35
    def test_find_unmerged(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
36
        original_tree = self.make_branch_and_tree('original')
37
        original = original_tree.branch
38
        puller_tree = self.make_branch_and_tree('puller')
39
        puller = puller_tree.branch
40
        merger_tree = self.make_branch_and_tree('merger')
41
        merger = merger_tree.branch
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
42
        self.assertUnmerged(([], []), original, puller)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
43
        original_tree.commit('a', rev_id='a')
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
44
        self.assertUnmerged(([('1', 'a')], []), original, puller)
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
45
        puller_tree.pull(original)
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
46
        self.assertUnmerged(([], []), original, puller)
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
47
        merger_tree.pull(original)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
48
        original_tree.commit('b', rev_id='b')
49
        original_tree.commit('c', rev_id='c')
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
50
        self.assertUnmerged(([('2', 'b'), ('3', 'c')], []),
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
51
                            original, puller)
3677.1.8 by Vincent Ladeuil
Fixed as per jam's review.
52
        self.assertUnmerged(([('3', 'c'), ('2', 'b')], []),
53
                            original, puller, backward=True)
1185.54.23 by Aaron Bentley
Added unit tests for find_unmerged
54
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
55
        puller_tree.pull(original)
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
56
        self.assertUnmerged(([], []), original, puller)
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
57
        self.assertUnmerged(([('2', 'b'), ('3', 'c')], []),
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
58
                            original, merger)
1551.15.70 by Aaron Bentley
Avoid using builtins.merge
59
        merger_tree.merge_from_branch(original)
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
60
        self.assertUnmerged(([('2', 'b'), ('3', 'c')], []),
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
61
                            original, merger)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
62
        merger_tree.commit('d', rev_id='d')
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
63
        self.assertUnmerged(([], [('2', 'd')]), original, merger)
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
64
2466.8.1 by Kent Gibson
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters.
65
    def test_iter_log_revisions(self):
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
66
        base_tree = self.make_branch_and_tree('base')
67
        self.build_tree(['base/a'])
68
        base_tree.add(['a'], ['a-id'])
69
        base_tree.commit('add a', rev_id='b-1')
70
71
        child_tree = base_tree.bzrdir.sprout('child').open_workingtree()
72
73
        self.build_tree(['child/b'])
74
        child_tree.add(['b'], ['b-id'])
75
        child_tree.commit('adding b', rev_id='c-2')
76
77
        child_tree.remove(['a'])
78
        child_tree.commit('removing a', rev_id='c-3')
79
80
        self.build_tree_contents([('child/b', 'new contents for b\n')])
81
        child_tree.commit('modifying b', rev_id='c-4')
82
83
        child_tree.rename_one('b', 'c')
84
        child_tree.commit('rename b=>c', rev_id='c-5')
85
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
86
        base_extra, child_extra = missing.find_unmerged(base_tree.branch,
3677.1.4 by Vincent Ladeuil
Replace 'reverse' by 'backward' when talking about revision order.
87
                                                        child_tree.branch)
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
88
        results = list(iter_log_revisions(base_extra,
2466.8.1 by Kent Gibson
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters.
89
                            base_tree.branch.repository,
90
                            verbose=True))
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
91
        self.assertEqual([], results)
92
2466.8.1 by Kent Gibson
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters.
93
        results = list(iter_log_revisions(child_extra,
94
                            child_tree.branch.repository,
95
                            verbose=True))
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
96
        self.assertEqual(4, len(results))
97
98
        r0,r1,r2,r3 = results
99
3677.1.2 by Vincent Ladeuil
Fix tests broken by previous commit.
100
        self.assertEqual([('2', 'c-2'), ('3', 'c-3'),
101
                          ('4', 'c-4'), ('5', 'c-5'),],
102
                         [(r.revno, r.rev.revision_id) for r in results])
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
103
2466.8.1 by Kent Gibson
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters.
104
        delta0 = r0.delta
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
105
        self.assertNotEqual(None, delta0)
106
        self.assertEqual([('b', 'b-id', 'file')], delta0.added)
107
        self.assertEqual([], delta0.removed)
108
        self.assertEqual([], delta0.renamed)
109
        self.assertEqual([], delta0.modified)
110
2466.8.1 by Kent Gibson
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters.
111
        delta1 = r1.delta
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
112
        self.assertNotEqual(None, delta1)
113
        self.assertEqual([], delta1.added)
114
        self.assertEqual([('a', 'a-id', 'file')], delta1.removed)
115
        self.assertEqual([], delta1.renamed)
116
        self.assertEqual([], delta1.modified)
117
2466.8.1 by Kent Gibson
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters.
118
        delta2 = r2.delta
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
119
        self.assertNotEqual(None, delta2)
120
        self.assertEqual([], delta2.added)
121
        self.assertEqual([], delta2.removed)
122
        self.assertEqual([], delta2.renamed)
123
        self.assertEqual([('b', 'b-id', 'file', True, False)], delta2.modified)
124
2466.8.1 by Kent Gibson
Reworked LogFormatter API to simplify extending the attributes of the revision being logged. Added support for begin_log() and end_log() hooks in LogFormatters.
125
        delta3 = r3.delta
2204.1.1 by John Arbash Meinel
'bzr missing -v' was showing adds as deletes.
126
        self.assertNotEqual(None, delta3)
127
        self.assertEqual([], delta3.added)
128
        self.assertEqual([], delta3.removed)
129
        self.assertEqual([('b', 'c', 'b-id', 'file', False, False)],
130
                         delta3.renamed)
131
        self.assertEqual([], delta3.modified)
3427.3.1 by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions
132
133
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
134
class TestFindUnmerged(tests.TestCaseWithTransport):
3427.3.1 by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions
135
136
    def assertUnmerged(self, local, remote, local_branch, remote_branch,
3921.3.7 by Marius Kruger
just filter the missing revisions once all have been calculated.
137
            restrict='all', include_merges=False, backward=False,
138
            local_revid_range=None, remote_revid_range=None):
3427.3.1 by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions
139
        """Check the output of find_unmerged_mainline_revisions"""
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
140
        local_extra, remote_extra = missing.find_unmerged(
3921.3.7 by Marius Kruger
just filter the missing revisions once all have been calculated.
141
            local_branch, remote_branch, restrict,
142
            include_merges=include_merges, backward=backward,
143
            local_revid_range=local_revid_range,
144
            remote_revid_range=remote_revid_range)
3427.3.1 by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions
145
        self.assertEqual(local, local_extra)
146
        self.assertEqual(remote, remote_extra)
147
148
    def test_same_branch(self):
149
        tree = self.make_branch_and_tree('tree')
150
        rev1 = tree.commit('one')
151
        tree.lock_read()
152
        self.addCleanup(tree.unlock)
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
153
        self.assertUnmerged([], [], tree.branch, tree.branch)
3921.3.2 by Marius Kruger
* rename _get_revid_in_bounds() -> _get_revid_in_range()
154
        self.assertUnmerged([], [], tree.branch, tree.branch,
3921.3.8 by Marius Kruger
* _filter_revs can now handle None and len=3 revs
155
            local_revid_range=(rev1, rev1))
3427.3.1 by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions
156
157
    def test_one_ahead(self):
158
        tree = self.make_branch_and_tree('tree')
159
        rev1 = tree.commit('one')
160
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
161
        rev2 = tree2.commit('two')
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
162
        self.assertUnmerged([], [('2', rev2)], tree.branch, tree2.branch)
163
        self.assertUnmerged([('2', rev2)], [], tree2.branch, tree.branch)
3427.3.1 by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions
164
165
    def test_restrict(self):
166
        tree = self.make_branch_and_tree('tree')
167
        rev1 = tree.commit('one')
168
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
169
        rev2 = tree2.commit('two')
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
170
        self.assertUnmerged([], [('2', rev2)], tree.branch, tree2.branch)
3427.3.1 by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions
171
        self.assertUnmerged([], None, tree.branch, tree2.branch, 'local')
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
172
        self.assertUnmerged(None, [('2', rev2)], tree.branch, tree2.branch,
3427.3.1 by John Arbash Meinel
Add bzrlib.missing.find_unmerged_mainline_revisions
173
                                               'remote')
174
3427.3.2 by John Arbash Meinel
switch find_unmerged to use the new function
175
    def test_merged(self):
176
        tree = self.make_branch_and_tree('tree')
177
        rev1 = tree.commit('one')
178
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
179
        rev2 = tree2.commit('two')
180
        rev3 = tree2.commit('three')
181
        tree.merge_from_branch(tree2.branch)
182
        rev4 = tree.commit('four')
183
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
184
        self.assertUnmerged([('2', rev4)], [], tree.branch, tree2.branch)
3921.3.2 by Marius Kruger
* rename _get_revid_in_bounds() -> _get_revid_in_range()
185
        self.assertUnmerged([('2', rev4)], [], tree.branch, tree2.branch,
3921.3.8 by Marius Kruger
* _filter_revs can now handle None and len=3 revs
186
            local_revid_range=(rev4, rev4))
3921.3.2 by Marius Kruger
* rename _get_revid_in_bounds() -> _get_revid_in_range()
187
        self.assertUnmerged([], [], tree.branch, tree2.branch,
3921.3.8 by Marius Kruger
* _filter_revs can now handle None and len=3 revs
188
            local_revid_range=(rev1, rev1))
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
189
190
    def test_include_merges(self):
191
        tree = self.make_branch_and_tree('tree')
192
        rev1 = tree.commit('one', rev_id='rev1')
193
194
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
195
        rev2 = tree2.commit('two', rev_id='rev2')
196
        rev3 = tree2.commit('three', rev_id='rev3')
197
198
        tree3 = tree2.bzrdir.sprout('tree3').open_workingtree()
199
        rev4 = tree3.commit('four', rev_id='rev4')
200
        rev5 = tree3.commit('five', rev_id='rev5')
201
202
        tree2.merge_from_branch(tree3.branch)
203
        rev6 = tree2.commit('six', rev_id='rev6')
204
3921.3.14 by Marius Kruger
put spaces after commas
205
        self.assertUnmerged([], [('2', 'rev2', 0), ('3', 'rev3', 0),
3677.1.5 by Vincent Ladeuil
Indent merge revisions correctly.
206
                                 ('4', 'rev6', 0),
207
                                 ('3.1.1', 'rev4', 1), ('3.1.2', 'rev5', 1),
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
208
                                 ],
3921.3.14 by Marius Kruger
put spaces after commas
209
                            tree.branch, tree2.branch,
3677.1.1 by Vincent Ladeuil
Begin fixing bug #233817.
210
                            include_merges=True)
211
3677.1.8 by Vincent Ladeuil
Fixed as per jam's review.
212
        self.assertUnmerged([], [('4', 'rev6', 0),
213
                                 ('3.1.2', 'rev5', 1), ('3.1.1', 'rev4', 1),
3921.3.14 by Marius Kruger
put spaces after commas
214
                                 ('3', 'rev3', 0), ('2', 'rev2', 0),
3677.1.8 by Vincent Ladeuil
Fixed as per jam's review.
215
                                 ],
3921.3.14 by Marius Kruger
put spaces after commas
216
                            tree.branch, tree2.branch,
3677.1.8 by Vincent Ladeuil
Fixed as per jam's review.
217
                            include_merges=True,
218
                            backward=True)
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
219
3921.3.8 by Marius Kruger
* _filter_revs can now handle None and len=3 revs
220
        self.assertUnmerged([], [('4', 'rev6', 0)],
3921.3.14 by Marius Kruger
put spaces after commas
221
            tree.branch, tree2.branch,
3921.3.8 by Marius Kruger
* _filter_revs can now handle None and len=3 revs
222
            include_merges=True, remote_revid_range=(rev6, rev6))
223
3921.3.14 by Marius Kruger
put spaces after commas
224
        self.assertUnmerged([], [('3', 'rev3', 0), ('3.1.1', 'rev4', 1)],
225
                    tree.branch, tree2.branch,
3921.3.8 by Marius Kruger
* _filter_revs can now handle None and len=3 revs
226
                    include_merges=True, remote_revid_range=(rev3, rev4))
227
3921.3.14 by Marius Kruger
put spaces after commas
228
        self.assertUnmerged([], [('4', 'rev6', 0), ('3.1.2', 'rev5', 1)],
229
                    tree.branch, tree2.branch,
3921.3.8 by Marius Kruger
* _filter_revs can now handle None and len=3 revs
230
                    include_merges=True, remote_revid_range=(rev5, rev6))
3921.3.2 by Marius Kruger
* rename _get_revid_in_bounds() -> _get_revid_in_range()
231
232
    def test_revision_range(self):
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
233
        local = self.make_branch_and_tree('local')
234
        lrevid1 = local.commit('one')
235
        remote = local.bzrdir.sprout('remote').open_workingtree()
236
        rrevid2 = remote.commit('two')
237
        rrevid3 = remote.commit('three')
238
        rrevid4 = remote.commit('four')
239
        lrevid2 = local.commit('two')
240
        lrevid3 = local.commit('three')
241
        lrevid4 = local.commit('four')
242
        local_extra = [('2', lrevid2), ('3', lrevid3), ('4', lrevid4)]
243
        remote_extra = [('2', rrevid2), ('3', rrevid3), ('4', rrevid4)]
244
3921.3.2 by Marius Kruger
* rename _get_revid_in_bounds() -> _get_revid_in_range()
245
        # control
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
246
        self.assertUnmerged(local_extra, remote_extra,
247
            local.branch, remote.branch)
248
        self.assertUnmerged(local_extra, remote_extra,
3921.3.7 by Marius Kruger
just filter the missing revisions once all have been calculated.
249
            local.branch, remote.branch, local_revid_range=(None, None),
250
            remote_revid_range=(None, None))
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
251
3921.3.2 by Marius Kruger
* rename _get_revid_in_bounds() -> _get_revid_in_range()
252
        # exclude local revisions
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
253
        self.assertUnmerged([('2', lrevid2)], remote_extra,
3921.3.7 by Marius Kruger
just filter the missing revisions once all have been calculated.
254
            local.branch, remote.branch, local_revid_range=(lrevid2, lrevid2))
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
255
        self.assertUnmerged([('2', lrevid2), ('3', lrevid3)], remote_extra,
3921.3.7 by Marius Kruger
just filter the missing revisions once all have been calculated.
256
            local.branch, remote.branch, local_revid_range=(lrevid2, lrevid3))
3921.3.2 by Marius Kruger
* rename _get_revid_in_bounds() -> _get_revid_in_range()
257
        self.assertUnmerged([('2', lrevid2), ('3', lrevid3)], None,
258
            local.branch, remote.branch, 'local',
3921.3.7 by Marius Kruger
just filter the missing revisions once all have been calculated.
259
            local_revid_range=(lrevid2, lrevid3))
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
260
3921.3.2 by Marius Kruger
* rename _get_revid_in_bounds() -> _get_revid_in_range()
261
        # exclude remote revisions
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
262
        self.assertUnmerged(local_extra, [('2', rrevid2)],
3921.3.7 by Marius Kruger
just filter the missing revisions once all have been calculated.
263
            local.branch, remote.branch, remote_revid_range=(None, rrevid2))
264
        self.assertUnmerged(local_extra, [('2', rrevid2)],
265
            local.branch, remote.branch, remote_revid_range=(lrevid1, rrevid2))
266
        self.assertUnmerged(local_extra, [('2', rrevid2)],
267
            local.branch, remote.branch, remote_revid_range=(rrevid2, rrevid2))
3921.3.1 by Marius Kruger
* add support for specifying a revision range to missing.find_unmerged
268
        self.assertUnmerged(local_extra, [('2', rrevid2), ('3', rrevid3)],
3921.3.9 by Marius Kruger
* add some blackbox tests and another whitebox test
269
            local.branch, remote.branch, remote_revid_range=(None, rrevid3))
270
        self.assertUnmerged(local_extra, [('2', rrevid2), ('3', rrevid3)],
3921.3.7 by Marius Kruger
just filter the missing revisions once all have been calculated.
271
            local.branch, remote.branch, remote_revid_range=(rrevid2, rrevid3))
272
        self.assertUnmerged(local_extra, [('3', rrevid3)],
273
            local.branch, remote.branch, remote_revid_range=(rrevid3, rrevid3))
3921.3.2 by Marius Kruger
* rename _get_revid_in_bounds() -> _get_revid_in_range()
274
        self.assertUnmerged(None, [('2', rrevid2), ('3', rrevid3)],
275
            local.branch, remote.branch, 'remote',
3921.3.7 by Marius Kruger
just filter the missing revisions once all have been calculated.
276
            remote_revid_range=(rrevid2, rrevid3))
277
278
        # exclude local and remote revisions
279
        self.assertUnmerged([('3', lrevid3)], [('3', rrevid3)],
280
            local.branch, remote.branch, local_revid_range=(lrevid3, lrevid3),
281
            remote_revid_range=(rrevid3, rrevid3))