~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/testrevision.py

  • Committer: Martin Pool
  • Date: 2005-06-28 14:16:10 UTC
  • mto: This revision was merged to the branch mainline in revision 852.
  • Revision ID: mbp@sourcefrog.net-20050628141610-115ba94de0dfd742
doc

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