~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_commit.py

Streamline _walkdirs_utf8 for utf8 file systems, reducing time to traverse a mozilla tree from 1s to .6 seconds. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
18
import os
29
29
from bzrlib.bzrdir import BzrDir, BzrDirMetaFormat1
30
30
from bzrlib.commit import Commit, NullCommitReporter
31
31
from bzrlib.config import BranchConfig
32
 
from bzrlib.errors import (PointlessCommit, BzrError, SigningFailed,
 
32
from bzrlib.errors import (PointlessCommit, BzrError, SigningFailed, 
33
33
                           LockContention)
34
34
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
35
35
from bzrlib.workingtree import WorkingTree
107
107
        tree2.unlock()
108
108
        self.assertEqual('version 2', text)
109
109
 
110
 
    def test_missing_commit(self):
111
 
        """Test a commit with a missing file"""
 
110
    def test_delete_commit(self):
 
111
        """Test a commit with a deleted file"""
112
112
        wt = self.make_branch_and_tree('.')
113
113
        b = wt.branch
114
114
        file('hello', 'w').write('hello world')
125
125
        """Test a partial commit where a file was renamed but not committed.
126
126
 
127
127
        https://bugs.launchpad.net/bzr/+bug/83039
128
 
 
 
128
        
129
129
        If not handled properly, commit will try to snapshot
130
 
        dialog.py with olive/ as a parent, while
 
130
        dialog.py with olive/ as a parent, while 
131
131
        olive/ has not been snapshotted yet.
132
132
        """
133
133
        wt = self.make_branch_and_tree('.')
154
154
                          message='fails',
155
155
                          allow_pointless=False)
156
156
        self.assertEquals(b.revno(), 1)
157
 
 
 
157
        
158
158
    def test_commit_empty(self):
159
159
        """Commiting an empty tree works."""
160
160
        wt = self.make_branch_and_tree('.')
177
177
              ['hello-id', 'buongia-id'])
178
178
        wt.commit(message='add files',
179
179
                 rev_id='test@rev-1')
180
 
 
 
180
        
181
181
        os.remove('hello')
182
182
        file('buongia', 'w').write('new text')
183
183
        wt.commit(message='update text',
199
199
        self.assertTrue(tree2.has_filename('hello'))
200
200
        self.assertEquals(tree2.get_file_text('hello-id'), 'hello')
201
201
        self.assertEquals(tree2.get_file_text('buongia-id'), 'new text')
202
 
 
 
202
        
203
203
        tree3 = b.repository.revision_tree('test@rev-3')
204
204
        tree3.lock_read()
205
205
        self.addCleanup(tree3.unlock)
274
274
        try:
275
275
            self.check_inventory_shape(wt.read_working_inventory(),
276
276
                                       ['a/', 'a/hello', 'a/b/'])
277
 
            self.check_inventory_shape(b.repository.get_inventory(r3),
 
277
            self.check_inventory_shape(b.repository.get_revision_inventory(r3),
278
278
                                       ['a/', 'a/hello', 'a/b/'])
279
279
        finally:
280
280
            wt.unlock()
289
289
        finally:
290
290
            wt.unlock()
291
291
 
292
 
        inv = b.repository.get_inventory(r4)
 
292
        inv = b.repository.get_revision_inventory(r4)
293
293
        eq(inv['hello-id'].revision, r4)
294
294
        eq(inv['a-id'].revision, r1)
295
295
        eq(inv['b-id'].revision, r3)
484
484
        other_bzrdir = master_branch.bzrdir.sprout('other')
485
485
        other_tree = other_bzrdir.open_workingtree()
486
486
 
487
 
        # do a commit to the other branch changing the content file so
 
487
        # do a commit to the the other branch changing the content file so
488
488
        # that our commit after merging will have a merged revision in the
489
489
        # content file history.
490
490
        self.build_tree_contents([('other/content_file', 'change in other\n')])
501
501
        bound_tree.commit(message='commit of merge in bound tree')
502
502
 
503
503
    def test_commit_reporting_after_merge(self):
504
 
        # when doing a commit of a merge, the reporter needs to still
 
504
        # when doing a commit of a merge, the reporter needs to still 
505
505
        # be called for each item that is added/removed/deleted.
506
506
        this_tree = self.make_branch_and_tree('this')
507
507
        # we need a bunch of files and dirs, to perform one action on each.
550
550
        this_tree.merge_from_branch(other_tree.branch)
551
551
        reporter = CapturingReporter()
552
552
        this_tree.commit('do the commit', reporter=reporter)
553
 
        expected = set([
 
553
        self.assertEqual([
 
554
            ('change', 'unchanged', ''),
 
555
            ('change', 'unchanged', 'dirtoleave'),
 
556
            ('change', 'unchanged', 'filetoleave'),
554
557
            ('change', 'modified', 'filetomodify'),
555
558
            ('change', 'added', 'newdir'),
556
559
            ('change', 'added', 'newfile'),
560
563
            ('renamed', 'renamed', 'filetoreparent', 'renameddir/reparentedfile'),
561
564
            ('deleted', 'dirtoremove'),
562
565
            ('deleted', 'filetoremove'),
563
 
            ])
564
 
        result = set(reporter.calls)
565
 
        missing = expected - result
566
 
        new = result - expected
567
 
        self.assertEqual((set(), set()), (missing, new))
 
566
            ],
 
567
            reporter.calls)
568
568
 
569
569
    def test_commit_removals_respects_filespec(self):
570
570
        """Commit respects the specified_files for removals."""
660
660
    def test_commit_unversioned_specified(self):
661
661
        """Commit should raise if specified files isn't in basis or worktree"""
662
662
        tree = self.make_branch_and_tree('.')
663
 
        self.assertRaises(errors.PathsNotVersionedError, tree.commit,
 
663
        self.assertRaises(errors.PathsNotVersionedError, tree.commit, 
664
664
                          'message', specific_files=['bogus'])
665
665
 
666
666
    class Callback(object):
667
 
 
 
667
        
668
668
        def __init__(self, message, testcase):
669
669
            self.called = False
670
670
            self.message = message
698
698
        """Callback should not be invoked for pointless commit"""
699
699
        tree = self.make_branch_and_tree('.')
700
700
        cb = self.Callback(u'commit 2', self)
701
 
        self.assertRaises(PointlessCommit, tree.commit, message_callback=cb,
 
701
        self.assertRaises(PointlessCommit, tree.commit, message_callback=cb, 
702
702
                          allow_pointless=False)
703
703
        self.assertFalse(cb.called)
704
704
 
708
708
        cb = self.Callback(u'commit 2', self)
709
709
        repository = tree.branch.repository
710
710
        # simulate network failure
711
 
        def raise_(self, arg, arg2, arg3=None, arg4=None):
 
711
        def raise_(self, arg, arg2):
712
712
            raise errors.NoSuchFile('foo')
713
713
        repository.add_inventory = raise_
714
 
        repository.add_inventory_by_delta = raise_
715
714
        self.assertRaises(errors.NoSuchFile, tree.commit, message_callback=cb)
716
715
        self.assertFalse(cb.called)
717
716
 
739
738
        tree.add('a/c/d')
740
739
        tree.rename_one('a/z/x', 'a/c/d/x')
741
740
        tree.commit('test', specific_files=['a/z/y'])
742
 
 
 
741
 
743
742
    def test_commit_no_author(self):
744
743
        """The default kwarg author in MutableTree.commit should not add
745
744
        the 'author' revision property.
748
747
        rev_id = tree.commit('commit 1')
749
748
        rev = tree.branch.repository.get_revision(rev_id)
750
749
        self.assertFalse('author' in rev.properties)
751
 
        self.assertFalse('authors' in rev.properties)
752
750
 
753
751
    def test_commit_author(self):
754
752
        """Passing a non-empty author kwarg to MutableTree.commit should add
755
753
        the 'author' revision property.
756
754
        """
757
755
        tree = self.make_branch_and_tree('foo')
758
 
        rev_id = self.callDeprecated(['The parameter author was '
759
 
                'deprecated in version 1.13. Use authors instead'],
760
 
                tree.commit, 'commit 1', author='John Doe <jdoe@example.com>')
 
756
        rev_id = tree.commit('commit 1', author='John Doe <jdoe@example.com>')
761
757
        rev = tree.branch.repository.get_revision(rev_id)
762
758
        self.assertEqual('John Doe <jdoe@example.com>',
763
 
                         rev.properties['authors'])
764
 
        self.assertFalse('author' in rev.properties)
765
 
 
766
 
    def test_commit_empty_authors_list(self):
767
 
        """Passing an empty list to authors shouldn't add the property."""
768
 
        tree = self.make_branch_and_tree('foo')
769
 
        rev_id = tree.commit('commit 1', authors=[])
770
 
        rev = tree.branch.repository.get_revision(rev_id)
771
 
        self.assertFalse('author' in rev.properties)
772
 
        self.assertFalse('authors' in rev.properties)
773
 
 
774
 
    def test_multiple_authors(self):
775
 
        tree = self.make_branch_and_tree('foo')
776
 
        rev_id = tree.commit('commit 1',
777
 
                authors=['John Doe <jdoe@example.com>',
778
 
                         'Jane Rey <jrey@example.com>'])
779
 
        rev = tree.branch.repository.get_revision(rev_id)
780
 
        self.assertEqual('John Doe <jdoe@example.com>\n'
781
 
                'Jane Rey <jrey@example.com>', rev.properties['authors'])
782
 
        self.assertFalse('author' in rev.properties)
783
 
 
784
 
    def test_author_and_authors_incompatible(self):
785
 
        tree = self.make_branch_and_tree('foo')
786
 
        self.assertRaises(AssertionError, tree.commit, 'commit 1',
787
 
                authors=['John Doe <jdoe@example.com>',
788
 
                         'Jane Rey <jrey@example.com>'],
789
 
                author="Jack Me <jme@example.com>")
790
 
 
791
 
    def test_author_with_newline_rejected(self):
792
 
        tree = self.make_branch_and_tree('foo')
793
 
        self.assertRaises(AssertionError, tree.commit, 'commit 1',
794
 
                authors=['John\nDoe <jdoe@example.com>'])
 
759
                         rev.properties['author'])
795
760
 
796
761
    def test_commit_with_checkout_and_branch_sharing_repo(self):
797
762
        repo = self.make_repository('repo', shared=True)