~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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
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 (
4119.4.3 by Jonathan Lange
Add Revision.iter_bugs.
22
    bugtracker,
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
23
    revision,
3228.4.11 by John Arbash Meinel
Deprecations abound.
24
    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
25
    )
1263 by Martin Pool
- clean up imports
26
from bzrlib.branch import Branch
4119.4.3 by Jonathan Lange
Add Revision.iter_bugs.
27
from bzrlib.errors import (
28
    InvalidBugStatus,
29
    InvalidLineInBugsProperty,
30
    NoSuchRevision,
31
    )
2490.2.21 by Aaron Bentley
Rename graph to deprecated_graph
32
from bzrlib.deprecated_graph import Graph
3350.4.2 by Robert Collins
Remove more deprecated methods following the chain of deprecated functions outwards.
33
from bzrlib.revision import (find_present_ancestors,
1836.3.1 by Robert Collins
(robertc) Teach repository.get_revision_graph, and revision.common_ancestor, about NULL_REVISION.
34
                             NULL_REVISION)
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
35
from bzrlib.tests import TestCase, TestCaseWithTransport
1270 by Martin Pool
- fix recording of merged ancestry lines
36
from bzrlib.trace import mutter
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
37
from bzrlib.workingtree import WorkingTree
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
38
1685.1.67 by Martin Pool
Suppress warning from test of deprecated method
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
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
45
# XXX: Make this a method of a merge base case
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
46
def make_branches(self, format=None):
1392 by Robert Collins
reinstate testfetch test case
47
    """Create two branches
48
49
    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
50
    commit 10 is a ghosted merge merge from branch 1
1392 by Robert Collins
reinstate testfetch test case
51
52
    the object graph is
53
    B:     A:
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
54
    a..0   a..0
1392 by Robert Collins
reinstate testfetch test case
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
1092.2.26 by Robert Collins
fetch should work with ghosts
60
    b..6 merges a4
1392 by Robert Collins
reinstate testfetch test case
61
62
    so A is missing b6 at the start
63
    and B is missing a3, a4, a5
64
    """
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
65
    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.
66
    br1 = tree1.branch
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
67
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
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")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
71
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
72
    tree2 = tree1.bzrdir.sprout("branch2").open_workingtree()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
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")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
76
    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.
77
    self.assertEquals(revisions_2[-1], 'b@u-0-4')
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
78
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
79
    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.
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")
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
83
    self.assertEquals(br2.revision_history()[-1], 'b@u-0-5')
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
84
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
85
    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.
86
    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.
87
    # DO NOT MERGE HERE - we WANT a GHOST.
88
    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.
89
    tree2.commit("Commit ten - ghost merge", rev_id="b@u-0-6")
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
90
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
91
    return br1, br2
92
93
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
94
class TestIsAncestor(TestCaseWithTransport):
95
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
96
    def test_recorded_ancestry(self):
97
        """Test that commit records all ancestors"""
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
98
        br1, br2 = make_branches(self)
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
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']),
1270 by Martin Pool
- fix recording of merged ancestry lines
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']),
1271 by Martin Pool
- more commit ancestry tests
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']),
1392 by Robert Collins
reinstate testfetch test case
114
             ('b@u-0-6', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2',
1271 by Martin Pool
- more commit ancestry tests
115
                          'b@u-0-3', 'b@u-0-4',
116
                          'b@u-0-5', 'b@u-0-6']),
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
117
             ]
1392 by Robert Collins
reinstate testfetch test case
118
        br1_only = ('a@u-0-3', 'a@u-0-4', 'a@u-0-5')
119
        br2_only = ('b@u-0-6',)
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
120
        for branch in br1, br2:
121
            for rev_id, anc in d:
1392 by Robert Collins
reinstate testfetch test case
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
1270 by Martin Pool
- fix recording of merged ancestry lines
126
                mutter('ancestry of {%s}: %r',
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
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))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
130
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
131
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
132
class TestIntermediateRevisions(TestCaseWithTransport):
1092.3.2 by Robert Collins
merge from baz2bzr
133
134
    def setUp(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
135
        TestCaseWithTransport.setUp(self)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
136
        self.br1, self.br2 = make_branches(self)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
137
        wt1 = self.br1.bzrdir.open_workingtree()
138
        wt2 = self.br2.bzrdir.open_workingtree()
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
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")
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
142
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
143
        wt1.merge_from_branch(self.br2)
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
144
        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
145
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
146
        wt2.merge_from_branch(self.br1)
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
147
        wt2.commit("Commit fifteen", rev_id="b@u-0-10")
1092.3.2 by Robert Collins
merge from baz2bzr
148
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
149
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
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
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
165
class TestCommonAncestor(TestCaseWithTransport):
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
166
    """Test checking whether a revision is an ancestor of another revision"""
1092.1.39 by Robert Collins
merge from mpool
167
1534.4.49 by Robert Collins
Provide a revision.get_history(repository) method for generating a synthetic revision history.
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)
1594.2.3 by Robert Collins
bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.
186
2229.2.3 by Aaron Bentley
change reserved_id to is_reserved_id, add check_not_reserved for DRY
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))
2671.5.1 by Lukáš Lalinsky
Strip leading whitespace from the commit message before using the first line as a commit summary.
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())
4398.10.1 by jszakmeister
Make Revision.get_summary() return an empty string when Revision.message is None, instead of backtracing.
211
        r.message = None
212
        self.assertEqual('', 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.
213
2671.5.7 by Lukáš Lalinsky
Rename get_author to get_apparent_author, revert the long log back to displaying the committer.
214
    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.
215
        r = revision.Revision('1')
216
        r.committer = 'A'
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
217
        author = self.applyDeprecated(
218
                symbol_versioning.deprecated_in((1, 13, 0)),
219
                r.get_apparent_author)
220
        self.assertEqual('A', author)
221
        r.properties['author'] = 'B'
222
        author = self.applyDeprecated(
223
                symbol_versioning.deprecated_in((1, 13, 0)),
224
                r.get_apparent_author)
225
        self.assertEqual('B', author)
4056.2.3 by James Westby
Use a new "authors" revision property to allow multiple authors
226
        r.properties['authors'] = 'C\nD'
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
227
        author = self.applyDeprecated(
228
                symbol_versioning.deprecated_in((1, 13, 0)),
229
                r.get_apparent_author)
4056.2.3 by James Westby
Use a new "authors" revision property to allow multiple authors
230
        self.assertEqual('C', author)
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
231
4258.3.1 by Jelmer Vernooij
Cope with revision.committer being None.
232
    def test_get_apparent_author_none(self):
233
        r = revision.Revision('1')
234
        author = self.applyDeprecated(
235
                symbol_versioning.deprecated_in((1, 13, 0)),
236
                r.get_apparent_author)
237
        self.assertEqual(None, author)
238
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
239
    def test_get_apparent_authors(self):
240
        r = revision.Revision('1')
241
        r.committer = 'A'
242
        self.assertEqual(['A'], r.get_apparent_authors())
243
        r.properties['author'] = 'B'
244
        self.assertEqual(['B'], r.get_apparent_authors())
4056.2.3 by James Westby
Use a new "authors" revision property to allow multiple authors
245
        r.properties['authors'] = 'C\nD'
246
        self.assertEqual(['C', 'D'], r.get_apparent_authors())
4119.4.3 by Jonathan Lange
Add Revision.iter_bugs.
247
4258.3.1 by Jelmer Vernooij
Cope with revision.committer being None.
248
    def test_get_apparent_authors_no_committer(self):
249
        r = revision.Revision('1')
250
        self.assertEqual([], r.get_apparent_authors())
251
4119.4.3 by Jonathan Lange
Add Revision.iter_bugs.
252
253
class TestRevisionBugs(TestCase):
254
    """Tests for getting the bugs that a revision is linked to."""
255
256
    def test_no_bugs(self):
257
        r = revision.Revision('1')
258
        self.assertEqual([], list(r.iter_bugs()))
259
260
    def test_some_bugs(self):
261
        r = revision.Revision(
262
            '1', properties={
263
                'bugs': bugtracker.encode_fixes_bug_urls(
264
                    ['http://example.com/bugs/1',
265
                     'http://launchpad.net/bugs/1234'])})
266
        self.assertEqual(
267
            [('http://example.com/bugs/1', bugtracker.FIXED),
268
             ('http://launchpad.net/bugs/1234', bugtracker.FIXED)],
269
            list(r.iter_bugs()))
270
271
    def test_no_status(self):
272
        r = revision.Revision(
273
            '1', properties={'bugs': 'http://example.com/bugs/1'})
274
        self.assertRaises(InvalidLineInBugsProperty, list, r.iter_bugs())
275
276
    def test_too_much_information(self):
277
        r = revision.Revision(
278
            '1', properties={'bugs': 'http://example.com/bugs/1 fixed bar'})
279
        self.assertRaises(InvalidLineInBugsProperty, list, r.iter_bugs())
280
281
    def test_invalid_status(self):
282
        r = revision.Revision(
283
            '1', properties={'bugs': 'http://example.com/bugs/1 faxed'})
284
        self.assertRaises(InvalidBugStatus, list, r.iter_bugs())