~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_commit.py

Merge bzr.dev, update to use new hooks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2011 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
21
21
from bzrlib import (
22
22
    bzrdir,
23
23
    errors,
24
 
    lockdir,
25
 
    osutils,
26
 
    tests,
27
24
    )
28
25
from bzrlib.branch import Branch
29
 
from bzrlib.bzrdir import BzrDir, BzrDirMetaFormat1
 
26
from bzrlib.bzrdir import BzrDirMetaFormat1
30
27
from bzrlib.commit import Commit, NullCommitReporter
31
28
from bzrlib.config import BranchConfig
32
 
from bzrlib.errors import (PointlessCommit, BzrError, SigningFailed,
33
 
                           LockContention)
34
 
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
35
 
from bzrlib.workingtree import WorkingTree
 
29
from bzrlib.errors import (
 
30
    PointlessCommit,
 
31
    BzrError,
 
32
    SigningFailed,
 
33
    LockContention,
 
34
    )
 
35
from bzrlib.tests import (
 
36
    TestCaseWithTransport,
 
37
    test_foreign,
 
38
    )
 
39
from bzrlib.tests.features import (
 
40
    SymlinkFeature,
 
41
    )
 
42
from bzrlib.tests.matchers import MatchesAncestry
36
43
 
37
44
 
38
45
# TODO: Test commit with some added, and added-but-missing files
83
90
        b = wt.branch
84
91
        file('hello', 'w').write('hello world')
85
92
        wt.add('hello')
86
 
        wt.commit(message='add hello')
 
93
        rev1 = wt.commit(message='add hello')
87
94
        file_id = wt.path2id('hello')
88
95
 
89
96
        file('hello', 'w').write('version 2')
90
 
        wt.commit(message='commit 2')
 
97
        rev2 = wt.commit(message='commit 2')
91
98
 
92
99
        eq = self.assertEquals
93
100
        eq(b.revno(), 2)
94
 
        rh = b.revision_history()
95
 
        rev = b.repository.get_revision(rh[0])
 
101
        rev = b.repository.get_revision(rev1)
96
102
        eq(rev.message, 'add hello')
97
103
 
98
 
        tree1 = b.repository.revision_tree(rh[0])
 
104
        tree1 = b.repository.revision_tree(rev1)
99
105
        tree1.lock_read()
100
106
        text = tree1.get_file_text(file_id)
101
107
        tree1.unlock()
102
108
        self.assertEqual('hello world', text)
103
109
 
104
 
        tree2 = b.repository.revision_tree(rh[1])
 
110
        tree2 = b.repository.revision_tree(rev2)
105
111
        tree2.lock_read()
106
112
        text = tree2.get_file_text(file_id)
107
113
        tree2.unlock()
108
114
        self.assertEqual('version 2', text)
109
115
 
 
116
    def test_commit_lossy_native(self):
 
117
        """Attempt a lossy commit to a native branch."""
 
118
        wt = self.make_branch_and_tree('.')
 
119
        b = wt.branch
 
120
        file('hello', 'w').write('hello world')
 
121
        wt.add('hello')
 
122
        revid = wt.commit(message='add hello', rev_id='revid', lossy=True)
 
123
        self.assertEquals('revid', revid)
 
124
 
 
125
    def test_commit_lossy_foreign(self):
 
126
        """Attempt a lossy commit to a foreign branch."""
 
127
        test_foreign.register_dummy_foreign_for_test(self)
 
128
        wt = self.make_branch_and_tree('.',
 
129
            format=test_foreign.DummyForeignVcsDirFormat())
 
130
        b = wt.branch
 
131
        file('hello', 'w').write('hello world')
 
132
        wt.add('hello')
 
133
        revid = wt.commit(message='add hello', lossy=True,
 
134
            timestamp=1302659388, timezone=0)
 
135
        self.assertEquals('dummy-v1:1302659388.0-0-UNKNOWN', revid)
 
136
 
 
137
    def test_commit_bound_lossy_foreign(self):
 
138
        """Attempt a lossy commit to a bzr branch bound to a foreign branch."""
 
139
        test_foreign.register_dummy_foreign_for_test(self)
 
140
        foreign_branch = self.make_branch('foreign',
 
141
            format=test_foreign.DummyForeignVcsDirFormat())
 
142
        wt = foreign_branch.create_checkout("local")
 
143
        b = wt.branch
 
144
        file('local/hello', 'w').write('hello world')
 
145
        wt.add('hello')
 
146
        revid = wt.commit(message='add hello', lossy=True,
 
147
            timestamp=1302659388, timezone=0)
 
148
        self.assertEquals('dummy-v1:1302659388.0-0-0', revid)
 
149
        self.assertEquals('dummy-v1:1302659388.0-0-0',
 
150
            foreign_branch.last_revision())
 
151
        self.assertEquals('dummy-v1:1302659388.0-0-0',
 
152
            wt.branch.last_revision())
 
153
 
110
154
    def test_missing_commit(self):
111
155
        """Test a commit with a missing file"""
112
156
        wt = self.make_branch_and_tree('.')
116
160
        wt.commit(message='add hello')
117
161
 
118
162
        os.remove('hello')
119
 
        wt.commit('removed hello', rev_id='rev2')
 
163
        reporter = CapturingReporter()
 
164
        wt.commit('removed hello', rev_id='rev2', reporter=reporter)
 
165
        self.assertEquals(
 
166
            [('missing', u'hello'), ('deleted', u'hello')],
 
167
            reporter.calls)
120
168
 
121
169
        tree = b.repository.revision_tree('rev2')
122
170
        self.assertFalse(tree.has_id('hello-id'))
224
272
        eq(tree1.id2path('hello-id'), 'hello')
225
273
        eq(tree1.get_file_text('hello-id'), 'contents of hello\n')
226
274
        self.assertFalse(tree1.has_filename('fruity'))
227
 
        self.check_inventory_shape(tree1.inventory, ['hello'])
228
 
        ie = tree1.inventory['hello-id']
229
 
        eq(ie.revision, 'test@rev-1')
 
275
        self.check_tree_shape(tree1, ['hello'])
 
276
        eq(tree1.get_file_revision('hello-id'), 'test@rev-1')
230
277
 
231
278
        tree2 = b.repository.revision_tree('test@rev-2')
232
279
        tree2.lock_read()
233
280
        self.addCleanup(tree2.unlock)
234
281
        eq(tree2.id2path('hello-id'), 'fruity')
235
282
        eq(tree2.get_file_text('hello-id'), 'contents of hello\n')
236
 
        self.check_inventory_shape(tree2.inventory, ['fruity'])
237
 
        ie = tree2.inventory['hello-id']
238
 
        eq(ie.revision, 'test@rev-2')
 
283
        self.check_tree_shape(tree2, ['fruity'])
 
284
        eq(tree2.get_file_revision('hello-id'), 'test@rev-2')
239
285
 
240
286
    def test_reused_rev_id(self):
241
287
        """Test that a revision id cannot be reused in a branch"""
262
308
        wt.commit('two', rev_id=r2, allow_pointless=False)
263
309
        wt.lock_read()
264
310
        try:
265
 
            self.check_inventory_shape(wt.read_working_inventory(),
266
 
                                       ['a/', 'a/hello', 'b/'])
 
311
            self.check_tree_shape(wt, ['a/', 'a/hello', 'b/'])
267
312
        finally:
268
313
            wt.unlock()
269
314
 
272
317
        wt.commit('three', rev_id=r3, allow_pointless=False)
273
318
        wt.lock_read()
274
319
        try:
275
 
            self.check_inventory_shape(wt.read_working_inventory(),
 
320
            self.check_tree_shape(wt,
276
321
                                       ['a/', 'a/hello', 'a/b/'])
277
 
            self.check_inventory_shape(b.repository.get_inventory(r3),
 
322
            self.check_tree_shape(b.repository.revision_tree(r3),
278
323
                                       ['a/', 'a/hello', 'a/b/'])
279
324
        finally:
280
325
            wt.unlock()
284
329
        wt.commit('four', rev_id=r4, allow_pointless=False)
285
330
        wt.lock_read()
286
331
        try:
287
 
            self.check_inventory_shape(wt.read_working_inventory(),
288
 
                                       ['a/', 'a/b/hello', 'a/b/'])
 
332
            self.check_tree_shape(wt, ['a/', 'a/b/hello', 'a/b/'])
289
333
        finally:
290
334
            wt.unlock()
291
335
 
320
364
            rev_ids.append(rev_id)
321
365
            wt.commit(message='rev %d' % (i+1),
322
366
                     rev_id=rev_id)
323
 
        eq = self.assertEquals
324
 
        eq(b.revision_history(), rev_ids)
325
367
        for i in range(4):
326
 
            anc = b.repository.get_ancestry(rev_ids[i])
327
 
            eq(anc, [None] + rev_ids[:i+1])
 
368
            self.assertThat(rev_ids[:i+1],
 
369
                MatchesAncestry(b.repository, rev_ids[i]))
328
370
 
329
371
    def test_commit_new_subdir_child_selective(self):
330
372
        wt = self.make_branch_and_tree('.')
353
395
    def test_strict_commit_without_unknowns(self):
354
396
        """Try and commit with no unknown files and strict = True,
355
397
        should work."""
356
 
        from bzrlib.errors import StrictCommitFailed
357
398
        wt = self.make_branch_and_tree('.')
358
399
        b = wt.branch
359
400
        file('hello', 'w').write('hello world')
385
426
        wt = self.make_branch_and_tree('.')
386
427
        branch = wt.branch
387
428
        wt.commit("base", allow_pointless=True, rev_id='A')
388
 
        self.failIf(branch.repository.has_signature_for_revision_id('A'))
 
429
        self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
389
430
        try:
390
431
            from bzrlib.testament import Testament
391
432
            # monkey patch gpg signing mechanism
409
450
        wt = self.make_branch_and_tree('.')
410
451
        branch = wt.branch
411
452
        wt.commit("base", allow_pointless=True, rev_id='A')
412
 
        self.failIf(branch.repository.has_signature_for_revision_id('A'))
 
453
        self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
413
454
        try:
414
 
            from bzrlib.testament import Testament
415
455
            # monkey patch gpg signing mechanism
416
456
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.DisabledGPGStrategy
417
457
            config = MustSignConfig(branch)
422
462
                              rev_id='B',
423
463
                              working_tree=wt)
424
464
            branch = Branch.open(self.get_url('.'))
425
 
            self.assertEqual(branch.revision_history(), ['A'])
426
 
            self.failIf(branch.repository.has_revision('B'))
 
465
            self.assertEqual(branch.last_revision(), 'A')
 
466
            self.assertFalse(branch.repository.has_revision('B'))
427
467
        finally:
428
468
            bzrlib.gpg.GPGStrategy = oldstrategy
429
469