~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_commit.py

  • Committer: Andrew Bennetts
  • Date: 2007-03-26 06:24:01 UTC
  • mto: This revision was merged to the branch mainline in revision 2376.
  • Revision ID: andrew.bennetts@canonical.com-20070326062401-k3nbefzje5332jaf
Deal with review comments from Robert:

  * Add my name to the NEWS file
  * Move the test case to a new module in branch_implementations
  * Remove revision_history cruft from identitymap and test_identitymap
  * Improve some docstrings

Also, this fixes a bug where revision_history was not returning a copy of the
cached data, allowing the cache to be corrupted.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2008 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 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,
23
22
    errors,
24
23
    lockdir,
25
24
    osutils,
31
30
from bzrlib.config import BranchConfig
32
31
from bzrlib.errors import (PointlessCommit, BzrError, SigningFailed, 
33
32
                           LockContention)
34
 
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
 
33
from bzrlib.tests import TestCaseWithTransport
35
34
from bzrlib.workingtree import WorkingTree
36
35
 
37
36
 
71
70
    def renamed(self, change, old_path, new_path):
72
71
        self.calls.append(('renamed', change, old_path, new_path))
73
72
 
74
 
    def is_verbose(self):
75
 
        return True
76
 
 
77
73
 
78
74
class TestCommit(TestCaseWithTransport):
79
75
 
96
92
        eq(rev.message, 'add hello')
97
93
 
98
94
        tree1 = b.repository.revision_tree(rh[0])
99
 
        tree1.lock_read()
100
95
        text = tree1.get_file_text(file_id)
101
 
        tree1.unlock()
102
 
        self.assertEqual('hello world', text)
 
96
        eq(text, 'hello world')
103
97
 
104
98
        tree2 = b.repository.revision_tree(rh[1])
105
 
        tree2.lock_read()
106
 
        text = tree2.get_file_text(file_id)
107
 
        tree2.unlock()
108
 
        self.assertEqual('version 2', text)
 
99
        eq(tree2.get_file_text(file_id), 'version 2')
109
100
 
110
101
    def test_delete_commit(self):
111
102
        """Test a commit with a deleted file"""
121
112
        tree = b.repository.revision_tree('rev2')
122
113
        self.assertFalse(tree.has_id('hello-id'))
123
114
 
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
 
 
144
115
    def test_pointless_commit(self):
145
116
        """Commit refuses unless there are changes or it's forced."""
146
117
        wt = self.make_branch_and_tree('.')
194
165
        eq(b.revno(), 3)
195
166
 
196
167
        tree2 = b.repository.revision_tree('test@rev-2')
197
 
        tree2.lock_read()
198
 
        self.addCleanup(tree2.unlock)
199
168
        self.assertTrue(tree2.has_filename('hello'))
200
169
        self.assertEquals(tree2.get_file_text('hello-id'), 'hello')
201
170
        self.assertEquals(tree2.get_file_text('buongia-id'), 'new text')
202
171
        
203
172
        tree3 = b.repository.revision_tree('test@rev-3')
204
 
        tree3.lock_read()
205
 
        self.addCleanup(tree3.unlock)
206
173
        self.assertFalse(tree3.has_filename('hello'))
207
174
        self.assertEquals(tree3.get_file_text('buongia-id'), 'new text')
208
175
 
219
186
 
220
187
        eq = self.assertEquals
221
188
        tree1 = b.repository.revision_tree('test@rev-1')
222
 
        tree1.lock_read()
223
 
        self.addCleanup(tree1.unlock)
224
189
        eq(tree1.id2path('hello-id'), 'hello')
225
190
        eq(tree1.get_file_text('hello-id'), 'contents of hello\n')
226
191
        self.assertFalse(tree1.has_filename('fruity'))
229
194
        eq(ie.revision, 'test@rev-1')
230
195
 
231
196
        tree2 = b.repository.revision_tree('test@rev-2')
232
 
        tree2.lock_read()
233
 
        self.addCleanup(tree2.unlock)
234
197
        eq(tree2.id2path('hello-id'), 'fruity')
235
198
        eq(tree2.get_file_text('hello-id'), 'contents of hello\n')
236
199
        self.check_inventory_shape(tree2.inventory, ['fruity'])
263
226
        wt.lock_read()
264
227
        try:
265
228
            self.check_inventory_shape(wt.read_working_inventory(),
266
 
                                       ['a/', 'a/hello', 'b/'])
 
229
                                       ['a', 'a/hello', 'b'])
267
230
        finally:
268
231
            wt.unlock()
269
232
 
273
236
        wt.lock_read()
274
237
        try:
275
238
            self.check_inventory_shape(wt.read_working_inventory(),
276
 
                                       ['a/', 'a/hello', 'a/b/'])
 
239
                                       ['a', 'a/hello', 'a/b'])
277
240
            self.check_inventory_shape(b.repository.get_revision_inventory(r3),
278
 
                                       ['a/', 'a/hello', 'a/b/'])
 
241
                                       ['a', 'a/hello', 'a/b'])
279
242
        finally:
280
243
            wt.unlock()
281
244
 
285
248
        wt.lock_read()
286
249
        try:
287
250
            self.check_inventory_shape(wt.read_working_inventory(),
288
 
                                       ['a/', 'a/b/hello', 'a/b/'])
 
251
                                       ['a', 'a/b/hello', 'a/b'])
289
252
        finally:
290
253
            wt.unlock()
291
254
 
464
427
        bound = master.sprout('bound')
465
428
        wt = bound.open_workingtree()
466
429
        wt.branch.set_bound_location(os.path.realpath('master'))
 
430
 
 
431
        orig_default = lockdir._DEFAULT_TIMEOUT_SECONDS
467
432
        master_branch.lock_write()
468
433
        try:
 
434
            lockdir._DEFAULT_TIMEOUT_SECONDS = 1
469
435
            self.assertRaises(LockContention, wt.commit, 'silly')
470
436
        finally:
 
437
            lockdir._DEFAULT_TIMEOUT_SECONDS = orig_default
471
438
            master_branch.unlock()
472
439
 
473
440
    def test_commit_bound_merge(self):
558
525
            ('change', 'added', 'newdir'),
559
526
            ('change', 'added', 'newfile'),
560
527
            ('renamed', 'renamed', 'dirtorename', 'renameddir'),
561
 
            ('renamed', 'renamed', 'filetorename', 'renamedfile'),
562
528
            ('renamed', 'renamed', 'dirtoreparent', 'renameddir/reparenteddir'),
563
529
            ('renamed', 'renamed', 'filetoreparent', 'renameddir/reparentedfile'),
 
530
            ('renamed', 'renamed', 'filetorename', 'renamedfile'),
564
531
            ('deleted', 'dirtoremove'),
565
532
            ('deleted', 'filetoremove'),
566
533
            ],
614
581
            basis.unlock()
615
582
 
616
583
    def test_commit_kind_changes(self):
617
 
        self.requireFeature(SymlinkFeature)
 
584
        if not osutils.has_symlinks():
 
585
            raise tests.TestSkipped('Test requires symlink support')
618
586
        tree = self.make_branch_and_tree('.')
619
587
        os.symlink('target', 'name')
620
588
        tree.add('name', 'a-file-id')
713
681
        repository.add_inventory = raise_
714
682
        self.assertRaises(errors.NoSuchFile, tree.commit, message_callback=cb)
715
683
        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'))