~bzr-pqm/bzr/bzr.dev

2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
1
# Copyright (C) 2005 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1263 by Martin Pool
- clean up imports
17
18
import os
1685.1.67 by Martin Pool
Suppress warning from test of deprecated method
19
import warnings
1263 by Martin Pool
- clean up imports
20
1911.2.1 by John Arbash Meinel
Cache encode/decode operations, saves memory and time. Especially when committing a new kernel tree with 7.7M new lines to annotate
21
from bzrlib import (
22
    revision,
3228.4.11 by John Arbash Meinel
Deprecations abound.
23
    symbol_versioning,
1911.2.1 by John Arbash Meinel
Cache encode/decode operations, saves memory and time. Especially when committing a new kernel tree with 7.7M new lines to annotate
24
    )
1263 by Martin Pool
- clean up imports
25
from bzrlib.branch import Branch
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
26
from bzrlib.errors import NoSuchRevision
2490.2.21 by Aaron Bentley
Rename graph to deprecated_graph
27
from bzrlib.deprecated_graph import Graph
1390 by Robert Collins
pair programming worx... merge integration and weave
28
from bzrlib.revision import (find_present_ancestors, combined_graph,
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
29
                             common_ancestor,
1836.3.1 by Robert Collins
(robertc) Teach repository.get_revision_graph, and revision.common_ancestor, about NULL_REVISION.
30
                             is_ancestor, MultipleRevisionSources,
31
                             NULL_REVISION)
3228.4.1 by John Arbash Meinel
deprecate get_revision_graph_with_ghosts and its only caller, common_ancestor.
32
from bzrlib.symbol_versioning import one_zero, one_three
1911.2.1 by John Arbash Meinel
Cache encode/decode operations, saves memory and time. Especially when committing a new kernel tree with 7.7M new lines to annotate
33
from bzrlib.tests import TestCase, TestCaseWithTransport
1270 by Martin Pool
- fix recording of merged ancestry lines
34
from bzrlib.trace import mutter
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
35
from bzrlib.workingtree import WorkingTree
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
36
1685.1.67 by Martin Pool
Suppress warning from test of deprecated method
37
# We're allowed to test deprecated interfaces
38
warnings.filterwarnings('ignore',
39
        '.*get_intervening_revisions was deprecated',
40
        DeprecationWarning,
41
        r'bzrlib\.tests\.test_revision')
42
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
43
# XXX: Make this a method of a merge base case
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
44
def make_branches(self, format=None):
1392 by Robert Collins
reinstate testfetch test case
45
    """Create two branches
46
47
    branch 1 has 6 commits, branch 2 has 3 commits
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
48
    commit 10 is a ghosted merge merge from branch 1
1392 by Robert Collins
reinstate testfetch test case
49
50
    the object graph is
51
    B:     A:
52
    a..0   a..0 
53
    a..1   a..1
54
    a..2   a..2
55
    b..3   a..3 merges b..4
56
    b..4   a..4
57
    b..5   a..5 merges b..5
1092.2.26 by Robert Collins
fetch should work with ghosts
58
    b..6 merges a4
1392 by Robert Collins
reinstate testfetch test case
59
60
    so A is missing b6 at the start
61
    and B is missing a3, a4, a5
62
    """
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
63
    tree1 = self.make_branch_and_tree("branch1", format=format)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
64
    br1 = tree1.branch
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
65
    
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
66
    tree1.commit("Commit one", rev_id="a@u-0-0")
67
    tree1.commit("Commit two", rev_id="a@u-0-1")
68
    tree1.commit("Commit three", rev_id="a@u-0-2")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
69
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
70
    tree2 = tree1.bzrdir.clone("branch2").open_workingtree()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
71
    br2 = tree2.branch
72
    tree2.commit("Commit four", rev_id="b@u-0-3")
73
    tree2.commit("Commit five", rev_id="b@u-0-4")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
74
    revisions_2 = br2.revision_history()
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
75
    self.assertEquals(revisions_2[-1], 'b@u-0-4')
1263 by Martin Pool
- clean up imports
76
    
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
77
    tree1.merge_from_branch(br2)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
78
    tree1.commit("Commit six", rev_id="a@u-0-3")
79
    tree1.commit("Commit seven", rev_id="a@u-0-4")
80
    tree2.commit("Commit eight", rev_id="b@u-0-5")
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
81
    self.assertEquals(br2.revision_history()[-1], 'b@u-0-5')
1266 by Martin Pool
- fix up testrevision to fetch revisions before marking them merged
82
    
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
83
    tree1.merge_from_branch(br2)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
84
    tree1.commit("Commit nine", rev_id="a@u-0-5")
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
85
    # DO NOT MERGE HERE - we WANT a GHOST.
86
    tree2.add_parent_tree_id(br1.revision_history()[4])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
87
    tree2.commit("Commit ten - ghost merge", rev_id="b@u-0-6")
1266 by Martin Pool
- fix up testrevision to fetch revisions before marking them merged
88
    
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
89
    return br1, br2
90
91
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
92
class TestIsAncestor(TestCaseWithTransport):
93
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
94
    def test_recorded_ancestry(self):
95
        """Test that commit records all ancestors"""
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
96
        br1, br2 = make_branches(self)
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
97
        d = [('a@u-0-0', ['a@u-0-0']),
98
             ('a@u-0-1', ['a@u-0-0', 'a@u-0-1']),
99
             ('a@u-0-2', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2']),
100
             ('b@u-0-3', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3']),
1270 by Martin Pool
- fix recording of merged ancestry lines
101
             ('b@u-0-4', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3',
102
                          'b@u-0-4']),
103
             ('a@u-0-3', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
104
                          'a@u-0-3']),
1271 by Martin Pool
- more commit ancestry tests
105
             ('a@u-0-4', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
106
                          'a@u-0-3', 'a@u-0-4']),
107
             ('b@u-0-5', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
108
                          'b@u-0-5']),
109
             ('a@u-0-5', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
110
                          'b@u-0-3', 'b@u-0-4',
111
                          'b@u-0-5', 'a@u-0-5']),
1392 by Robert Collins
reinstate testfetch test case
112
             ('b@u-0-6', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2',
1271 by Martin Pool
- more commit ancestry tests
113
                          'b@u-0-3', 'b@u-0-4',
114
                          'b@u-0-5', 'b@u-0-6']),
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
115
             ]
1392 by Robert Collins
reinstate testfetch test case
116
        br1_only = ('a@u-0-3', 'a@u-0-4', 'a@u-0-5')
117
        br2_only = ('b@u-0-6',)
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
118
        for branch in br1, br2:
119
            for rev_id, anc in d:
1392 by Robert Collins
reinstate testfetch test case
120
                if rev_id in br1_only and not branch is br1:
121
                    continue
122
                if rev_id in br2_only and not branch is br2:
123
                    continue
1270 by Martin Pool
- fix recording of merged ancestry lines
124
                mutter('ancestry of {%s}: %r',
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
125
                       rev_id, branch.repository.get_ancestry(rev_id))
126
                result = sorted(branch.repository.get_ancestry(rev_id))
127
                self.assertEquals(result, [None] + sorted(anc))
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
128
    
129
    
1272 by Martin Pool
- enable and disable more ancestry tests
130
    def test_is_ancestor(self):
1102 by Martin Pool
- merge test refactoring from robertc
131
        """Test checking whether a revision is an ancestor of another revision"""
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
132
        br1, br2 = make_branches(self)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
133
        revisions = br1.revision_history()
134
        revisions_2 = br2.revision_history()
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
135
        sources = br1
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
136
3052.1.5 by John Arbash Meinel
Fix up the is_ancestor checks in test_revision.py
137
        br1.lock_read()
3053.3.2 by Martin Pool
(merge) Support pulling from knits to packs
138
        br2.lock_read()
3052.1.5 by John Arbash Meinel
Fix up the is_ancestor checks in test_revision.py
139
        self.addCleanup(br1.unlock)
140
        br2.lock_read()
141
        self.addCleanup(br2.unlock)
142
3123.1.1 by John Arbash Meinel
Update from deprecating 0.93 to 1.0, and add a 1.1 deprecation.
143
        self.assertTrue(self.applyDeprecated(one_zero,
3052.1.5 by John Arbash Meinel
Fix up the is_ancestor checks in test_revision.py
144
                        is_ancestor, revisions[0], revisions[0], br1))
3123.1.1 by John Arbash Meinel
Update from deprecating 0.93 to 1.0, and add a 1.1 deprecation.
145
        self.assertTrue(self.applyDeprecated(one_zero,
3052.1.5 by John Arbash Meinel
Fix up the is_ancestor checks in test_revision.py
146
                        is_ancestor, revisions[1], revisions[0], sources))
3123.1.1 by John Arbash Meinel
Update from deprecating 0.93 to 1.0, and add a 1.1 deprecation.
147
        self.assertFalse(self.applyDeprecated(one_zero,
3052.1.5 by John Arbash Meinel
Fix up the is_ancestor checks in test_revision.py
148
                         is_ancestor, revisions[0], revisions[1], sources))
3123.1.1 by John Arbash Meinel
Update from deprecating 0.93 to 1.0, and add a 1.1 deprecation.
149
        self.assertTrue(self.applyDeprecated(one_zero,
3052.1.5 by John Arbash Meinel
Fix up the is_ancestor checks in test_revision.py
150
                        is_ancestor, revisions_2[3], revisions[0], sources))
1390 by Robert Collins
pair programming worx... merge integration and weave
151
        # disabled mbp 20050914, doesn't seem to happen anymore
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
152
        ## self.assertRaises(NoSuchRevision, is_ancestor, revisions_2[3],
3123.1.1 by John Arbash Meinel
Update from deprecating 0.93 to 1.0, and add a 1.1 deprecation.
153
        ##                  revisions[0], br1)
154
        self.assertTrue(self.applyDeprecated(one_zero,
3052.1.5 by John Arbash Meinel
Fix up the is_ancestor checks in test_revision.py
155
                        is_ancestor, revisions[3], revisions_2[4], sources))
3123.1.1 by John Arbash Meinel
Update from deprecating 0.93 to 1.0, and add a 1.1 deprecation.
156
        self.assertTrue(self.applyDeprecated(one_zero,
3052.1.5 by John Arbash Meinel
Fix up the is_ancestor checks in test_revision.py
157
                        is_ancestor, revisions[3], revisions_2[4], br1))
3123.1.1 by John Arbash Meinel
Update from deprecating 0.93 to 1.0, and add a 1.1 deprecation.
158
        self.assertTrue(self.applyDeprecated(one_zero,
3052.1.5 by John Arbash Meinel
Fix up the is_ancestor checks in test_revision.py
159
                        is_ancestor, revisions[3], revisions_2[3], sources))
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
160
        ## self.assert_(not is_ancestor(revisions[3], revisions_2[3], br1))
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
161
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
162
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
163
class TestIntermediateRevisions(TestCaseWithTransport):
1092.3.2 by Robert Collins
merge from baz2bzr
164
165
    def setUp(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
166
        TestCaseWithTransport.setUp(self)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
167
        self.br1, self.br2 = make_branches(self)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
168
        wt1 = self.br1.bzrdir.open_workingtree()
169
        wt2 = self.br2.bzrdir.open_workingtree()
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
170
        wt2.commit("Commit eleven", rev_id="b@u-0-7")
171
        wt2.commit("Commit twelve", rev_id="b@u-0-8")
172
        wt2.commit("Commit thirtteen", rev_id="b@u-0-9")
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
173
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
174
        wt1.merge_from_branch(self.br2)
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
175
        wt1.commit("Commit fourtten", rev_id="a@u-0-6")
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
176
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
177
        wt2.merge_from_branch(self.br1)
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
178
        wt2.commit("Commit fifteen", rev_id="b@u-0-10")
1092.3.2 by Robert Collins
merge from baz2bzr
179
180
        from bzrlib.revision import MultipleRevisionSources
3228.4.11 by John Arbash Meinel
Deprecations abound.
181
        self.sources = self.applyDeprecated(one_three,
182
                        MultipleRevisionSources, self.br1.repository,
183
                                                 self.br2.repository)
1092.3.2 by Robert Collins
merge from baz2bzr
184
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
185
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
186
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
187
class MockRevisionSource(object):
188
    """A RevisionSource that takes a pregenerated graph.
189
190
    This is useful for testing revision graph algorithms where
191
    the actual branch existing is irrelevant.
192
    """
193
194
    def __init__(self, full_graph):
195
        self._full_graph = full_graph
196
197
    def get_revision_graph_with_ghosts(self, revision_ids):
198
        # This is mocked out to just return a constant graph.
199
        return self._full_graph
200
201
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
202
class TestCommonAncestor(TestCaseWithTransport):
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
203
    """Test checking whether a revision is an ancestor of another revision"""
1092.1.39 by Robert Collins
merge from mpool
204
3228.4.1 by John Arbash Meinel
deprecate get_revision_graph_with_ghosts and its only caller, common_ancestor.
205
    def assertCommonAncestorEqual(self, expected, sources, rev_a, rev_b):
206
        self.assertEqual(expected,
207
                         self.applyDeprecated(one_three, 
208
                         common_ancestor, rev_a, rev_b, sources))
209
210
    def assertCommonAncestorIn(self, possible, sources, rev_a, rev_b):
211
        """assert that we pick one among multiple possible common ancestors"""
212
        self.assertTrue(self.applyDeprecated(one_three, 
213
                            common_ancestor, rev_a, rev_b, sources)
214
                        in possible)
215
1092.1.39 by Robert Collins
merge from mpool
216
    def test_common_ancestor(self):
974.1.65 by Aaron Bentley
Cleanup and test-fixing
217
        """Pick a reasonable merge base"""
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
218
        br1, br2 = make_branches(self)
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
219
        revisions = br1.revision_history()
220
        revisions_2 = br2.revision_history()
3228.4.11 by John Arbash Meinel
Deprecations abound.
221
        sources = self.applyDeprecated(one_three, 
222
                    MultipleRevisionSources, br1.repository, br2.repository)
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
223
        expected_ancestors_list = {revisions[3]:(0, 0), 
224
                                   revisions[2]:(1, 1),
225
                                   revisions_2[4]:(2, 1), 
226
                                   revisions[1]:(3, 2),
227
                                   revisions_2[3]:(4, 2),
228
                                   revisions[0]:(5, 3) }
229
        ancestors_list = find_present_ancestors(revisions[3], sources)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
230
        self.assertEquals(len(expected_ancestors_list), len(ancestors_list))
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
231
        for key, value in expected_ancestors_list.iteritems():
232
            self.assertEqual(ancestors_list[key], value, 
233
                              "key %r, %r != %r" % (key, ancestors_list[key],
234
                                                    value))
3228.4.1 by John Arbash Meinel
deprecate get_revision_graph_with_ghosts and its only caller, common_ancestor.
235
        self.assertCommonAncestorEqual(revisions[0], sources,
236
                                       revisions[0], revisions[0])
237
        self.assertCommonAncestorEqual(revisions[1], sources,
238
                                       revisions[1], revisions[2])
239
        self.assertCommonAncestorEqual(revisions[1], sources,
240
                                       revisions[1], revisions[1])
241
        self.assertCommonAncestorEqual(revisions[2], sources,
242
                                       revisions[2], revisions_2[4])
243
        self.assertCommonAncestorEqual(revisions_2[4], sources,
244
                                       revisions[3], revisions_2[4])
245
        self.assertCommonAncestorEqual(revisions_2[4], sources,
246
                                       revisions[4], revisions_2[5])
247
        self.assertCommonAncestorIn((revisions[4], revisions_2[5]), sources,
248
                                     revisions[5], revisions_2[6])
249
        self.assertCommonAncestorIn((revisions[4], revisions_2[5]), sources,
250
                                     revisions_2[6], revisions[5])
251
        self.assertCommonAncestorEqual(None, sources,
252
                                       None, revisions[5])
253
        self.assertCommonAncestorEqual(NULL_REVISION, sources,
254
                                       NULL_REVISION, NULL_REVISION)
255
        self.assertCommonAncestorEqual(NULL_REVISION, sources,
256
                                       revisions[0], NULL_REVISION)
257
        self.assertCommonAncestorEqual(NULL_REVISION, sources,
258
                                       NULL_REVISION, revisions[0])
974.1.65 by Aaron Bentley
Cleanup and test-fixing
259
1185.8.1 by Aaron Bentley
Ensured combined_graph is order-insensitive
260
    def test_combined(self):
261
        """combined_graph
262
        Ensure it's not order-sensitive
263
        """
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
264
        br1, br2 = make_branches(self)
3228.4.11 by John Arbash Meinel
Deprecations abound.
265
        source = self.applyDeprecated(one_three,
266
                    MultipleRevisionSources, br1.repository, br2.repository)
267
        combined_1 = self.applyDeprecated(one_three,
268
                        combined_graph, br1.last_revision(),
269
                                        br2.last_revision(), source)
270
        combined_2 = self.applyDeprecated(one_three,
271
                        combined_graph, br2.last_revision(),
272
                                        br1.last_revision(), source)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
273
        self.assertEquals(combined_1[1], combined_2[1])
274
        self.assertEquals(combined_1[2], combined_2[2])
275
        self.assertEquals(combined_1[3], combined_2[3])
276
        self.assertEquals(combined_1, combined_2)
1534.4.49 by Robert Collins
Provide a revision.get_history(repository) method for generating a synthetic revision history.
277
278
    def test_get_history(self):
279
        # TODO: test ghosts on the left hand branch's impact
280
        # TODO: test ghosts on all parents, we should get some
281
        # indicator. i.e. NULL_REVISION
282
        # RBC 20060608
283
        tree = self.make_branch_and_tree('.')
284
        tree.commit('1', rev_id = '1', allow_pointless=True)
285
        tree.commit('2', rev_id = '2', allow_pointless=True)
286
        tree.commit('3', rev_id = '3', allow_pointless=True)
287
        rev = tree.branch.repository.get_revision('1')
288
        history = rev.get_history(tree.branch.repository)
289
        self.assertEqual([None, '1'], history)
290
        rev = tree.branch.repository.get_revision('2')
291
        history = rev.get_history(tree.branch.repository)
292
        self.assertEqual([None, '1', '2'], history)
293
        rev = tree.branch.repository.get_revision('3')
294
        history = rev.get_history(tree.branch.repository)
295
        self.assertEqual([None, '1', '2' ,'3'], history)
1594.2.3 by Robert Collins
bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.
296
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
297
    def test_common_ancestor_rootless_graph(self):
298
        # common_ancestor on a graph with no reachable roots - only
299
        # ghosts - should still return a useful value.
300
        graph = Graph()
301
        # add a ghost node which would be a root if it wasn't a ghost.
302
        graph.add_ghost('a_ghost')
303
        # add a normal commit on top of that
304
        graph.add_node('rev1', ['a_ghost'])
305
        # add a left-branch revision
306
        graph.add_node('left', ['rev1'])
307
        # add a right-branch revision
308
        graph.add_node('right', ['rev1'])
309
        source = MockRevisionSource(graph)
3228.4.1 by John Arbash Meinel
deprecate get_revision_graph_with_ghosts and its only caller, common_ancestor.
310
        self.assertCommonAncestorEqual('rev1', source, 'left', 'right')
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
311
1594.2.3 by Robert Collins
bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.
312
313
class TestMultipleRevisionSources(TestCaseWithTransport):
314
    """Tests for the MultipleRevisionSources adapter."""
315
316
    def test_get_revision_graph_merges_ghosts(self):
317
        # when we ask for the revision graph for B, which
318
        # is in repo 1 with a ghost of A, and which is not
319
        # in repo 2, which has A, the revision_graph()
320
        # should return A and B both.
321
        tree_1 = self.make_branch_and_tree('1')
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
322
        tree_1.set_parent_ids(['A'], allow_leftmost_as_ghost=True)
1594.2.3 by Robert Collins
bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.
323
        tree_1.commit('foo', rev_id='B', allow_pointless=True)
324
        tree_2 = self.make_branch_and_tree('2')
325
        tree_2.commit('bar', rev_id='A', allow_pointless=True)
3228.4.11 by John Arbash Meinel
Deprecations abound.
326
        source = self.applyDeprecated(one_three,
327
                    MultipleRevisionSources, tree_1.branch.repository,
328
                                             tree_2.branch.repository)
329
        # get_revision_graph calls the deprecated
330
        # get_revision_graph_with_ghosts once for each repository.
331
        expected_warning = symbol_versioning.deprecation_string(
332
            tree_1.branch.repository.get_revision_graph_with_ghosts,
333
            one_three)
334
        rev_graph = self.callDeprecated([expected_warning, expected_warning],
335
                        source.get_revision_graph, 'B')
1594.2.3 by Robert Collins
bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.
336
        self.assertEqual({'B':['A'],
3228.4.11 by John Arbash Meinel
Deprecations abound.
337
                          'A':[]}, rev_graph)
2229.2.3 by Aaron Bentley
change reserved_id to is_reserved_id, add check_not_reserved for DRY
338
339
340
class TestReservedId(TestCase):
341
342
    def test_is_reserved_id(self):
343
        self.assertEqual(True, revision.is_reserved_id(NULL_REVISION))
344
        self.assertEqual(True, revision.is_reserved_id(
345
            revision.CURRENT_REVISION))
346
        self.assertEqual(True, revision.is_reserved_id('arch:'))
347
        self.assertEqual(False, revision.is_reserved_id('null'))
348
        self.assertEqual(False, revision.is_reserved_id(
349
            'arch:a@example.com/c--b--v--r'))
350
        self.assertEqual(False, revision.is_reserved_id(None))
2671.5.1 by Lukáš Lalinsky
Strip leading whitespace from the commit message before using the first line as a commit summary.
351
352
353
class TestRevisionMethods(TestCase):
354
355
    def test_get_summary(self):
356
        r = revision.Revision('1')
357
        r.message = 'a'
358
        self.assertEqual('a', r.get_summary())
359
        r.message = 'a\nb'
360
        self.assertEqual('a', r.get_summary())
361
        r.message = '\na\nb'
362
        self.assertEqual('a', r.get_summary())
2671.5.2 by Lukáš Lalinsky
Add Revision.get_author to return the author's name, either from the property 'author' or the name of the committer.
363
2671.5.7 by Lukáš Lalinsky
Rename get_author to get_apparent_author, revert the long log back to displaying the committer.
364
    def test_get_apparent_author(self):
2671.5.2 by Lukáš Lalinsky
Add Revision.get_author to return the author's name, either from the property 'author' or the name of the committer.
365
        r = revision.Revision('1')
366
        r.committer = 'A'
2671.5.7 by Lukáš Lalinsky
Rename get_author to get_apparent_author, revert the long log back to displaying the committer.
367
        self.assertEqual('A', r.get_apparent_author())
2671.5.2 by Lukáš Lalinsky
Add Revision.get_author to return the author's name, either from the property 'author' or the name of the committer.
368
        r.properties['author'] = 'B'
2671.5.7 by Lukáš Lalinsky
Rename get_author to get_apparent_author, revert the long log back to displaying the committer.
369
        self.assertEqual('B', r.get_apparent_author())