~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_commit.py

  • Committer: Jelmer Vernooij
  • Date: 2009-01-28 18:42:55 UTC
  • mto: This revision was merged to the branch mainline in revision 3968.
  • Revision ID: jelmer@samba.org-20090128184255-bdmklkvm83ltk191
Update NEWS

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2008 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
19
19
 
20
20
import bzrlib
21
21
from bzrlib import (
 
22
    bzrdir,
22
23
    errors,
23
24
    lockdir,
24
25
    osutils,
30
31
from bzrlib.config import BranchConfig
31
32
from bzrlib.errors import (PointlessCommit, BzrError, SigningFailed, 
32
33
                           LockContention)
33
 
from bzrlib.tests import TestCaseWithTransport
 
34
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
34
35
from bzrlib.workingtree import WorkingTree
35
36
 
36
37
 
70
71
    def renamed(self, change, old_path, new_path):
71
72
        self.calls.append(('renamed', change, old_path, new_path))
72
73
 
 
74
    def is_verbose(self):
 
75
        return True
 
76
 
73
77
 
74
78
class TestCommit(TestCaseWithTransport):
75
79
 
92
96
        eq(rev.message, 'add hello')
93
97
 
94
98
        tree1 = b.repository.revision_tree(rh[0])
 
99
        tree1.lock_read()
95
100
        text = tree1.get_file_text(file_id)
96
 
        eq(text, 'hello world')
 
101
        tree1.unlock()
 
102
        self.assertEqual('hello world', text)
97
103
 
98
104
        tree2 = b.repository.revision_tree(rh[1])
99
 
        eq(tree2.get_file_text(file_id), 'version 2')
 
105
        tree2.lock_read()
 
106
        text = tree2.get_file_text(file_id)
 
107
        tree2.unlock()
 
108
        self.assertEqual('version 2', text)
100
109
 
101
110
    def test_delete_commit(self):
102
111
        """Test a commit with a deleted file"""
112
121
        tree = b.repository.revision_tree('rev2')
113
122
        self.assertFalse(tree.has_id('hello-id'))
114
123
 
 
124
    def test_partial_commit_move(self):
 
125
        """Test a partial commit where a file was renamed but not committed.
 
126
 
 
127
        https://bugs.launchpad.net/bzr/+bug/83039
 
128
        
 
129
        If not handled properly, commit will try to snapshot
 
130
        dialog.py with olive/ as a parent, while 
 
131
        olive/ has not been snapshotted yet.
 
132
        """
 
133
        wt = self.make_branch_and_tree('.')
 
134
        b = wt.branch
 
135
        self.build_tree(['annotate/', 'annotate/foo.py',
 
136
                         'olive/', 'olive/dialog.py'
 
137
                        ])
 
138
        wt.add(['annotate', 'olive', 'annotate/foo.py', 'olive/dialog.py'])
 
139
        wt.commit(message='add files')
 
140
        wt.rename_one("olive/dialog.py", "aaa")
 
141
        self.build_tree_contents([('annotate/foo.py', 'modified\n')])
 
142
        wt.commit('renamed hello', specific_files=["annotate"])
 
143
 
115
144
    def test_pointless_commit(self):
116
145
        """Commit refuses unless there are changes or it's forced."""
117
146
        wt = self.make_branch_and_tree('.')
165
194
        eq(b.revno(), 3)
166
195
 
167
196
        tree2 = b.repository.revision_tree('test@rev-2')
 
197
        tree2.lock_read()
 
198
        self.addCleanup(tree2.unlock)
168
199
        self.assertTrue(tree2.has_filename('hello'))
169
200
        self.assertEquals(tree2.get_file_text('hello-id'), 'hello')
170
201
        self.assertEquals(tree2.get_file_text('buongia-id'), 'new text')
171
202
        
172
203
        tree3 = b.repository.revision_tree('test@rev-3')
 
204
        tree3.lock_read()
 
205
        self.addCleanup(tree3.unlock)
173
206
        self.assertFalse(tree3.has_filename('hello'))
174
207
        self.assertEquals(tree3.get_file_text('buongia-id'), 'new text')
175
208
 
186
219
 
187
220
        eq = self.assertEquals
188
221
        tree1 = b.repository.revision_tree('test@rev-1')
 
222
        tree1.lock_read()
 
223
        self.addCleanup(tree1.unlock)
189
224
        eq(tree1.id2path('hello-id'), 'hello')
190
225
        eq(tree1.get_file_text('hello-id'), 'contents of hello\n')
191
226
        self.assertFalse(tree1.has_filename('fruity'))
194
229
        eq(ie.revision, 'test@rev-1')
195
230
 
196
231
        tree2 = b.repository.revision_tree('test@rev-2')
 
232
        tree2.lock_read()
 
233
        self.addCleanup(tree2.unlock)
197
234
        eq(tree2.id2path('hello-id'), 'fruity')
198
235
        eq(tree2.get_file_text('hello-id'), 'contents of hello\n')
199
236
        self.check_inventory_shape(tree2.inventory, ['fruity'])
226
263
        wt.lock_read()
227
264
        try:
228
265
            self.check_inventory_shape(wt.read_working_inventory(),
229
 
                                       ['a', 'a/hello', 'b'])
 
266
                                       ['a/', 'a/hello', 'b/'])
230
267
        finally:
231
268
            wt.unlock()
232
269
 
236
273
        wt.lock_read()
237
274
        try:
238
275
            self.check_inventory_shape(wt.read_working_inventory(),
239
 
                                       ['a', 'a/hello', 'a/b'])
 
276
                                       ['a/', 'a/hello', 'a/b/'])
240
277
            self.check_inventory_shape(b.repository.get_revision_inventory(r3),
241
 
                                       ['a', 'a/hello', 'a/b'])
 
278
                                       ['a/', 'a/hello', 'a/b/'])
242
279
        finally:
243
280
            wt.unlock()
244
281
 
248
285
        wt.lock_read()
249
286
        try:
250
287
            self.check_inventory_shape(wt.read_working_inventory(),
251
 
                                       ['a', 'a/b/hello', 'a/b'])
 
288
                                       ['a/', 'a/b/hello', 'a/b/'])
252
289
        finally:
253
290
            wt.unlock()
254
291
 
357
394
                                                      allow_pointless=True,
358
395
                                                      rev_id='B',
359
396
                                                      working_tree=wt)
360
 
            self.assertEqual(Testament.from_revision(branch.repository,
361
 
                             'B').as_short_text(),
 
397
            def sign(text):
 
398
                return bzrlib.gpg.LoopbackGPGStrategy(None).sign(text)
 
399
            self.assertEqual(sign(Testament.from_revision(branch.repository,
 
400
                             'B').as_short_text()),
362
401
                             branch.repository.get_signature_text('B'))
363
402
        finally:
364
403
            bzrlib.gpg.GPGStrategy = oldstrategy
425
464
        bound = master.sprout('bound')
426
465
        wt = bound.open_workingtree()
427
466
        wt.branch.set_bound_location(os.path.realpath('master'))
428
 
 
429
 
        orig_default = lockdir._DEFAULT_TIMEOUT_SECONDS
430
467
        master_branch.lock_write()
431
468
        try:
432
 
            lockdir._DEFAULT_TIMEOUT_SECONDS = 1
433
469
            self.assertRaises(LockContention, wt.commit, 'silly')
434
470
        finally:
435
 
            lockdir._DEFAULT_TIMEOUT_SECONDS = orig_default
436
471
            master_branch.unlock()
437
472
 
438
473
    def test_commit_bound_merge(self):
523
558
            ('change', 'added', 'newdir'),
524
559
            ('change', 'added', 'newfile'),
525
560
            ('renamed', 'renamed', 'dirtorename', 'renameddir'),
 
561
            ('renamed', 'renamed', 'filetorename', 'renamedfile'),
526
562
            ('renamed', 'renamed', 'dirtoreparent', 'renameddir/reparenteddir'),
527
563
            ('renamed', 'renamed', 'filetoreparent', 'renameddir/reparentedfile'),
528
 
            ('renamed', 'renamed', 'filetorename', 'renamedfile'),
529
564
            ('deleted', 'dirtoremove'),
530
565
            ('deleted', 'filetoremove'),
531
566
            ],
579
614
            basis.unlock()
580
615
 
581
616
    def test_commit_kind_changes(self):
582
 
        if not osutils.has_symlinks():
583
 
            raise tests.TestSkipped('Test requires symlink support')
 
617
        self.requireFeature(SymlinkFeature)
584
618
        tree = self.make_branch_and_tree('.')
585
619
        os.symlink('target', 'name')
586
620
        tree.add('name', 'a-file-id')
679
713
        repository.add_inventory = raise_
680
714
        self.assertRaises(errors.NoSuchFile, tree.commit, message_callback=cb)
681
715
        self.assertFalse(cb.called)
 
716
 
 
717
    def test_selected_file_merge_commit(self):
 
718
        """Ensure the correct error is raised"""
 
719
        tree = self.make_branch_and_tree('foo')
 
720
        # pending merge would turn into a left parent
 
721
        tree.commit('commit 1')
 
722
        tree.add_parent_tree_id('example')
 
723
        self.build_tree(['foo/bar', 'foo/baz'])
 
724
        tree.add(['bar', 'baz'])
 
725
        err = self.assertRaises(errors.CannotCommitSelectedFileMerge,
 
726
            tree.commit, 'commit 2', specific_files=['bar', 'baz'])
 
727
        self.assertEqual(['bar', 'baz'], err.files)
 
728
        self.assertEqual('Selected-file commit of merges is not supported'
 
729
                         ' yet: files bar, baz', str(err))
 
730
 
 
731
    def test_commit_ordering(self):
 
732
        """Test of corner-case commit ordering error"""
 
733
        tree = self.make_branch_and_tree('.')
 
734
        self.build_tree(['a/', 'a/z/', 'a/c/', 'a/z/x', 'a/z/y'])
 
735
        tree.add(['a/', 'a/z/', 'a/c/', 'a/z/x', 'a/z/y'])
 
736
        tree.commit('setup')
 
737
        self.build_tree(['a/c/d/'])
 
738
        tree.add('a/c/d')
 
739
        tree.rename_one('a/z/x', 'a/c/d/x')
 
740
        tree.commit('test', specific_files=['a/z/y'])
 
741
 
 
742
    def test_commit_no_author(self):
 
743
        """The default kwarg author in MutableTree.commit should not add
 
744
        the 'author' revision property.
 
745
        """
 
746
        tree = self.make_branch_and_tree('foo')
 
747
        rev_id = tree.commit('commit 1')
 
748
        rev = tree.branch.repository.get_revision(rev_id)
 
749
        self.assertFalse('author' in rev.properties)
 
750
 
 
751
    def test_commit_author(self):
 
752
        """Passing a non-empty author kwarg to MutableTree.commit should add
 
753
        the 'author' revision property.
 
754
        """
 
755
        tree = self.make_branch_and_tree('foo')
 
756
        rev_id = tree.commit('commit 1', author='John Doe <jdoe@example.com>')
 
757
        rev = tree.branch.repository.get_revision(rev_id)
 
758
        self.assertEqual('John Doe <jdoe@example.com>',
 
759
                         rev.properties['author'])
 
760
 
 
761
    def test_commit_with_checkout_and_branch_sharing_repo(self):
 
762
        repo = self.make_repository('repo', shared=True)
 
763
        # make_branch_and_tree ignores shared repos
 
764
        branch = bzrdir.BzrDir.create_branch_convenience('repo/branch')
 
765
        tree2 = branch.create_checkout('repo/tree2')
 
766
        tree2.commit('message', rev_id='rev1')
 
767
        self.assertTrue(tree2.branch.repository.has_revision('rev1'))