/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_revision.py

  • Committer: John Arbash Meinel
  • Date: 2009-06-18 18:18:36 UTC
  • mto: This revision was merged to the branch mainline in revision 4461.
  • Revision ID: john@arbash-meinel.com-20090618181836-biodfkat9a8eyzjz
The new add_inventory_by_delta is returning a CHKInventory when mapping from NULL
Which is completely valid, but 'broke' one of the tests.
So to fix it, changed the test to use CHKInventories on both sides, and add an __eq__
member. The nice thing is that CHKInventory.__eq__ is fairly cheap, since it only
has to check the root keys.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005 Canonical Ltd
 
2
#
 
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.
 
7
#
 
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.
 
12
#
 
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
 
 
18
import os
 
19
import warnings
 
20
 
 
21
from bzrlib import (
 
22
    bugtracker,
 
23
    revision,
 
24
    symbol_versioning,
 
25
    )
 
26
from bzrlib.branch import Branch
 
27
from bzrlib.errors import (
 
28
    InvalidBugStatus,
 
29
    InvalidLineInBugsProperty,
 
30
    NoSuchRevision,
 
31
    )
 
32
from bzrlib.deprecated_graph import Graph
 
33
from bzrlib.revision import (find_present_ancestors,
 
34
                             NULL_REVISION)
 
35
from bzrlib.tests import TestCase, TestCaseWithTransport
 
36
from bzrlib.trace import mutter
 
37
from bzrlib.workingtree import WorkingTree
 
38
 
 
39
# We're allowed to test deprecated interfaces
 
40
warnings.filterwarnings('ignore',
 
41
        '.*get_intervening_revisions was deprecated',
 
42
        DeprecationWarning,
 
43
        r'bzrlib\.tests\.test_revision')
 
44
 
 
45
# XXX: Make this a method of a merge base case
 
46
def make_branches(self, format=None):
 
47
    """Create two branches
 
48
 
 
49
    branch 1 has 6 commits, branch 2 has 3 commits
 
50
    commit 10 is a ghosted merge merge from branch 1
 
51
 
 
52
    the object graph is
 
53
    B:     A:
 
54
    a..0   a..0
 
55
    a..1   a..1
 
56
    a..2   a..2
 
57
    b..3   a..3 merges b..4
 
58
    b..4   a..4
 
59
    b..5   a..5 merges b..5
 
60
    b..6 merges a4
 
61
 
 
62
    so A is missing b6 at the start
 
63
    and B is missing a3, a4, a5
 
64
    """
 
65
    tree1 = self.make_branch_and_tree("branch1", format=format)
 
66
    br1 = tree1.branch
 
67
 
 
68
    tree1.commit("Commit one", rev_id="a@u-0-0")
 
69
    tree1.commit("Commit two", rev_id="a@u-0-1")
 
70
    tree1.commit("Commit three", rev_id="a@u-0-2")
 
71
 
 
72
    tree2 = tree1.bzrdir.sprout("branch2").open_workingtree()
 
73
    br2 = tree2.branch
 
74
    tree2.commit("Commit four", rev_id="b@u-0-3")
 
75
    tree2.commit("Commit five", rev_id="b@u-0-4")
 
76
    revisions_2 = br2.revision_history()
 
77
    self.assertEquals(revisions_2[-1], 'b@u-0-4')
 
78
 
 
79
    tree1.merge_from_branch(br2)
 
80
    tree1.commit("Commit six", rev_id="a@u-0-3")
 
81
    tree1.commit("Commit seven", rev_id="a@u-0-4")
 
82
    tree2.commit("Commit eight", rev_id="b@u-0-5")
 
83
    self.assertEquals(br2.revision_history()[-1], 'b@u-0-5')
 
84
 
 
85
    tree1.merge_from_branch(br2)
 
86
    tree1.commit("Commit nine", rev_id="a@u-0-5")
 
87
    # DO NOT MERGE HERE - we WANT a GHOST.
 
88
    tree2.add_parent_tree_id(br1.revision_history()[4])
 
89
    tree2.commit("Commit ten - ghost merge", rev_id="b@u-0-6")
 
90
 
 
91
    return br1, br2
 
92
 
 
93
 
 
94
class TestIsAncestor(TestCaseWithTransport):
 
95
 
 
96
    def test_recorded_ancestry(self):
 
97
        """Test that commit records all ancestors"""
 
98
        br1, br2 = make_branches(self)
 
99
        d = [('a@u-0-0', ['a@u-0-0']),
 
100
             ('a@u-0-1', ['a@u-0-0', 'a@u-0-1']),
 
101
             ('a@u-0-2', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2']),
 
102
             ('b@u-0-3', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3']),
 
103
             ('b@u-0-4', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3',
 
104
                          'b@u-0-4']),
 
105
             ('a@u-0-3', ['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']),
 
107
             ('a@u-0-4', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
 
108
                          'a@u-0-3', 'a@u-0-4']),
 
109
             ('b@u-0-5', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
 
110
                          'b@u-0-5']),
 
111
             ('a@u-0-5', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
 
112
                          'b@u-0-3', 'b@u-0-4',
 
113
                          'b@u-0-5', 'a@u-0-5']),
 
114
             ('b@u-0-6', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2',
 
115
                          'b@u-0-3', 'b@u-0-4',
 
116
                          'b@u-0-5', 'b@u-0-6']),
 
117
             ]
 
118
        br1_only = ('a@u-0-3', 'a@u-0-4', 'a@u-0-5')
 
119
        br2_only = ('b@u-0-6',)
 
120
        for branch in br1, br2:
 
121
            for rev_id, anc in d:
 
122
                if rev_id in br1_only and not branch is br1:
 
123
                    continue
 
124
                if rev_id in br2_only and not branch is br2:
 
125
                    continue
 
126
                mutter('ancestry of {%s}: %r',
 
127
                       rev_id, branch.repository.get_ancestry(rev_id))
 
128
                result = sorted(branch.repository.get_ancestry(rev_id))
 
129
                self.assertEquals(result, [None] + sorted(anc))
 
130
 
 
131
 
 
132
class TestIntermediateRevisions(TestCaseWithTransport):
 
133
 
 
134
    def setUp(self):
 
135
        TestCaseWithTransport.setUp(self)
 
136
        self.br1, self.br2 = make_branches(self)
 
137
        wt1 = self.br1.bzrdir.open_workingtree()
 
138
        wt2 = self.br2.bzrdir.open_workingtree()
 
139
        wt2.commit("Commit eleven", rev_id="b@u-0-7")
 
140
        wt2.commit("Commit twelve", rev_id="b@u-0-8")
 
141
        wt2.commit("Commit thirtteen", rev_id="b@u-0-9")
 
142
 
 
143
        wt1.merge_from_branch(self.br2)
 
144
        wt1.commit("Commit fourtten", rev_id="a@u-0-6")
 
145
 
 
146
        wt2.merge_from_branch(self.br1)
 
147
        wt2.commit("Commit fifteen", rev_id="b@u-0-10")
 
148
 
 
149
 
 
150
class MockRevisionSource(object):
 
151
    """A RevisionSource that takes a pregenerated graph.
 
152
 
 
153
    This is useful for testing revision graph algorithms where
 
154
    the actual branch existing is irrelevant.
 
155
    """
 
156
 
 
157
    def __init__(self, full_graph):
 
158
        self._full_graph = full_graph
 
159
 
 
160
    def get_revision_graph_with_ghosts(self, revision_ids):
 
161
        # This is mocked out to just return a constant graph.
 
162
        return self._full_graph
 
163
 
 
164
 
 
165
class TestCommonAncestor(TestCaseWithTransport):
 
166
    """Test checking whether a revision is an ancestor of another revision"""
 
167
 
 
168
    def test_get_history(self):
 
169
        # TODO: test ghosts on the left hand branch's impact
 
170
        # TODO: test ghosts on all parents, we should get some
 
171
        # indicator. i.e. NULL_REVISION
 
172
        # RBC 20060608
 
173
        tree = self.make_branch_and_tree('.')
 
174
        tree.commit('1', rev_id = '1', allow_pointless=True)
 
175
        tree.commit('2', rev_id = '2', allow_pointless=True)
 
176
        tree.commit('3', rev_id = '3', allow_pointless=True)
 
177
        rev = tree.branch.repository.get_revision('1')
 
178
        history = rev.get_history(tree.branch.repository)
 
179
        self.assertEqual([None, '1'], history)
 
180
        rev = tree.branch.repository.get_revision('2')
 
181
        history = rev.get_history(tree.branch.repository)
 
182
        self.assertEqual([None, '1', '2'], history)
 
183
        rev = tree.branch.repository.get_revision('3')
 
184
        history = rev.get_history(tree.branch.repository)
 
185
        self.assertEqual([None, '1', '2' ,'3'], history)
 
186
 
 
187
 
 
188
class TestReservedId(TestCase):
 
189
 
 
190
    def test_is_reserved_id(self):
 
191
        self.assertEqual(True, revision.is_reserved_id(NULL_REVISION))
 
192
        self.assertEqual(True, revision.is_reserved_id(
 
193
            revision.CURRENT_REVISION))
 
194
        self.assertEqual(True, revision.is_reserved_id('arch:'))
 
195
        self.assertEqual(False, revision.is_reserved_id('null'))
 
196
        self.assertEqual(False, revision.is_reserved_id(
 
197
            'arch:a@example.com/c--b--v--r'))
 
198
        self.assertEqual(False, revision.is_reserved_id(None))
 
199
 
 
200
 
 
201
class TestRevisionMethods(TestCase):
 
202
 
 
203
    def test_get_summary(self):
 
204
        r = revision.Revision('1')
 
205
        r.message = 'a'
 
206
        self.assertEqual('a', r.get_summary())
 
207
        r.message = 'a\nb'
 
208
        self.assertEqual('a', r.get_summary())
 
209
        r.message = '\na\nb'
 
210
        self.assertEqual('a', r.get_summary())
 
211
 
 
212
    def test_get_apparent_author(self):
 
213
        r = revision.Revision('1')
 
214
        r.committer = 'A'
 
215
        author = self.applyDeprecated(
 
216
                symbol_versioning.deprecated_in((1, 13, 0)),
 
217
                r.get_apparent_author)
 
218
        self.assertEqual('A', author)
 
219
        r.properties['author'] = 'B'
 
220
        author = self.applyDeprecated(
 
221
                symbol_versioning.deprecated_in((1, 13, 0)),
 
222
                r.get_apparent_author)
 
223
        self.assertEqual('B', author)
 
224
        r.properties['authors'] = 'C\nD'
 
225
        author = self.applyDeprecated(
 
226
                symbol_versioning.deprecated_in((1, 13, 0)),
 
227
                r.get_apparent_author)
 
228
        self.assertEqual('C', author)
 
229
 
 
230
    def test_get_apparent_author_none(self):
 
231
        r = revision.Revision('1')
 
232
        author = self.applyDeprecated(
 
233
                symbol_versioning.deprecated_in((1, 13, 0)),
 
234
                r.get_apparent_author)
 
235
        self.assertEqual(None, author)
 
236
 
 
237
    def test_get_apparent_authors(self):
 
238
        r = revision.Revision('1')
 
239
        r.committer = 'A'
 
240
        self.assertEqual(['A'], r.get_apparent_authors())
 
241
        r.properties['author'] = 'B'
 
242
        self.assertEqual(['B'], r.get_apparent_authors())
 
243
        r.properties['authors'] = 'C\nD'
 
244
        self.assertEqual(['C', 'D'], r.get_apparent_authors())
 
245
 
 
246
    def test_get_apparent_authors_no_committer(self):
 
247
        r = revision.Revision('1')
 
248
        self.assertEqual([], r.get_apparent_authors())
 
249
 
 
250
 
 
251
class TestRevisionBugs(TestCase):
 
252
    """Tests for getting the bugs that a revision is linked to."""
 
253
 
 
254
    def test_no_bugs(self):
 
255
        r = revision.Revision('1')
 
256
        self.assertEqual([], list(r.iter_bugs()))
 
257
 
 
258
    def test_some_bugs(self):
 
259
        r = revision.Revision(
 
260
            '1', properties={
 
261
                'bugs': bugtracker.encode_fixes_bug_urls(
 
262
                    ['http://example.com/bugs/1',
 
263
                     'http://launchpad.net/bugs/1234'])})
 
264
        self.assertEqual(
 
265
            [('http://example.com/bugs/1', bugtracker.FIXED),
 
266
             ('http://launchpad.net/bugs/1234', bugtracker.FIXED)],
 
267
            list(r.iter_bugs()))
 
268
 
 
269
    def test_no_status(self):
 
270
        r = revision.Revision(
 
271
            '1', properties={'bugs': 'http://example.com/bugs/1'})
 
272
        self.assertRaises(InvalidLineInBugsProperty, list, r.iter_bugs())
 
273
 
 
274
    def test_too_much_information(self):
 
275
        r = revision.Revision(
 
276
            '1', properties={'bugs': 'http://example.com/bugs/1 fixed bar'})
 
277
        self.assertRaises(InvalidLineInBugsProperty, list, r.iter_bugs())
 
278
 
 
279
    def test_invalid_status(self):
 
280
        r = revision.Revision(
 
281
            '1', properties={'bugs': 'http://example.com/bugs/1 faxed'})
 
282
        self.assertRaises(InvalidBugStatus, list, r.iter_bugs())