~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_commit.py

  • Committer: Ian Clatworthy
  • Date: 2007-12-07 04:21:59 UTC
  • mto: This revision was merged to the branch mainline in revision 3092.
  • Revision ID: ian.clatworthy@internode.on.net-20071207042159-n9rmhanqid1l7olh
Better PDF for Qiock Start Card (Ian Clatworthy)

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
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
19
19
 
20
20
import bzrlib
21
21
from bzrlib import (
22
 
    bzrdir,
23
22
    errors,
24
23
    lockdir,
25
24
    osutils,
29
28
from bzrlib.bzrdir import BzrDir, BzrDirMetaFormat1
30
29
from bzrlib.commit import Commit, NullCommitReporter
31
30
from bzrlib.config import BranchConfig
32
 
from bzrlib.errors import (PointlessCommit, BzrError, SigningFailed,
 
31
from bzrlib.errors import (PointlessCommit, BzrError, SigningFailed, 
33
32
                           LockContention)
34
33
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
35
34
from bzrlib.workingtree import WorkingTree
107
106
        tree2.unlock()
108
107
        self.assertEqual('version 2', text)
109
108
 
110
 
    def test_missing_commit(self):
111
 
        """Test a commit with a missing file"""
 
109
    def test_delete_commit(self):
 
110
        """Test a commit with a deleted file"""
112
111
        wt = self.make_branch_and_tree('.')
113
112
        b = wt.branch
114
113
        file('hello', 'w').write('hello world')
121
120
        tree = b.repository.revision_tree('rev2')
122
121
        self.assertFalse(tree.has_id('hello-id'))
123
122
 
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
123
    def test_pointless_commit(self):
145
124
        """Commit refuses unless there are changes or it's forced."""
146
125
        wt = self.make_branch_and_tree('.')
154
133
                          message='fails',
155
134
                          allow_pointless=False)
156
135
        self.assertEquals(b.revno(), 1)
157
 
 
 
136
        
158
137
    def test_commit_empty(self):
159
138
        """Commiting an empty tree works."""
160
139
        wt = self.make_branch_and_tree('.')
177
156
              ['hello-id', 'buongia-id'])
178
157
        wt.commit(message='add files',
179
158
                 rev_id='test@rev-1')
180
 
 
 
159
        
181
160
        os.remove('hello')
182
161
        file('buongia', 'w').write('new text')
183
162
        wt.commit(message='update text',
199
178
        self.assertTrue(tree2.has_filename('hello'))
200
179
        self.assertEquals(tree2.get_file_text('hello-id'), 'hello')
201
180
        self.assertEquals(tree2.get_file_text('buongia-id'), 'new text')
202
 
 
 
181
        
203
182
        tree3 = b.repository.revision_tree('test@rev-3')
204
183
        tree3.lock_read()
205
184
        self.addCleanup(tree3.unlock)
464
443
        bound = master.sprout('bound')
465
444
        wt = bound.open_workingtree()
466
445
        wt.branch.set_bound_location(os.path.realpath('master'))
 
446
 
 
447
        orig_default = lockdir._DEFAULT_TIMEOUT_SECONDS
467
448
        master_branch.lock_write()
468
449
        try:
 
450
            lockdir._DEFAULT_TIMEOUT_SECONDS = 1
469
451
            self.assertRaises(LockContention, wt.commit, 'silly')
470
452
        finally:
 
453
            lockdir._DEFAULT_TIMEOUT_SECONDS = orig_default
471
454
            master_branch.unlock()
472
455
 
473
456
    def test_commit_bound_merge(self):
501
484
        bound_tree.commit(message='commit of merge in bound tree')
502
485
 
503
486
    def test_commit_reporting_after_merge(self):
504
 
        # when doing a commit of a merge, the reporter needs to still
 
487
        # when doing a commit of a merge, the reporter needs to still 
505
488
        # be called for each item that is added/removed/deleted.
506
489
        this_tree = self.make_branch_and_tree('this')
507
490
        # we need a bunch of files and dirs, to perform one action on each.
550
533
        this_tree.merge_from_branch(other_tree.branch)
551
534
        reporter = CapturingReporter()
552
535
        this_tree.commit('do the commit', reporter=reporter)
553
 
        expected = set([
 
536
        self.assertEqual([
 
537
            ('change', 'unchanged', ''),
 
538
            ('change', 'unchanged', 'dirtoleave'),
 
539
            ('change', 'unchanged', 'filetoleave'),
554
540
            ('change', 'modified', 'filetomodify'),
555
541
            ('change', 'added', 'newdir'),
556
542
            ('change', 'added', 'newfile'),
560
546
            ('renamed', 'renamed', 'filetoreparent', 'renameddir/reparentedfile'),
561
547
            ('deleted', 'dirtoremove'),
562
548
            ('deleted', 'filetoremove'),
563
 
            ])
564
 
        result = set(reporter.calls)
565
 
        missing = expected - result
566
 
        new = result - expected
567
 
        self.assertEqual((set(), set()), (missing, new))
 
549
            ],
 
550
            reporter.calls)
568
551
 
569
552
    def test_commit_removals_respects_filespec(self):
570
553
        """Commit respects the specified_files for removals."""
660
643
    def test_commit_unversioned_specified(self):
661
644
        """Commit should raise if specified files isn't in basis or worktree"""
662
645
        tree = self.make_branch_and_tree('.')
663
 
        self.assertRaises(errors.PathsNotVersionedError, tree.commit,
 
646
        self.assertRaises(errors.PathsNotVersionedError, tree.commit, 
664
647
                          'message', specific_files=['bogus'])
665
648
 
666
649
    class Callback(object):
667
 
 
 
650
        
668
651
        def __init__(self, message, testcase):
669
652
            self.called = False
670
653
            self.message = message
698
681
        """Callback should not be invoked for pointless commit"""
699
682
        tree = self.make_branch_and_tree('.')
700
683
        cb = self.Callback(u'commit 2', self)
701
 
        self.assertRaises(PointlessCommit, tree.commit, message_callback=cb,
 
684
        self.assertRaises(PointlessCommit, tree.commit, message_callback=cb, 
702
685
                          allow_pointless=False)
703
686
        self.assertFalse(cb.called)
704
687
 
708
691
        cb = self.Callback(u'commit 2', self)
709
692
        repository = tree.branch.repository
710
693
        # simulate network failure
711
 
        def raise_(self, arg, arg2, arg3=None, arg4=None):
 
694
        def raise_(self, arg, arg2):
712
695
            raise errors.NoSuchFile('foo')
713
696
        repository.add_inventory = raise_
714
 
        repository.add_inventory_by_delta = raise_
715
697
        self.assertRaises(errors.NoSuchFile, tree.commit, message_callback=cb)
716
698
        self.assertFalse(cb.called)
717
699
 
739
721
        tree.add('a/c/d')
740
722
        tree.rename_one('a/z/x', 'a/c/d/x')
741
723
        tree.commit('test', specific_files=['a/z/y'])
742
 
 
 
724
 
743
725
    def test_commit_no_author(self):
744
726
        """The default kwarg author in MutableTree.commit should not add
745
727
        the 'author' revision property.
748
730
        rev_id = tree.commit('commit 1')
749
731
        rev = tree.branch.repository.get_revision(rev_id)
750
732
        self.assertFalse('author' in rev.properties)
751
 
        self.assertFalse('authors' in rev.properties)
752
733
 
753
734
    def test_commit_author(self):
754
735
        """Passing a non-empty author kwarg to MutableTree.commit should add
755
736
        the 'author' revision property.
756
737
        """
757
738
        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>')
 
739
        rev_id = tree.commit('commit 1', author='John Doe <jdoe@example.com>')
761
740
        rev = tree.branch.repository.get_revision(rev_id)
762
741
        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>'])
795
 
 
796
 
    def test_commit_with_checkout_and_branch_sharing_repo(self):
797
 
        repo = self.make_repository('repo', shared=True)
798
 
        # make_branch_and_tree ignores shared repos
799
 
        branch = bzrdir.BzrDir.create_branch_convenience('repo/branch')
800
 
        tree2 = branch.create_checkout('repo/tree2')
801
 
        tree2.commit('message', rev_id='rev1')
802
 
        self.assertTrue(tree2.branch.repository.has_revision('rev1'))
 
742
                         rev.properties['author'])