~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/test_commit.py

  • Committer: Martin Pool
  • Date: 2005-09-05 09:11:03 UTC
  • Revision ID: mbp@sourcefrog.net-20050905091103-1e51e146be0f08b4
- add test for deserialization from a canned XML inventory

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
2
 
 
3
 
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
6
 
# (at your option) any later version.
7
 
 
8
 
# This program is distributed in the hope that it will be useful,
9
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
# GNU General Public License for more details.
12
 
 
13
 
# You should have received a copy of the GNU General Public License
14
 
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 
 
17
 
 
18
 
import os
19
 
 
20
 
from bzrlib.selftest import TestCaseInTempDir
21
 
from bzrlib.branch import Branch
22
 
from bzrlib.commit import Commit
23
 
from bzrlib.errors import PointlessCommit, BzrError
24
 
 
25
 
 
26
 
# TODO: Test commit with some added, and added-but-missing files
27
 
 
28
 
class TestCommit(TestCaseInTempDir):
29
 
    def test_simple_commit(self):
30
 
        """Commit and check two versions of a single file."""
31
 
        b = Branch('.', init=True)
32
 
        file('hello', 'w').write('hello world')
33
 
        b.add('hello')
34
 
        b.commit(message='add hello')
35
 
        file_id = b.working_tree().path2id('hello')
36
 
 
37
 
        file('hello', 'w').write('version 2')
38
 
        b.commit(message='commit 2')
39
 
 
40
 
        eq = self.assertEquals
41
 
        eq(b.revno(), 2)
42
 
        rh = b.revision_history()
43
 
        rev = b.get_revision(rh[0])
44
 
        eq(rev.message, 'add hello')
45
 
 
46
 
        tree1 = b.revision_tree(rh[0])
47
 
        text = tree1.get_file_text(file_id)
48
 
        eq(text, 'hello world')
49
 
 
50
 
        tree2 = b.revision_tree(rh[1])
51
 
        eq(tree2.get_file_text(file_id), 'version 2')
52
 
 
53
 
 
54
 
    def test_delete_commit(self):
55
 
        """Test a commit with a deleted file"""
56
 
        b = Branch('.', init=True)
57
 
        file('hello', 'w').write('hello world')
58
 
        b.add(['hello'], ['hello-id'])
59
 
        b.commit(message='add hello')
60
 
 
61
 
        os.remove('hello')
62
 
        b.commit('removed hello', rev_id='rev2')
63
 
 
64
 
        tree = b.revision_tree('rev2')
65
 
        self.assertFalse(tree.has_id('hello-id'))
66
 
 
67
 
 
68
 
    def test_pointless_commit(self):
69
 
        """Commit refuses unless there are changes or it's forced."""
70
 
        b = Branch('.', init=True)
71
 
        file('hello', 'w').write('hello')
72
 
        b.add(['hello'])
73
 
        b.commit(message='add hello')
74
 
        self.assertEquals(b.revno(), 1)
75
 
        self.assertRaises(PointlessCommit,
76
 
                          b.commit,
77
 
                          message='fails',
78
 
                          allow_pointless=False)
79
 
        self.assertEquals(b.revno(), 1)
80
 
        
81
 
 
82
 
 
83
 
    def test_commit_empty(self):
84
 
        """Commiting an empty tree works."""
85
 
        b = Branch('.', init=True)
86
 
        b.commit(message='empty tree', allow_pointless=True)
87
 
        self.assertRaises(PointlessCommit,
88
 
                          b.commit,
89
 
                          message='empty tree',
90
 
                          allow_pointless=False)
91
 
        b.commit(message='empty tree', allow_pointless=True)
92
 
        self.assertEquals(b.revno(), 2)
93
 
 
94
 
 
95
 
    def test_selective_delete(self):
96
 
        """Selective commit in tree with deletions"""
97
 
        b = Branch('.', init=True)
98
 
        file('hello', 'w').write('hello')
99
 
        file('buongia', 'w').write('buongia')
100
 
        b.add(['hello', 'buongia'],
101
 
              ['hello-id', 'buongia-id'])
102
 
        b.commit(message='add files',
103
 
                 rev_id='test@rev-1')
104
 
        
105
 
        os.remove('hello')
106
 
        file('buongia', 'w').write('new text')
107
 
        b.commit(message='update text',
108
 
                 specific_files=['buongia'],
109
 
                 allow_pointless=False,
110
 
                 rev_id='test@rev-2')
111
 
 
112
 
        b.commit(message='remove hello',
113
 
                 specific_files=['hello'],
114
 
                 allow_pointless=False,
115
 
                 rev_id='test@rev-3')
116
 
 
117
 
        eq = self.assertEquals
118
 
        eq(b.revno(), 3)
119
 
 
120
 
        tree2 = b.revision_tree('test@rev-2')
121
 
        self.assertTrue(tree2.has_filename('hello'))
122
 
        self.assertEquals(tree2.get_file_text('hello-id'), 'hello')
123
 
        self.assertEquals(tree2.get_file_text('buongia-id'), 'new text')
124
 
        
125
 
        tree3 = b.revision_tree('test@rev-3')
126
 
        self.assertFalse(tree3.has_filename('hello'))
127
 
        self.assertEquals(tree3.get_file_text('buongia-id'), 'new text')
128
 
 
129
 
 
130
 
    def test_commit_rename(self):
131
 
        """Test commit of a revision where a file is renamed."""
132
 
        b = Branch('.', init=True)
133
 
        self.build_tree(['hello'])
134
 
        b.add(['hello'], ['hello-id'])
135
 
        b.commit(message='one', rev_id='test@rev-1', allow_pointless=False)
136
 
 
137
 
        b.rename_one('hello', 'fruity')
138
 
        b.commit(message='renamed', rev_id='test@rev-2', allow_pointless=False)
139
 
 
140
 
        tree1 = b.revision_tree('test@rev-1')
141
 
        self.assertEquals(tree1.id2path('hello-id'), 'hello')
142
 
        self.assertEquals(tree1.get_file_text('hello-id'), 'contents of hello\n')
143
 
        self.assertFalse(tree1.has_filename('fruity'))
144
 
        self.check_inventory_shape(tree1.inventory, ['hello'])
145
 
 
146
 
        tree2 = b.revision_tree('test@rev-2')
147
 
        self.assertEquals(tree2.id2path('hello-id'), 'fruity')
148
 
        self.assertEquals(tree2.get_file_text('hello-id'), 'contents of hello\n')
149
 
        self.check_inventory_shape(tree2.inventory, ['fruity'])
150
 
 
151
 
 
152
 
    def test_reused_rev_id(self):
153
 
        """Test that a revision id cannot be reused in a branch"""
154
 
        b = Branch('.', init=True)
155
 
        b.commit('initial', rev_id='test@rev-1', allow_pointless=True)
156
 
        self.assertRaises(Exception,
157
 
                          b.commit,
158
 
                          message='reused id',
159
 
                          rev_id='test@rev-1',
160
 
                          allow_pointless=True)
161
 
                          
162
 
 
163
 
 
164
 
    def test_commit_move(self):
165
 
        """Test commit of revisions with moved files and directories"""
166
 
        b = Branch('.', init=True)
167
 
        self.build_tree(['hello', 'a/', 'b/'])
168
 
        b.add(['hello', 'a', 'b'], ['hello-id', 'a-id', 'b-id'])
169
 
        b.commit('initial', rev_id='test@rev-1', allow_pointless=False)
170
 
 
171
 
        b.move(['hello'], 'a')
172
 
        b.commit('two', rev_id='test@rev-2', allow_pointless=False)
173
 
        self.check_inventory_shape(b.inventory,
174
 
                                   ['a', 'a/hello', 'b'])
175
 
 
176
 
        b.move(['b'], 'a')
177
 
        b.commit('three', rev_id='test@rev-3', allow_pointless=False)
178
 
        self.check_inventory_shape(b.inventory,
179
 
                                   ['a', 'a/hello', 'a/b'])
180
 
        self.check_inventory_shape(b.get_revision_inventory('test@rev-3'),
181
 
                                   ['a', 'a/hello', 'a/b'])
182
 
 
183
 
        b.move([os.sep.join(['a', 'hello'])],
184
 
               os.sep.join(['a', 'b']))
185
 
        b.commit('four', rev_id='test@rev-4', allow_pointless=False)
186
 
        self.check_inventory_shape(b.inventory,
187
 
                                   ['a', 'a/b/hello', 'a/b'])
188
 
        
189
 
        
190
 
        
191
 
 
192
 
    def test_removed_commit(self):
193
 
        """Test a commit with a removed file"""
194
 
        b = Branch('.', init=True)
195
 
        file('hello', 'w').write('hello world')
196
 
        b.add(['hello'], ['hello-id'])
197
 
        b.commit(message='add hello')
198
 
 
199
 
        b.remove('hello')
200
 
        b.commit('removed hello', rev_id='rev2')
201
 
 
202
 
        tree = b.revision_tree('rev2')
203
 
        self.assertFalse(tree.has_id('hello-id'))
204
 
 
205
 
 
206
 
    def test_committed_ancestry(self):
207
 
        """Test commit appends revisions to ancestry."""
208
 
        b = Branch('.', init=True)
209
 
        rev_ids = []
210
 
        for i in range(4):
211
 
            file('hello', 'w').write((str(i) * 4) + '\n')
212
 
            if i == 0:
213
 
                b.add(['hello'], ['hello-id'])
214
 
            rev_id = 'test@rev-%d' % (i+1)
215
 
            rev_ids.append(rev_id)
216
 
            b.commit(message='rev %d' % (i+1),
217
 
                     rev_id=rev_id)
218
 
        eq = self.assertEquals
219
 
        eq(b.revision_history(), rev_ids)
220
 
        for i in range(4):
221
 
            anc = b.get_ancestry(rev_ids[i])
222
 
            eq(anc, rev_ids[:i+1])
223
 
            
224
 
        
225
 
 
226
 
 
227
 
if __name__ == '__main__':
228
 
    import unittest
229
 
    unittest.main()
230