~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
3350.4.2 by Robert Collins
Remove more deprecated methods following the chain of deprecated functions outwards.
28
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.
29
                             NULL_REVISION)
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
30
from bzrlib.symbol_versioning import 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
31
from bzrlib.tests import TestCase, TestCaseWithTransport
1270 by Martin Pool
- fix recording of merged ancestry lines
32
from bzrlib.trace import mutter
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
33
from bzrlib.workingtree import WorkingTree
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
34
1685.1.67 by Martin Pool
Suppress warning from test of deprecated method
35
# We're allowed to test deprecated interfaces
36
warnings.filterwarnings('ignore',
37
        '.*get_intervening_revisions was deprecated',
38
        DeprecationWarning,
39
        r'bzrlib\.tests\.test_revision')
40
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
41
# XXX: Make this a method of a merge base case
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
42
def make_branches(self, format=None):
1392 by Robert Collins
reinstate testfetch test case
43
    """Create two branches
44
45
    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
46
    commit 10 is a ghosted merge merge from branch 1
1392 by Robert Collins
reinstate testfetch test case
47
48
    the object graph is
49
    B:     A:
50
    a..0   a..0 
51
    a..1   a..1
52
    a..2   a..2
53
    b..3   a..3 merges b..4
54
    b..4   a..4
55
    b..5   a..5 merges b..5
1092.2.26 by Robert Collins
fetch should work with ghosts
56
    b..6 merges a4
1392 by Robert Collins
reinstate testfetch test case
57
58
    so A is missing b6 at the start
59
    and B is missing a3, a4, a5
60
    """
2696.3.3 by Martin Pool
Start setting the default format to dirstate-tags
61
    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.
62
    br1 = tree1.branch
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
63
    
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
64
    tree1.commit("Commit one", rev_id="a@u-0-0")
65
    tree1.commit("Commit two", rev_id="a@u-0-1")
66
    tree1.commit("Commit three", rev_id="a@u-0-2")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
67
1649.1.1 by Robert Collins
* 'pull' and 'push' now normalise the revision history, so that any two
68
    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.
69
    br2 = tree2.branch
70
    tree2.commit("Commit four", rev_id="b@u-0-3")
71
    tree2.commit("Commit five", rev_id="b@u-0-4")
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
72
    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.
73
    self.assertEquals(revisions_2[-1], 'b@u-0-4')
1263 by Martin Pool
- clean up imports
74
    
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
75
    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.
76
    tree1.commit("Commit six", rev_id="a@u-0-3")
77
    tree1.commit("Commit seven", rev_id="a@u-0-4")
78
    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.
79
    self.assertEquals(br2.revision_history()[-1], 'b@u-0-5')
1266 by Martin Pool
- fix up testrevision to fetch revisions before marking them merged
80
    
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
81
    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.
82
    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.
83
    # DO NOT MERGE HERE - we WANT a GHOST.
84
    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.
85
    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
86
    
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
87
    return br1, br2
88
89
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
90
class TestIsAncestor(TestCaseWithTransport):
91
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
92
    def test_recorded_ancestry(self):
93
        """Test that commit records all ancestors"""
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
94
        br1, br2 = make_branches(self)
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
95
        d = [('a@u-0-0', ['a@u-0-0']),
96
             ('a@u-0-1', ['a@u-0-0', 'a@u-0-1']),
97
             ('a@u-0-2', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2']),
98
             ('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
99
             ('b@u-0-4', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3',
100
                          'b@u-0-4']),
101
             ('a@u-0-3', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
102
                          'a@u-0-3']),
1271 by Martin Pool
- more commit ancestry tests
103
             ('a@u-0-4', ['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', 'a@u-0-4']),
105
             ('b@u-0-5', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
106
                          'b@u-0-5']),
107
             ('a@u-0-5', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
108
                          'b@u-0-3', 'b@u-0-4',
109
                          'b@u-0-5', 'a@u-0-5']),
1392 by Robert Collins
reinstate testfetch test case
110
             ('b@u-0-6', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2',
1271 by Martin Pool
- more commit ancestry tests
111
                          'b@u-0-3', 'b@u-0-4',
112
                          'b@u-0-5', 'b@u-0-6']),
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
113
             ]
1392 by Robert Collins
reinstate testfetch test case
114
        br1_only = ('a@u-0-3', 'a@u-0-4', 'a@u-0-5')
115
        br2_only = ('b@u-0-6',)
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
116
        for branch in br1, br2:
117
            for rev_id, anc in d:
1392 by Robert Collins
reinstate testfetch test case
118
                if rev_id in br1_only and not branch is br1:
119
                    continue
120
                if rev_id in br2_only and not branch is br2:
121
                    continue
1270 by Martin Pool
- fix recording of merged ancestry lines
122
                mutter('ancestry of {%s}: %r',
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
123
                       rev_id, branch.repository.get_ancestry(rev_id))
124
                result = sorted(branch.repository.get_ancestry(rev_id))
125
                self.assertEquals(result, [None] + sorted(anc))
1268 by Martin Pool
- is_ancestor now works by looking at the Branch's stored ancestry
126
    
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)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
133
        wt1 = self.br1.bzrdir.open_workingtree()
134
        wt2 = self.br2.bzrdir.open_workingtree()
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
135
        wt2.commit("Commit eleven", rev_id="b@u-0-7")
136
        wt2.commit("Commit twelve", rev_id="b@u-0-8")
137
        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
138
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
139
        wt1.merge_from_branch(self.br2)
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
140
        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
141
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
142
        wt2.merge_from_branch(self.br1)
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
143
        wt2.commit("Commit fifteen", rev_id="b@u-0-10")
1092.3.2 by Robert Collins
merge from baz2bzr
144
145
        from bzrlib.revision import MultipleRevisionSources
3228.4.11 by John Arbash Meinel
Deprecations abound.
146
        self.sources = self.applyDeprecated(one_three,
147
                        MultipleRevisionSources, self.br1.repository,
148
                                                 self.br2.repository)
1092.3.2 by Robert Collins
merge from baz2bzr
149
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
150
974.2.7 by aaron.bentley at utoronto
Merged from bzr.24
151
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
152
class MockRevisionSource(object):
153
    """A RevisionSource that takes a pregenerated graph.
154
155
    This is useful for testing revision graph algorithms where
156
    the actual branch existing is irrelevant.
157
    """
158
159
    def __init__(self, full_graph):
160
        self._full_graph = full_graph
161
162
    def get_revision_graph_with_ghosts(self, revision_ids):
163
        # This is mocked out to just return a constant graph.
164
        return self._full_graph
165
166
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
167
class TestCommonAncestor(TestCaseWithTransport):
974.1.35 by aaron.bentley at utoronto
Added revision-based common-ancestor checking
168
    """Test checking whether a revision is an ancestor of another revision"""
1092.1.39 by Robert Collins
merge from mpool
169
1534.4.49 by Robert Collins
Provide a revision.get_history(repository) method for generating a synthetic revision history.
170
    def test_get_history(self):
171
        # TODO: test ghosts on the left hand branch's impact
172
        # TODO: test ghosts on all parents, we should get some
173
        # indicator. i.e. NULL_REVISION
174
        # RBC 20060608
175
        tree = self.make_branch_and_tree('.')
176
        tree.commit('1', rev_id = '1', allow_pointless=True)
177
        tree.commit('2', rev_id = '2', allow_pointless=True)
178
        tree.commit('3', rev_id = '3', allow_pointless=True)
179
        rev = tree.branch.repository.get_revision('1')
180
        history = rev.get_history(tree.branch.repository)
181
        self.assertEqual([None, '1'], history)
182
        rev = tree.branch.repository.get_revision('2')
183
        history = rev.get_history(tree.branch.repository)
184
        self.assertEqual([None, '1', '2'], history)
185
        rev = tree.branch.repository.get_revision('3')
186
        history = rev.get_history(tree.branch.repository)
187
        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.
188
2229.2.3 by Aaron Bentley
change reserved_id to is_reserved_id, add check_not_reserved for DRY
189
190
class TestReservedId(TestCase):
191
192
    def test_is_reserved_id(self):
193
        self.assertEqual(True, revision.is_reserved_id(NULL_REVISION))
194
        self.assertEqual(True, revision.is_reserved_id(
195
            revision.CURRENT_REVISION))
196
        self.assertEqual(True, revision.is_reserved_id('arch:'))
197
        self.assertEqual(False, revision.is_reserved_id('null'))
198
        self.assertEqual(False, revision.is_reserved_id(
199
            'arch:a@example.com/c--b--v--r'))
200
        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.
201
202
203
class TestRevisionMethods(TestCase):
204
205
    def test_get_summary(self):
206
        r = revision.Revision('1')
207
        r.message = 'a'
208
        self.assertEqual('a', r.get_summary())
209
        r.message = 'a\nb'
210
        self.assertEqual('a', r.get_summary())
211
        r.message = '\na\nb'
212
        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.
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'
2671.5.7 by Lukáš Lalinsky
Rename get_author to get_apparent_author, revert the long log back to displaying the committer.
217
        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.
218
        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.
219
        self.assertEqual('B', r.get_apparent_author())