~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_commit.py

  • Committer: Vincent Ladeuil
  • Date: 2007-09-24 15:01:26 UTC
  • mfrom: (2853 +trunk)
  • mto: (2885.1.1 140432)
  • mto: This revision was merged to the branch mainline in revision 2886.
  • Revision ID: v.ladeuil+lp@free.fr-20070924150126-nll7i0385kisklyj
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 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
 
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
 
33
from bzrlib.tests import TestCaseWithTransport
35
34
from bzrlib.workingtree import WorkingTree
36
35
 
37
36
 
96
95
        eq(rev.message, 'add hello')
97
96
 
98
97
        tree1 = b.repository.revision_tree(rh[0])
99
 
        tree1.lock_read()
100
98
        text = tree1.get_file_text(file_id)
101
 
        tree1.unlock()
102
 
        self.assertEqual('hello world', text)
 
99
        eq(text, 'hello world')
103
100
 
104
101
        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)
 
102
        eq(tree2.get_file_text(file_id), 'version 2')
109
103
 
110
 
    def test_missing_commit(self):
111
 
        """Test a commit with a missing file"""
 
104
    def test_delete_commit(self):
 
105
        """Test a commit with a deleted file"""
112
106
        wt = self.make_branch_and_tree('.')
113
107
        b = wt.branch
114
108
        file('hello', 'w').write('hello world')
121
115
        tree = b.repository.revision_tree('rev2')
122
116
        self.assertFalse(tree.has_id('hello-id'))
123
117
 
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
118
    def test_pointless_commit(self):
145
119
        """Commit refuses unless there are changes or it's forced."""
146
120
        wt = self.make_branch_and_tree('.')
154
128
                          message='fails',
155
129
                          allow_pointless=False)
156
130
        self.assertEquals(b.revno(), 1)
157
 
 
 
131
        
158
132
    def test_commit_empty(self):
159
133
        """Commiting an empty tree works."""
160
134
        wt = self.make_branch_and_tree('.')
177
151
              ['hello-id', 'buongia-id'])
178
152
        wt.commit(message='add files',
179
153
                 rev_id='test@rev-1')
180
 
 
 
154
        
181
155
        os.remove('hello')
182
156
        file('buongia', 'w').write('new text')
183
157
        wt.commit(message='update text',
194
168
        eq(b.revno(), 3)
195
169
 
196
170
        tree2 = b.repository.revision_tree('test@rev-2')
197
 
        tree2.lock_read()
198
 
        self.addCleanup(tree2.unlock)
199
171
        self.assertTrue(tree2.has_filename('hello'))
200
172
        self.assertEquals(tree2.get_file_text('hello-id'), 'hello')
201
173
        self.assertEquals(tree2.get_file_text('buongia-id'), 'new text')
202
 
 
 
174
        
203
175
        tree3 = b.repository.revision_tree('test@rev-3')
204
 
        tree3.lock_read()
205
 
        self.addCleanup(tree3.unlock)
206
176
        self.assertFalse(tree3.has_filename('hello'))
207
177
        self.assertEquals(tree3.get_file_text('buongia-id'), 'new text')
208
178
 
219
189
 
220
190
        eq = self.assertEquals
221
191
        tree1 = b.repository.revision_tree('test@rev-1')
222
 
        tree1.lock_read()
223
 
        self.addCleanup(tree1.unlock)
224
192
        eq(tree1.id2path('hello-id'), 'hello')
225
193
        eq(tree1.get_file_text('hello-id'), 'contents of hello\n')
226
194
        self.assertFalse(tree1.has_filename('fruity'))
229
197
        eq(ie.revision, 'test@rev-1')
230
198
 
231
199
        tree2 = b.repository.revision_tree('test@rev-2')
232
 
        tree2.lock_read()
233
 
        self.addCleanup(tree2.unlock)
234
200
        eq(tree2.id2path('hello-id'), 'fruity')
235
201
        eq(tree2.get_file_text('hello-id'), 'contents of hello\n')
236
202
        self.check_inventory_shape(tree2.inventory, ['fruity'])
274
240
        try:
275
241
            self.check_inventory_shape(wt.read_working_inventory(),
276
242
                                       ['a/', 'a/hello', 'a/b/'])
277
 
            self.check_inventory_shape(b.repository.get_inventory(r3),
 
243
            self.check_inventory_shape(b.repository.get_revision_inventory(r3),
278
244
                                       ['a/', 'a/hello', 'a/b/'])
279
245
        finally:
280
246
            wt.unlock()
289
255
        finally:
290
256
            wt.unlock()
291
257
 
292
 
        inv = b.repository.get_inventory(r4)
 
258
        inv = b.repository.get_revision_inventory(r4)
293
259
        eq(inv['hello-id'].revision, r4)
294
260
        eq(inv['a-id'].revision, r1)
295
261
        eq(inv['b-id'].revision, r3)
464
430
        bound = master.sprout('bound')
465
431
        wt = bound.open_workingtree()
466
432
        wt.branch.set_bound_location(os.path.realpath('master'))
 
433
 
 
434
        orig_default = lockdir._DEFAULT_TIMEOUT_SECONDS
467
435
        master_branch.lock_write()
468
436
        try:
 
437
            lockdir._DEFAULT_TIMEOUT_SECONDS = 1
469
438
            self.assertRaises(LockContention, wt.commit, 'silly')
470
439
        finally:
 
440
            lockdir._DEFAULT_TIMEOUT_SECONDS = orig_default
471
441
            master_branch.unlock()
472
442
 
473
443
    def test_commit_bound_merge(self):
484
454
        other_bzrdir = master_branch.bzrdir.sprout('other')
485
455
        other_tree = other_bzrdir.open_workingtree()
486
456
 
487
 
        # do a commit to the other branch changing the content file so
 
457
        # do a commit to the the other branch changing the content file so
488
458
        # that our commit after merging will have a merged revision in the
489
459
        # content file history.
490
460
        self.build_tree_contents([('other/content_file', 'change in other\n')])
501
471
        bound_tree.commit(message='commit of merge in bound tree')
502
472
 
503
473
    def test_commit_reporting_after_merge(self):
504
 
        # when doing a commit of a merge, the reporter needs to still
 
474
        # when doing a commit of a merge, the reporter needs to still 
505
475
        # be called for each item that is added/removed/deleted.
506
476
        this_tree = self.make_branch_and_tree('this')
507
477
        # we need a bunch of files and dirs, to perform one action on each.
550
520
        this_tree.merge_from_branch(other_tree.branch)
551
521
        reporter = CapturingReporter()
552
522
        this_tree.commit('do the commit', reporter=reporter)
553
 
        expected = set([
 
523
        self.assertEqual([
 
524
            ('change', 'unchanged', ''),
 
525
            ('change', 'unchanged', 'dirtoleave'),
 
526
            ('change', 'unchanged', 'filetoleave'),
554
527
            ('change', 'modified', 'filetomodify'),
555
528
            ('change', 'added', 'newdir'),
556
529
            ('change', 'added', 'newfile'),
560
533
            ('renamed', 'renamed', 'filetoreparent', 'renameddir/reparentedfile'),
561
534
            ('deleted', 'dirtoremove'),
562
535
            ('deleted', 'filetoremove'),
563
 
            ])
564
 
        result = set(reporter.calls)
565
 
        missing = expected - result
566
 
        new = result - expected
567
 
        self.assertEqual((set(), set()), (missing, new))
 
536
            ],
 
537
            reporter.calls)
568
538
 
569
539
    def test_commit_removals_respects_filespec(self):
570
540
        """Commit respects the specified_files for removals."""
614
584
            basis.unlock()
615
585
 
616
586
    def test_commit_kind_changes(self):
617
 
        self.requireFeature(SymlinkFeature)
 
587
        if not osutils.has_symlinks():
 
588
            raise tests.TestSkipped('Test requires symlink support')
618
589
        tree = self.make_branch_and_tree('.')
619
590
        os.symlink('target', 'name')
620
591
        tree.add('name', 'a-file-id')
660
631
    def test_commit_unversioned_specified(self):
661
632
        """Commit should raise if specified files isn't in basis or worktree"""
662
633
        tree = self.make_branch_and_tree('.')
663
 
        self.assertRaises(errors.PathsNotVersionedError, tree.commit,
 
634
        self.assertRaises(errors.PathsNotVersionedError, tree.commit, 
664
635
                          'message', specific_files=['bogus'])
665
636
 
666
637
    class Callback(object):
667
 
 
 
638
        
668
639
        def __init__(self, message, testcase):
669
640
            self.called = False
670
641
            self.message = message
698
669
        """Callback should not be invoked for pointless commit"""
699
670
        tree = self.make_branch_and_tree('.')
700
671
        cb = self.Callback(u'commit 2', self)
701
 
        self.assertRaises(PointlessCommit, tree.commit, message_callback=cb,
 
672
        self.assertRaises(PointlessCommit, tree.commit, message_callback=cb, 
702
673
                          allow_pointless=False)
703
674
        self.assertFalse(cb.called)
704
675
 
708
679
        cb = self.Callback(u'commit 2', self)
709
680
        repository = tree.branch.repository
710
681
        # simulate network failure
711
 
        def raise_(self, arg, arg2, arg3=None, arg4=None):
 
682
        def raise_(self, arg, arg2):
712
683
            raise errors.NoSuchFile('foo')
713
684
        repository.add_inventory = raise_
714
 
        repository.add_inventory_by_delta = raise_
715
685
        self.assertRaises(errors.NoSuchFile, tree.commit, message_callback=cb)
716
686
        self.assertFalse(cb.called)
717
687
 
739
709
        tree.add('a/c/d')
740
710
        tree.rename_one('a/z/x', 'a/c/d/x')
741
711
        tree.commit('test', specific_files=['a/z/y'])
742
 
 
 
712
 
743
713
    def test_commit_no_author(self):
744
714
        """The default kwarg author in MutableTree.commit should not add
745
715
        the 'author' revision property.
748
718
        rev_id = tree.commit('commit 1')
749
719
        rev = tree.branch.repository.get_revision(rev_id)
750
720
        self.assertFalse('author' in rev.properties)
751
 
        self.assertFalse('authors' in rev.properties)
752
721
 
753
722
    def test_commit_author(self):
754
723
        """Passing a non-empty author kwarg to MutableTree.commit should add
755
724
        the 'author' revision property.
756
725
        """
757
726
        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>')
 
727
        rev_id = tree.commit('commit 1', author='John Doe <jdoe@example.com>')
761
728
        rev = tree.branch.repository.get_revision(rev_id)
762
729
        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'))
 
730
                         rev.properties['author'])