~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/testrevision.py

  • Committer: Martin Pool
  • Date: 2005-09-22 06:19:33 UTC
  • Revision ID: mbp@sourcefrog.net-20050922061933-4b71d0f1e205b153
- keep track of number of checked revisions

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# (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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
 
 
18
import os
 
19
 
 
20
from bzrlib.selftest import TestCaseInTempDir
 
21
from bzrlib.branch import Branch
 
22
from bzrlib.commit import commit
 
23
from bzrlib.fetch import fetch
 
24
from bzrlib.revision import (find_present_ancestors, common_ancestor,
 
25
                             is_ancestor)
 
26
from bzrlib.trace import mutter
 
27
from bzrlib.errors import NoSuchRevision
 
28
 
 
29
def make_branches():
 
30
    os.mkdir("branch1")
 
31
    br1 = Branch("branch1", init=True)
 
32
    
 
33
    commit(br1, "Commit one", rev_id="a@u-0-0")
 
34
    commit(br1, "Commit two", rev_id="a@u-0-1")
 
35
    commit(br1, "Commit three", rev_id="a@u-0-2")
 
36
 
 
37
    os.mkdir("branch2")
 
38
    br2 = Branch("branch2", init=True)
 
39
    br2.update_revisions(br1)
 
40
    commit(br2, "Commit four", rev_id="b@u-0-3")
 
41
    commit(br2, "Commit five", rev_id="b@u-0-4")
 
42
    revisions_2 = br2.revision_history()
 
43
    
 
44
    fetch(from_branch=br2, to_branch=br1)
 
45
    br1.add_pending_merge(revisions_2[4])
 
46
    assert revisions_2[4] == 'b@u-0-4'
 
47
    commit(br1, "Commit six", rev_id="a@u-0-3")
 
48
    commit(br1, "Commit seven", rev_id="a@u-0-4")
 
49
    commit(br2, "Commit eight", rev_id="b@u-0-5")
 
50
    
 
51
    fetch(from_branch=br2, to_branch=br1)
 
52
    br1.add_pending_merge(br2.revision_history()[5])
 
53
    commit(br1, "Commit nine", rev_id="a@u-0-5")
 
54
 
 
55
    fetch(from_branch=br1, to_branch=br2)
 
56
    br2.add_pending_merge(br1.revision_history()[4])
 
57
    commit(br2, "Commit ten", rev_id="b@u-0-6")
 
58
 
 
59
    fetch(from_branch=br2, to_branch=br1)
 
60
    
 
61
    return br1, br2
 
62
 
 
63
 
 
64
class TestIsAncestor(TestCaseInTempDir):
 
65
    def test_recorded_ancestry(self):
 
66
        """Test that commit records all ancestors"""
 
67
        br1, br2 = make_branches()
 
68
        d = [('a@u-0-0', ['a@u-0-0']),
 
69
             ('a@u-0-1', ['a@u-0-0', 'a@u-0-1']),
 
70
             ('a@u-0-2', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2']),
 
71
             ('b@u-0-3', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3']),
 
72
             ('b@u-0-4', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3',
 
73
                          'b@u-0-4']),
 
74
             ('a@u-0-3', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
 
75
                          'a@u-0-3']),
 
76
             ('a@u-0-4', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
 
77
                          'a@u-0-3', 'a@u-0-4']),
 
78
             ('b@u-0-5', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4',
 
79
                          'b@u-0-5']),
 
80
             ('a@u-0-5', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
 
81
                          'b@u-0-3', 'b@u-0-4',
 
82
                          'b@u-0-5', 'a@u-0-5']),
 
83
             ('b@u-0-6', ['a@u-0-0', 'a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4',
 
84
                          'b@u-0-3', 'b@u-0-4',
 
85
                          'b@u-0-5', 'b@u-0-6']),
 
86
             ]
 
87
        for branch in br1, br2:
 
88
            for rev_id, anc in d:
 
89
                mutter('ancestry of {%s}: %r',
 
90
                       rev_id, branch.get_ancestry(rev_id))
 
91
                self.assertEquals(sorted(branch.get_ancestry(rev_id)),
 
92
                                  sorted(anc))
 
93
    
 
94
    
 
95
    def test_is_ancestor(self):
 
96
        """Test checking whether a revision is an ancestor of another revision"""
 
97
        br1, br2 = make_branches()
 
98
        revisions = br1.revision_history()
 
99
        revisions_2 = br2.revision_history()
 
100
        sources = br1
 
101
 
 
102
        assert is_ancestor(revisions[0], revisions[0], br1)
 
103
        assert is_ancestor(revisions[1], revisions[0], sources)
 
104
        assert not is_ancestor(revisions[0], revisions[1], sources)
 
105
        assert is_ancestor(revisions_2[3], revisions[0], sources)
 
106
        # disabled mbp 20050914, doesn't seem to happen anymore
 
107
        ## self.assertRaises(NoSuchRevision, is_ancestor, revisions_2[3],
 
108
        ##                  revisions[0], br1)        
 
109
        assert is_ancestor(revisions[3], revisions_2[4], sources)
 
110
        assert is_ancestor(revisions[3], revisions_2[4], br1)
 
111
        assert is_ancestor(revisions[3], revisions_2[3], sources)
 
112
        ## assert not is_ancestor(revisions[3], revisions_2[3], br1)
 
113
 
 
114
 
 
115
 
 
116
class TestIntermediateRevisions(TestCaseInTempDir):
 
117
 
 
118
    def setUp(self):
 
119
        from bzrlib.commit import commit
 
120
        TestCaseInTempDir.setUp(self)
 
121
        self.br1, self.br2 = make_branches()
 
122
 
 
123
        self.br2.commit("Commit eleven", rev_id="b@u-0-7")
 
124
        self.br2.commit("Commit twelve", rev_id="b@u-0-8")
 
125
        self.br2.commit("Commit thirtteen", rev_id="b@u-0-9")
 
126
 
 
127
        fetch(from_branch=self.br2, to_branch=self.br1)
 
128
        self.br1.add_pending_merge(self.br2.revision_history()[6])
 
129
        self.br1.commit("Commit fourtten", rev_id="a@u-0-6")
 
130
 
 
131
        fetch(from_branch=self.br1, to_branch=self.br2)
 
132
        self.br2.add_pending_merge(self.br1.revision_history()[6])
 
133
        self.br2.commit("Commit fifteen", rev_id="b@u-0-10")
 
134
 
 
135
        from bzrlib.revision import MultipleRevisionSources
 
136
        self.sources = MultipleRevisionSources(self.br1, self.br2)
 
137
 
 
138
    def intervene(self, ancestor, revision, revision_history=None):
 
139
        from bzrlib.revision import get_intervening_revisions
 
140
        return get_intervening_revisions(ancestor,revision, self.sources, 
 
141
                                         revision_history)
 
142
 
 
143
    def test_intervene(self):
 
144
        """Find intermediate revisions, without requiring history"""
 
145
        from bzrlib.errors import NotAncestor, NoSuchRevision
 
146
        assert len(self.intervene('a@u-0-0', 'a@u-0-0')) == 0
 
147
        self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-1'), ['a@u-0-1'])
 
148
        self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-2'), 
 
149
                         ['a@u-0-1', 'a@u-0-2'])
 
150
        self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-3'), 
 
151
                         ['a@u-0-1', 'a@u-0-2', 'b@u-0-3'])
 
152
        self.assertEqual(self.intervene('b@u-0-3', 'a@u-0-3'), 
 
153
                         ['b@u-0-4', 'a@u-0-3'])
 
154
        self.assertEqual(self.intervene('a@u-0-2', 'a@u-0-3', 
 
155
                                        self.br1.revision_history()), 
 
156
                         ['a@u-0-3'])
 
157
        self.assertEqual(self.intervene('a@u-0-0', 'a@u-0-5', 
 
158
                                        self.br1.revision_history()), 
 
159
                         ['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4', 
 
160
                          'a@u-0-5'])
 
161
        self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-6', 
 
162
                         self.br1.revision_history()), 
 
163
                         ['a@u-0-1', 'a@u-0-2', 'a@u-0-3', 'a@u-0-4', 
 
164
                          'b@u-0-6'])
 
165
        self.assertEqual(self.intervene('a@u-0-0', 'b@u-0-5'), 
 
166
                         ['a@u-0-1', 'a@u-0-2', 'b@u-0-3', 'b@u-0-4', 
 
167
                          'b@u-0-5'])
 
168
        self.assertEqual(self.intervene('b@u-0-3', 'b@u-0-6', 
 
169
                         self.br2.revision_history()), 
 
170
                         ['b@u-0-4', 'b@u-0-5', 'b@u-0-6'])
 
171
        self.assertEqual(self.intervene('b@u-0-6', 'b@u-0-10'), 
 
172
                         ['b@u-0-7', 'b@u-0-8', 'b@u-0-9', 'b@u-0-10'])
 
173
        self.assertEqual(self.intervene('b@u-0-6', 'b@u-0-10', 
 
174
                                        self.br2.revision_history()), 
 
175
                         ['b@u-0-7', 'b@u-0-8', 'b@u-0-9', 'b@u-0-10'])
 
176
        self.assertRaises(NotAncestor, self.intervene, 'b@u-0-10', 'b@u-0-6', 
 
177
                          self.br2.revision_history())
 
178
        self.assertRaises(NoSuchRevision, self.intervene, 'c@u-0-10', 
 
179
                          'b@u-0-6', self.br2.revision_history())
 
180
        self.assertRaises(NoSuchRevision, self.intervene, 'b@u-0-10', 
 
181
                          'c@u-0-6', self.br2.revision_history())
 
182
 
 
183
 
 
184
class TestCommonAncestor(TestCaseInTempDir):
 
185
    """Test checking whether a revision is an ancestor of another revision"""
 
186
 
 
187
    def test_common_ancestor(self):
 
188
        br1, br2 = make_branches()
 
189
        revisions = br1.revision_history()
 
190
        revisions_2 = br2.revision_history()
 
191
        sources = br1
 
192
 
 
193
        expected_ancestors_list = {revisions[3]:(0, 0), 
 
194
                                   revisions[2]:(1, 1),
 
195
                                   revisions_2[4]:(2, 1), 
 
196
                                   revisions[1]:(3, 2),
 
197
                                   revisions_2[3]:(4, 2),
 
198
                                   revisions[0]:(5, 3) }
 
199
        ancestors_list = find_present_ancestors(revisions[3], sources)
 
200
        assert len(expected_ancestors_list) == len(ancestors_list)
 
201
        for key, value in expected_ancestors_list.iteritems():
 
202
            self.assertEqual(ancestors_list[key], value, 
 
203
                              "key %r, %r != %r" % (key, ancestors_list[key],
 
204
                                                    value))
 
205
 
 
206
        self.assertEqual(common_ancestor(revisions[0], revisions[0], sources),
 
207
                          revisions[0])
 
208
        self.assertEqual(common_ancestor(revisions[1], revisions[2], sources),
 
209
                          revisions[1])
 
210
        self.assertEqual(common_ancestor(revisions[1], revisions[1], sources),
 
211
                          revisions[1])
 
212
        self.assertEqual(common_ancestor(revisions[2], revisions_2[4], sources),
 
213
                          revisions[2])
 
214
        self.assertEqual(common_ancestor(revisions[3], revisions_2[4], sources),
 
215
                          revisions_2[4])
 
216
        self.assertEqual(common_ancestor(revisions[4], revisions_2[5], sources),
 
217
                          revisions_2[4])
 
218
        self.assertEqual(common_ancestor(revisions[5], revisions_2[6], sources),
 
219
                          revisions[4])
 
220
        self.assertEqual(common_ancestor(revisions_2[6], revisions[5], sources),
 
221
                          revisions_2[5])
 
222
 
 
223
 
 
224
if __name__ == '__main__':
 
225
    import unittest, sys
 
226
    unittest.main()
 
227