/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2005-2011, 2016 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
1685.1.67 by Martin Pool
Suppress warning from test of deprecated method
18
import warnings
1263 by Martin Pool
- clean up imports
19
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
20
from breezy import (
4119.4.3 by Jonathan Lange
Add Revision.iter_bugs.
21
    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
22
    revision,
23
    )
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
24
from breezy.revision import NULL_REVISION
25
from breezy.tests import TestCase, TestCaseWithTransport
26
from breezy.tests.matchers import MatchesAncestry
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
27
1685.1.67 by Martin Pool
Suppress warning from test of deprecated method
28
# We're allowed to test deprecated interfaces
29
warnings.filterwarnings('ignore',
7143.15.2 by Jelmer Vernooij
Run autopep8.
30
                        '.*get_intervening_revisions was deprecated',
31
                        DeprecationWarning,
32
                        r'breezy\.tests\.test_revision')
1685.1.67 by Martin Pool
Suppress warning from test of deprecated method
33
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
34
# XXX: Make this a method of a merge base case
7143.15.2 by Jelmer Vernooij
Run autopep8.
35
36
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
37
def make_branches(self, format=None):
1392 by Robert Collins
reinstate testfetch test case
38
    """Create two branches
39
40
    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
41
    commit 10 is a ghosted merge merge from branch 1
1392 by Robert Collins
reinstate testfetch test case
42
43
    the object graph is
44
    B:     A:
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
45
    a..0   a..0
1392 by Robert Collins
reinstate testfetch test case
46
    a..1   a..1
47
    a..2   a..2
48
    b..3   a..3 merges b..4
49
    b..4   a..4
50
    b..5   a..5 merges b..5
1092.2.26 by Robert Collins
fetch should work with ghosts
51
    b..6 merges a4
1392 by Robert Collins
reinstate testfetch test case
52
53
    so A is missing b6 at the start
54
    and B is missing a3, a4, a5
55
    """
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
56
    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.
57
    br1 = tree1.branch
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
58
6973.13.2 by Jelmer Vernooij
Fix some more tests.
59
    tree1.commit("Commit one", rev_id=b"a@u-0-0")
60
    tree1.commit("Commit two", rev_id=b"a@u-0-1")
61
    tree1.commit("Commit three", rev_id=b"a@u-0-2")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
62
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
63
    tree2 = tree1.controldir.sprout("branch2").open_workingtree()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
64
    br2 = tree2.branch
6973.13.2 by Jelmer Vernooij
Fix some more tests.
65
    tree2.commit("Commit four", rev_id=b"b@u-0-3")
66
    tree2.commit("Commit five", rev_id=b"b@u-0-4")
7027.3.3 by Jelmer Vernooij
Add some more bees; support writing both bytes and unicode strings in build_tree_contents.
67
    self.assertEqual(br2.last_revision(), b'b@u-0-4')
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
68
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
69
    tree1.merge_from_branch(br2)
6973.13.2 by Jelmer Vernooij
Fix some more tests.
70
    tree1.commit("Commit six", rev_id=b"a@u-0-3")
71
    tree1.commit("Commit seven", rev_id=b"a@u-0-4")
72
    tree2.commit("Commit eight", rev_id=b"b@u-0-5")
7027.3.3 by Jelmer Vernooij
Add some more bees; support writing both bytes and unicode strings in build_tree_contents.
73
    self.assertEqual(br2.last_revision(), b'b@u-0-5')
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
74
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
75
    tree1.merge_from_branch(br2)
6973.13.2 by Jelmer Vernooij
Fix some more tests.
76
    tree1.commit("Commit nine", rev_id=b"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.
77
    # DO NOT MERGE HERE - we WANT a GHOST.
6165.4.25 by Jelmer Vernooij
Fix plugin use of revision_history.
78
    br1.lock_read()
79
    try:
80
        graph = br1.repository.get_graph()
81
        revhistory = list(graph.iter_lefthand_ancestry(br1.last_revision(),
7143.15.2 by Jelmer Vernooij
Run autopep8.
82
                                                       [revision.NULL_REVISION]))
6165.4.25 by Jelmer Vernooij
Fix plugin use of revision_history.
83
        revhistory.reverse()
84
    finally:
85
        br1.unlock()
86
    tree2.add_parent_tree_id(revhistory[4])
6973.13.2 by Jelmer Vernooij
Fix some more tests.
87
    tree2.commit("Commit ten - ghost merge", rev_id=b"b@u-0-6")
3830.3.23 by John Arbash Meinel
Use Branch.sprout rather than Branch.clone.
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)
6973.10.4 by Jelmer Vernooij
Update python3.passing.
97
        d = [(b'a@u-0-0', [b'a@u-0-0']),
98
             (b'a@u-0-1', [b'a@u-0-0', b'a@u-0-1']),
99
             (b'a@u-0-2', [b'a@u-0-0', b'a@u-0-1', b'a@u-0-2']),
100
             (b'b@u-0-3', [b'a@u-0-0', b'a@u-0-1', b'a@u-0-2', b'b@u-0-3']),
101
             (b'b@u-0-4', [b'a@u-0-0', b'a@u-0-1', b'a@u-0-2', b'b@u-0-3',
102
                           b'b@u-0-4']),
103
             (b'a@u-0-3', [b'a@u-0-0', b'a@u-0-1', b'a@u-0-2', b'b@u-0-3', b'b@u-0-4',
104
                           b'a@u-0-3']),
105
             (b'a@u-0-4', [b'a@u-0-0', b'a@u-0-1', b'a@u-0-2', b'b@u-0-3', b'b@u-0-4',
106
                           b'a@u-0-3', b'a@u-0-4']),
107
             (b'b@u-0-5', [b'a@u-0-0', b'a@u-0-1', b'a@u-0-2', b'b@u-0-3', b'b@u-0-4',
108
                           b'b@u-0-5']),
109
             (b'a@u-0-5', [b'a@u-0-0', b'a@u-0-1', b'a@u-0-2', b'a@u-0-3', b'a@u-0-4',
110
                           b'b@u-0-3', b'b@u-0-4',
111
                           b'b@u-0-5', b'a@u-0-5']),
112
             (b'b@u-0-6', [b'a@u-0-0', b'a@u-0-1', b'a@u-0-2', b'a@u-0-4',
113
                           b'b@u-0-3', b'b@u-0-4',
114
                           b'b@u-0-5', b'b@u-0-6']),
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
115
             ]
6973.10.4 by Jelmer Vernooij
Update python3.passing.
116
        br1_only = (b'a@u-0-3', b'a@u-0-4', b'a@u-0-5')
117
        br2_only = (b'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:
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
120
                if rev_id in br1_only and branch is not br1:
1392 by Robert Collins
reinstate testfetch test case
121
                    continue
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
122
                if rev_id in br2_only and branch is not br2:
1392 by Robert Collins
reinstate testfetch test case
123
                    continue
5972.3.15 by Jelmer Vernooij
Use matchers.
124
                self.assertThat(anc,
7143.15.2 by Jelmer Vernooij
Run autopep8.
125
                                MatchesAncestry(branch.repository, rev_id))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
126
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
127
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
128
class TestIntermediateRevisions(TestCaseWithTransport):
1092.3.2 by Robert Collins
merge from baz2bzr
129
130
    def setUp(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
131
        TestCaseWithTransport.setUp(self)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
132
        self.br1, self.br2 = make_branches(self)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
133
        wt1 = self.br1.controldir.open_workingtree()
134
        wt2 = self.br2.controldir.open_workingtree()
6973.13.2 by Jelmer Vernooij
Fix some more tests.
135
        wt2.commit("Commit eleven", rev_id=b"b@u-0-7")
136
        wt2.commit("Commit twelve", rev_id=b"b@u-0-8")
137
        wt2.commit("Commit thirtteen", rev_id=b"b@u-0-9")
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
138
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
139
        wt1.merge_from_branch(self.br2)
6973.13.2 by Jelmer Vernooij
Fix some more tests.
140
        wt1.commit("Commit fourtten", rev_id=b"a@u-0-6")
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
141
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
142
        wt2.merge_from_branch(self.br1)
6973.13.2 by Jelmer Vernooij
Fix some more tests.
143
        wt2.commit("Commit fifteen", rev_id=b"b@u-0-10")
1092.3.2 by Robert Collins
merge from baz2bzr
144
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
145
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
146
class MockRevisionSource(object):
147
    """A RevisionSource that takes a pregenerated graph.
148
149
    This is useful for testing revision graph algorithms where
150
    the actual branch existing is irrelevant.
151
    """
152
153
    def __init__(self, full_graph):
154
        self._full_graph = full_graph
155
156
    def get_revision_graph_with_ghosts(self, revision_ids):
157
        # This is mocked out to just return a constant graph.
158
        return self._full_graph
159
160
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
161
class TestCommonAncestor(TestCaseWithTransport):
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
162
    """Test checking whether a revision is an ancestor of another revision"""
1092.1.39 by Robert Collins
merge from mpool
163
1534.4.49 by Robert Collins
Provide a revision.get_history(repository) method for generating a synthetic revision history.
164
    def test_get_history(self):
165
        # TODO: test ghosts on the left hand branch's impact
166
        # TODO: test ghosts on all parents, we should get some
167
        # indicator. i.e. NULL_REVISION
168
        # RBC 20060608
169
        tree = self.make_branch_and_tree('.')
6973.5.2 by Jelmer Vernooij
Add more bees.
170
        tree.commit('1', rev_id=b'1', allow_pointless=True)
171
        tree.commit('2', rev_id=b'2', allow_pointless=True)
172
        tree.commit('3', rev_id=b'3', allow_pointless=True)
173
        rev = tree.branch.repository.get_revision(b'1')
174
        history = rev.get_history(tree.branch.repository)
175
        self.assertEqual([None, b'1'], history)
176
        rev = tree.branch.repository.get_revision(b'2')
177
        history = rev.get_history(tree.branch.repository)
178
        self.assertEqual([None, b'1', b'2'], history)
179
        rev = tree.branch.repository.get_revision(b'3')
180
        history = rev.get_history(tree.branch.repository)
181
        self.assertEqual([None, b'1', b'2', b'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.
182
2229.2.3 by Aaron Bentley
change reserved_id to is_reserved_id, add check_not_reserved for DRY
183
184
class TestReservedId(TestCase):
185
186
    def test_is_reserved_id(self):
187
        self.assertEqual(True, revision.is_reserved_id(NULL_REVISION))
188
        self.assertEqual(True, revision.is_reserved_id(
189
            revision.CURRENT_REVISION))
6973.10.4 by Jelmer Vernooij
Update python3.passing.
190
        self.assertEqual(True, revision.is_reserved_id(b'arch:'))
191
        self.assertEqual(False, revision.is_reserved_id(b'null'))
2229.2.3 by Aaron Bentley
change reserved_id to is_reserved_id, add check_not_reserved for DRY
192
        self.assertEqual(False, revision.is_reserved_id(
6973.10.4 by Jelmer Vernooij
Update python3.passing.
193
            b'arch:a@example.com/c--b--v--r'))
2229.2.3 by Aaron Bentley
change reserved_id to is_reserved_id, add check_not_reserved for DRY
194
        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.
195
196
197
class TestRevisionMethods(TestCase):
198
199
    def test_get_summary(self):
200
        r = revision.Revision('1')
201
        r.message = 'a'
202
        self.assertEqual('a', r.get_summary())
203
        r.message = 'a\nb'
204
        self.assertEqual('a', r.get_summary())
205
        r.message = '\na\nb'
206
        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.
207
        r.message = None
208
        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.
209
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
210
    def test_get_apparent_authors(self):
211
        r = revision.Revision('1')
212
        r.committer = 'A'
213
        self.assertEqual(['A'], r.get_apparent_authors())
6973.12.9 by Jelmer Vernooij
More fixes.
214
        r.properties[u'author'] = 'B'
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
215
        self.assertEqual(['B'], r.get_apparent_authors())
6973.12.9 by Jelmer Vernooij
More fixes.
216
        r.properties[u'authors'] = 'C\nD'
4056.2.3 by James Westby
Use a new "authors" revision property to allow multiple authors
217
        self.assertEqual(['C', 'D'], r.get_apparent_authors())
4119.4.3 by Jonathan Lange
Add Revision.iter_bugs.
218
4258.3.1 by Jelmer Vernooij
Cope with revision.committer being None.
219
    def test_get_apparent_authors_no_committer(self):
220
        r = revision.Revision('1')
221
        self.assertEqual([], r.get_apparent_authors())
222
4119.4.3 by Jonathan Lange
Add Revision.iter_bugs.
223
224
class TestRevisionBugs(TestCase):
225
    """Tests for getting the bugs that a revision is linked to."""
226
227
    def test_no_bugs(self):
228
        r = revision.Revision('1')
229
        self.assertEqual([], list(r.iter_bugs()))
230
231
    def test_some_bugs(self):
232
        r = revision.Revision(
233
            '1', properties={
6973.12.9 by Jelmer Vernooij
More fixes.
234
                u'bugs': bugtracker.encode_fixes_bug_urls(
7131.10.4 by Jelmer Vernooij
Fix another test.
235
                    [('http://example.com/bugs/1', 'fixed'),
236
                     ('http://launchpad.net/bugs/1234', 'fixed')])})
4119.4.3 by Jonathan Lange
Add Revision.iter_bugs.
237
        self.assertEqual(
238
            [('http://example.com/bugs/1', bugtracker.FIXED),
239
             ('http://launchpad.net/bugs/1234', bugtracker.FIXED)],
240
            list(r.iter_bugs()))
241
242
    def test_no_status(self):
243
        r = revision.Revision(
6973.12.5 by Jelmer Vernooij
Add some u's for revision property names.
244
            '1', properties={u'bugs': 'http://example.com/bugs/1'})
6729.4.1 by Jelmer Vernooij
Move bugtracker errors to breezy.bugtracker.
245
        self.assertRaises(bugtracker.InvalidLineInBugsProperty, list,
7143.15.2 by Jelmer Vernooij
Run autopep8.
246
                          r.iter_bugs())
4119.4.3 by Jonathan Lange
Add Revision.iter_bugs.
247
248
    def test_too_much_information(self):
249
        r = revision.Revision(
6973.12.5 by Jelmer Vernooij
Add some u's for revision property names.
250
            '1', properties={u'bugs': 'http://example.com/bugs/1 fixed bar'})
6729.4.1 by Jelmer Vernooij
Move bugtracker errors to breezy.bugtracker.
251
        self.assertRaises(bugtracker.InvalidLineInBugsProperty, list,
7143.15.2 by Jelmer Vernooij
Run autopep8.
252
                          r.iter_bugs())
4119.4.3 by Jonathan Lange
Add Revision.iter_bugs.
253
254
    def test_invalid_status(self):
255
        r = revision.Revision(
6973.12.5 by Jelmer Vernooij
Add some u's for revision property names.
256
            '1', properties={u'bugs': 'http://example.com/bugs/1 faxed'})
6729.4.1 by Jelmer Vernooij
Move bugtracker errors to breezy.bugtracker.
257
        self.assertRaises(bugtracker.InvalidBugStatus, list, r.iter_bugs())