~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_revision.py

  • Committer: Aaron Bentley
  • Date: 2007-12-06 18:20:35 UTC
  • mto: This revision was merged to the branch mainline in revision 3088.
  • Revision ID: abentley@panoramicfeedback.com-20071206182035-fsvtracks7b99c14
Diff handles missing files correctly, with no tracebacks

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# (C) 2005 Canonical Ltd
 
1
# Copyright (C) 2005 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
18
18
import os
19
19
import warnings
20
20
 
 
21
from bzrlib import (
 
22
    revision,
 
23
    )
21
24
from bzrlib.branch import Branch
22
25
from bzrlib.errors import NoSuchRevision
23
 
from bzrlib.graph import Graph
 
26
from bzrlib.deprecated_graph import Graph
24
27
from bzrlib.revision import (find_present_ancestors, combined_graph,
25
28
                             common_ancestor,
26
29
                             is_ancestor, MultipleRevisionSources,
27
30
                             NULL_REVISION)
28
 
from bzrlib.tests import TestCaseWithTransport
 
31
from bzrlib.symbol_versioning import zero_ninetythree
 
32
from bzrlib.tests import TestCase, TestCaseWithTransport
29
33
from bzrlib.trace import mutter
30
34
from bzrlib.workingtree import WorkingTree
31
35
 
36
40
        r'bzrlib\.tests\.test_revision')
37
41
 
38
42
# XXX: Make this a method of a merge base case
39
 
def make_branches(self):
 
43
def make_branches(self, format=None):
40
44
    """Create two branches
41
45
 
42
46
    branch 1 has 6 commits, branch 2 has 3 commits
55
59
    so A is missing b6 at the start
56
60
    and B is missing a3, a4, a5
57
61
    """
58
 
    tree1 = self.make_branch_and_tree("branch1")
 
62
    tree1 = self.make_branch_and_tree("branch1", format=format)
59
63
    br1 = tree1.branch
60
64
    
61
65
    tree1.commit("Commit one", rev_id="a@u-0-0")
67
71
    tree2.commit("Commit four", rev_id="b@u-0-3")
68
72
    tree2.commit("Commit five", rev_id="b@u-0-4")
69
73
    revisions_2 = br2.revision_history()
 
74
    self.assertEquals(revisions_2[-1], 'b@u-0-4')
70
75
    
71
 
    br1.fetch(br2)
72
 
    tree1.add_pending_merge(revisions_2[4])
73
 
    self.assertEquals(revisions_2[4], 'b@u-0-4')
 
76
    tree1.merge_from_branch(br2)
74
77
    tree1.commit("Commit six", rev_id="a@u-0-3")
75
78
    tree1.commit("Commit seven", rev_id="a@u-0-4")
76
79
    tree2.commit("Commit eight", rev_id="b@u-0-5")
 
80
    self.assertEquals(br2.revision_history()[-1], 'b@u-0-5')
77
81
    
78
 
    br1.fetch(br2)
79
 
    tree1.add_pending_merge(br2.revision_history()[5])
 
82
    tree1.merge_from_branch(br2)
80
83
    tree1.commit("Commit nine", rev_id="a@u-0-5")
81
 
    # DO NOT FETCH HERE - we WANT a GHOST.
82
 
    # br2.fetch(br1)
83
 
    tree2.add_pending_merge(br1.revision_history()[4])
 
84
    # DO NOT MERGE HERE - we WANT a GHOST.
 
85
    tree2.add_parent_tree_id(br1.revision_history()[4])
84
86
    tree2.commit("Commit ten - ghost merge", rev_id="b@u-0-6")
85
87
    
86
88
    return br1, br2
131
133
        revisions_2 = br2.revision_history()
132
134
        sources = br1
133
135
 
134
 
        self.assert_(is_ancestor(revisions[0], revisions[0], br1))
135
 
        self.assert_(is_ancestor(revisions[1], revisions[0], sources))
136
 
        self.assert_(not is_ancestor(revisions[0], revisions[1], sources))
137
 
        self.assert_(is_ancestor(revisions_2[3], revisions[0], sources))
 
136
        br1.lock_read()
 
137
        self.addCleanup(br1.unlock)
 
138
        br2.lock_read()
 
139
        self.addCleanup(br2.unlock)
 
140
 
 
141
        self.assertTrue(self.applyDeprecated(zero_ninetythree,
 
142
                        is_ancestor, revisions[0], revisions[0], br1))
 
143
        self.assertTrue(self.applyDeprecated(zero_ninetythree,
 
144
                        is_ancestor, revisions[1], revisions[0], sources))
 
145
        self.assertFalse(self.applyDeprecated(zero_ninetythree,
 
146
                         is_ancestor, revisions[0], revisions[1], sources))
 
147
        self.assertTrue(self.applyDeprecated(zero_ninetythree,
 
148
                        is_ancestor, revisions_2[3], revisions[0], sources))
138
149
        # disabled mbp 20050914, doesn't seem to happen anymore
139
150
        ## self.assertRaises(NoSuchRevision, is_ancestor, revisions_2[3],
140
151
        ##                  revisions[0], br1)        
141
 
        self.assert_(is_ancestor(revisions[3], revisions_2[4], sources))
142
 
        self.assert_(is_ancestor(revisions[3], revisions_2[4], br1))
143
 
        self.assert_(is_ancestor(revisions[3], revisions_2[3], sources))
 
152
        self.assertTrue(self.applyDeprecated(zero_ninetythree,
 
153
                        is_ancestor, revisions[3], revisions_2[4], sources))
 
154
        self.assertTrue(self.applyDeprecated(zero_ninetythree,
 
155
                        is_ancestor, revisions[3], revisions_2[4], br1))
 
156
        self.assertTrue(self.applyDeprecated(zero_ninetythree,
 
157
                        is_ancestor, revisions[3], revisions_2[3], sources))
144
158
        ## self.assert_(not is_ancestor(revisions[3], revisions_2[3], br1))
145
159
 
146
160
 
155
169
        wt2.commit("Commit twelve", rev_id="b@u-0-8")
156
170
        wt2.commit("Commit thirtteen", rev_id="b@u-0-9")
157
171
 
158
 
        self.br1.fetch(self.br2)
159
 
        wt1.add_pending_merge(self.br2.revision_history()[6])
 
172
        wt1.merge_from_branch(self.br2)
160
173
        wt1.commit("Commit fourtten", rev_id="a@u-0-6")
161
174
 
162
 
        self.br2.fetch(self.br1)
163
 
        wt2.add_pending_merge(self.br1.revision_history()[6])
 
175
        wt2.merge_from_branch(self.br1)
164
176
        wt2.commit("Commit fifteen", rev_id="b@u-0-10")
165
177
 
166
178
        from bzrlib.revision import MultipleRevisionSources
235
247
        """
236
248
        br1, br2 = make_branches(self)
237
249
        source = MultipleRevisionSources(br1.repository, br2.repository)
238
 
        combined_1 = combined_graph(br1.last_revision(), 
 
250
        combined_1 = combined_graph(br1.last_revision(),
239
251
                                    br2.last_revision(), source)
240
252
        combined_2 = combined_graph(br2.last_revision(),
241
253
                                    br1.last_revision(), source)
288
300
        # in repo 2, which has A, the revision_graph()
289
301
        # should return A and B both.
290
302
        tree_1 = self.make_branch_and_tree('1')
291
 
        tree_1.add_pending_merge('A')
 
303
        tree_1.set_parent_ids(['A'], allow_leftmost_as_ghost=True)
292
304
        tree_1.commit('foo', rev_id='B', allow_pointless=True)
293
305
        tree_2 = self.make_branch_and_tree('2')
294
306
        tree_2.commit('bar', rev_id='A', allow_pointless=True)
298
310
                          'A':[]},
299
311
                         source.get_revision_graph('B'))
300
312
 
301
 
class TestRevisionAttributes(TestCaseWithTransport):
302
 
    """Test that revision attributes are correct."""
303
 
 
304
 
    def test_revision_accessors(self):
305
 
        """Make sure the values that come out of a revision are the same as the ones that go in.
306
 
        """
307
 
        tree1 = self.make_branch_and_tree("br1")
308
 
 
309
 
        # create a revision
310
 
        tree1.commit(message="quux", allow_pointless=True, committer="jaq")
311
 
        assert len(tree1.branch.revision_history()) > 0
312
 
        rev_a = tree1.branch.repository.get_revision(tree1.branch.last_revision())
313
 
 
314
 
        tree2 = self.make_branch_and_tree("br2")
315
 
        tree2.commit(message=rev_a.message,
316
 
                     timestamp=rev_a.timestamp,
317
 
                     timezone=rev_a.timezone,
318
 
                     committer=rev_a.committer,
319
 
                     rev_id=rev_a.revision_id,
320
 
                     allow_pointless=True, # there's nothing in this commit
321
 
                     strict=True,
322
 
                     verbose=True)
323
 
        rev_b = tree2.branch.repository.get_revision(tree2.branch.last_revision())
324
 
        
325
 
        self.assertEqual(rev_a.message, rev_b.message)
326
 
        self.assertEqual(rev_a.timestamp, rev_b.timestamp)
327
 
        self.assertEqual(rev_a.timezone, rev_b.timezone)
328
 
        self.assertEqual(rev_a.committer, rev_b.committer)
329
 
        self.assertEqual(rev_a.revision_id, rev_b.revision_id)
 
313
 
 
314
class TestReservedId(TestCase):
 
315
 
 
316
    def test_is_reserved_id(self):
 
317
        self.assertEqual(True, revision.is_reserved_id(NULL_REVISION))
 
318
        self.assertEqual(True, revision.is_reserved_id(
 
319
            revision.CURRENT_REVISION))
 
320
        self.assertEqual(True, revision.is_reserved_id('arch:'))
 
321
        self.assertEqual(False, revision.is_reserved_id('null'))
 
322
        self.assertEqual(False, revision.is_reserved_id(
 
323
            'arch:a@example.com/c--b--v--r'))
 
324
        self.assertEqual(False, revision.is_reserved_id(None))
 
325
 
 
326
 
 
327
class TestRevisionMethods(TestCase):
 
328
 
 
329
    def test_get_summary(self):
 
330
        r = revision.Revision('1')
 
331
        r.message = 'a'
 
332
        self.assertEqual('a', r.get_summary())
 
333
        r.message = 'a\nb'
 
334
        self.assertEqual('a', r.get_summary())
 
335
        r.message = '\na\nb'
 
336
        self.assertEqual('a', r.get_summary())
 
337
 
 
338
    def test_get_apparent_author(self):
 
339
        r = revision.Revision('1')
 
340
        r.committer = 'A'
 
341
        self.assertEqual('A', r.get_apparent_author())
 
342
        r.properties['author'] = 'B'
 
343
        self.assertEqual('B', r.get_apparent_author())