/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1246 by Martin Pool
- add very simple commit tests
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
1472 by Robert Collins
post commit hook, first pass implementation
20
import bzrlib
1246 by Martin Pool
- add very simple commit tests
21
from bzrlib.selftest import TestCaseInTempDir
22
from bzrlib.branch import Branch
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
23
from bzrlib.workingtree import WorkingTree
1246 by Martin Pool
- add very simple commit tests
24
from bzrlib.commit import Commit
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
25
from bzrlib.config import BranchConfig
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
26
from bzrlib.errors import PointlessCommit, BzrError, SigningFailed
1246 by Martin Pool
- add very simple commit tests
27
28
1257 by Martin Pool
doc
29
# TODO: Test commit with some added, and added-but-missing files
30
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
31
class MustSignConfig(BranchConfig):
32
33
    def signature_needed(self):
34
        return True
35
36
    def gpg_signing_command(self):
37
        return ['cat', '-']
38
39
1472 by Robert Collins
post commit hook, first pass implementation
40
class BranchWithHooks(BranchConfig):
41
42
    def post_commit(self):
43
        return "bzrlib.ahook bzrlib.ahook"
44
45
1246 by Martin Pool
- add very simple commit tests
46
class TestCommit(TestCaseInTempDir):
1390 by Robert Collins
pair programming worx... merge integration and weave
47
1246 by Martin Pool
- add very simple commit tests
48
    def test_simple_commit(self):
49
        """Commit and check two versions of a single file."""
1390 by Robert Collins
pair programming worx... merge integration and weave
50
        b = Branch.initialize('.')
1246 by Martin Pool
- add very simple commit tests
51
        file('hello', 'w').write('hello world')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
52
        b.working_tree().add('hello')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
53
        b.working_tree().commit(message='add hello')
1246 by Martin Pool
- add very simple commit tests
54
        file_id = b.working_tree().path2id('hello')
55
56
        file('hello', 'w').write('version 2')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
57
        b.working_tree().commit(message='commit 2')
1246 by Martin Pool
- add very simple commit tests
58
59
        eq = self.assertEquals
60
        eq(b.revno(), 2)
61
        rh = b.revision_history()
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
62
        rev = b.storage.get_revision(rh[0])
1246 by Martin Pool
- add very simple commit tests
63
        eq(rev.message, 'add hello')
64
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
65
        tree1 = b.storage.revision_tree(rh[0])
1246 by Martin Pool
- add very simple commit tests
66
        text = tree1.get_file_text(file_id)
67
        eq(text, 'hello world')
68
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
69
        tree2 = b.storage.revision_tree(rh[1])
1246 by Martin Pool
- add very simple commit tests
70
        eq(tree2.get_file_text(file_id), 'version 2')
71
72
    def test_delete_commit(self):
73
        """Test a commit with a deleted file"""
1390 by Robert Collins
pair programming worx... merge integration and weave
74
        b = Branch.initialize('.')
1247 by Martin Pool
- tests for deletion and removal of files in commits
75
        file('hello', 'w').write('hello world')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
76
        b.working_tree().add(['hello'], ['hello-id'])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
77
        b.working_tree().commit(message='add hello')
1247 by Martin Pool
- tests for deletion and removal of files in commits
78
79
        os.remove('hello')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
80
        b.working_tree().commit('removed hello', rev_id='rev2')
1247 by Martin Pool
- tests for deletion and removal of files in commits
81
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
82
        tree = b.storage.revision_tree('rev2')
1247 by Martin Pool
- tests for deletion and removal of files in commits
83
        self.assertFalse(tree.has_id('hello-id'))
84
1253 by Martin Pool
- test that pointless commits are trapped
85
    def test_pointless_commit(self):
86
        """Commit refuses unless there are changes or it's forced."""
1390 by Robert Collins
pair programming worx... merge integration and weave
87
        b = Branch.initialize('.')
1253 by Martin Pool
- test that pointless commits are trapped
88
        file('hello', 'w').write('hello')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
89
        b.working_tree().add(['hello'])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
90
        b.working_tree().commit(message='add hello')
1253 by Martin Pool
- test that pointless commits are trapped
91
        self.assertEquals(b.revno(), 1)
92
        self.assertRaises(PointlessCommit,
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
93
                          b.working_tree().commit,
1253 by Martin Pool
- test that pointless commits are trapped
94
                          message='fails',
95
                          allow_pointless=False)
96
        self.assertEquals(b.revno(), 1)
97
        
1252 by Martin Pool
- add test for commit of an empty tree
98
    def test_commit_empty(self):
1253 by Martin Pool
- test that pointless commits are trapped
99
        """Commiting an empty tree works."""
1390 by Robert Collins
pair programming worx... merge integration and weave
100
        b = Branch.initialize('.')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
101
        b.working_tree().commit(message='empty tree', allow_pointless=True)
1253 by Martin Pool
- test that pointless commits are trapped
102
        self.assertRaises(PointlessCommit,
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
103
                          b.working_tree().commit,
1253 by Martin Pool
- test that pointless commits are trapped
104
                          message='empty tree',
105
                          allow_pointless=False)
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
106
        b.working_tree().commit(message='empty tree', allow_pointless=True)
1252 by Martin Pool
- add test for commit of an empty tree
107
        self.assertEquals(b.revno(), 2)
108
109
110
    def test_selective_delete(self):
111
        """Selective commit in tree with deletions"""
1390 by Robert Collins
pair programming worx... merge integration and weave
112
        b = Branch.initialize('.')
1254 by Martin Pool
- fix handling of selective commit with deleted files
113
        file('hello', 'w').write('hello')
114
        file('buongia', 'w').write('buongia')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
115
        b.working_tree().add(['hello', 'buongia'],
1255 by Martin Pool
- more tests for selective commit of deletion
116
              ['hello-id', 'buongia-id'])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
117
        b.working_tree().commit(message='add files',
1255 by Martin Pool
- more tests for selective commit of deletion
118
                 rev_id='test@rev-1')
1254 by Martin Pool
- fix handling of selective commit with deleted files
119
        
120
        os.remove('hello')
121
        file('buongia', 'w').write('new text')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
122
        b.working_tree().commit(message='update text',
1254 by Martin Pool
- fix handling of selective commit with deleted files
123
                 specific_files=['buongia'],
1255 by Martin Pool
- more tests for selective commit of deletion
124
                 allow_pointless=False,
125
                 rev_id='test@rev-2')
1254 by Martin Pool
- fix handling of selective commit with deleted files
126
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
127
        b.working_tree().commit(message='remove hello',
1254 by Martin Pool
- fix handling of selective commit with deleted files
128
                 specific_files=['hello'],
1255 by Martin Pool
- more tests for selective commit of deletion
129
                 allow_pointless=False,
130
                 rev_id='test@rev-3')
1254 by Martin Pool
- fix handling of selective commit with deleted files
131
132
        eq = self.assertEquals
133
        eq(b.revno(), 3)
1255 by Martin Pool
- more tests for selective commit of deletion
134
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
135
        tree2 = b.storage.revision_tree('test@rev-2')
1255 by Martin Pool
- more tests for selective commit of deletion
136
        self.assertTrue(tree2.has_filename('hello'))
137
        self.assertEquals(tree2.get_file_text('hello-id'), 'hello')
138
        self.assertEquals(tree2.get_file_text('buongia-id'), 'new text')
139
        
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
140
        tree3 = b.storage.revision_tree('test@rev-3')
1255 by Martin Pool
- more tests for selective commit of deletion
141
        self.assertFalse(tree3.has_filename('hello'))
142
        self.assertEquals(tree3.get_file_text('buongia-id'), 'new text')
1285 by Martin Pool
- fix bug in committing files that are renamed but not modified
143
144
145
    def test_commit_rename(self):
146
        """Test commit of a revision where a file is renamed."""
1390 by Robert Collins
pair programming worx... merge integration and weave
147
        b = Branch.initialize('.')
1508.1.7 by Robert Collins
Move rename_one from Branch to WorkingTree. (Robert Collins).
148
        tree = WorkingTree('.', b)
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
149
        self.build_tree(['hello'], line_endings='binary')
1508.1.7 by Robert Collins
Move rename_one from Branch to WorkingTree. (Robert Collins).
150
        tree.add(['hello'], ['hello-id'])
151
        tree.commit(message='one', rev_id='test@rev-1', allow_pointless=False)
1285 by Martin Pool
- fix bug in committing files that are renamed but not modified
152
1508.1.7 by Robert Collins
Move rename_one from Branch to WorkingTree. (Robert Collins).
153
        tree.rename_one('hello', 'fruity')
154
        tree.commit(message='renamed', rev_id='test@rev-2', allow_pointless=False)
1285 by Martin Pool
- fix bug in committing files that are renamed but not modified
155
1303 by Martin Pool
- commit updates entry_version
156
        eq = self.assertEquals
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
157
        tree1 = b.storage.revision_tree('test@rev-1')
1303 by Martin Pool
- commit updates entry_version
158
        eq(tree1.id2path('hello-id'), 'hello')
159
        eq(tree1.get_file_text('hello-id'), 'contents of hello\n')
1285 by Martin Pool
- fix bug in committing files that are renamed but not modified
160
        self.assertFalse(tree1.has_filename('fruity'))
1291 by Martin Pool
- add test for moving files between directories
161
        self.check_inventory_shape(tree1.inventory, ['hello'])
1303 by Martin Pool
- commit updates entry_version
162
        ie = tree1.inventory['hello-id']
1092.2.21 by Robert Collins
convert name_version to revision in inventory entries
163
        eq(ie.revision, 'test@rev-1')
1285 by Martin Pool
- fix bug in committing files that are renamed but not modified
164
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
165
        tree2 = b.storage.revision_tree('test@rev-2')
1303 by Martin Pool
- commit updates entry_version
166
        eq(tree2.id2path('hello-id'), 'fruity')
167
        eq(tree2.get_file_text('hello-id'), 'contents of hello\n')
1291 by Martin Pool
- add test for moving files between directories
168
        self.check_inventory_shape(tree2.inventory, ['fruity'])
1303 by Martin Pool
- commit updates entry_version
169
        ie = tree2.inventory['hello-id']
1092.2.21 by Robert Collins
convert name_version to revision in inventory entries
170
        eq(ie.revision, 'test@rev-2')
1291 by Martin Pool
- add test for moving files between directories
171
172
    def test_reused_rev_id(self):
1292 by Martin Pool
- add check that revision ids cannot be committed twice
173
        """Test that a revision id cannot be reused in a branch"""
1390 by Robert Collins
pair programming worx... merge integration and weave
174
        b = Branch.initialize('.')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
175
        b.working_tree().commit('initial', rev_id='test@rev-1', allow_pointless=True)
1292 by Martin Pool
- add check that revision ids cannot be committed twice
176
        self.assertRaises(Exception,
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
177
                          b.working_tree().commit,
1292 by Martin Pool
- add check that revision ids cannot be committed twice
178
                          message='reused id',
179
                          rev_id='test@rev-1',
180
                          allow_pointless=True)
1291 by Martin Pool
- add test for moving files between directories
181
182
    def test_commit_move(self):
183
        """Test commit of revisions with moved files and directories"""
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
184
        eq = self.assertEquals
1390 by Robert Collins
pair programming worx... merge integration and weave
185
        b = Branch.initialize('.')
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
186
        r1 = 'test@rev-1'
1291 by Martin Pool
- add test for moving files between directories
187
        self.build_tree(['hello', 'a/', 'b/'])
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
188
        b.working_tree().add(['hello', 'a', 'b'], ['hello-id', 'a-id', 'b-id'])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
189
        b.working_tree().commit('initial', rev_id=r1, allow_pointless=False)
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
190
        b.working_tree().move(['hello'], 'a')
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
191
        r2 = 'test@rev-2'
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
192
        b.working_tree().commit('two', rev_id=r2, allow_pointless=False)
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
193
        self.check_inventory_shape(b.working_tree().read_working_inventory(),
1291 by Martin Pool
- add test for moving files between directories
194
                                   ['a', 'a/hello', 'b'])
195
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
196
        b.working_tree().move(['b'], 'a')
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
197
        r3 = 'test@rev-3'
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
198
        b.working_tree().commit('three', rev_id=r3, allow_pointless=False)
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
199
        self.check_inventory_shape(b.working_tree().read_working_inventory(),
1291 by Martin Pool
- add test for moving files between directories
200
                                   ['a', 'a/hello', 'a/b'])
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
201
        self.check_inventory_shape(b.storage.get_revision_inventory(r3),
1291 by Martin Pool
- add test for moving files between directories
202
                                   ['a', 'a/hello', 'a/b'])
203
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
204
        b.working_tree().move([os.sep.join(['a', 'hello'])],
1291 by Martin Pool
- add test for moving files between directories
205
               os.sep.join(['a', 'b']))
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
206
        r4 = 'test@rev-4'
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
207
        b.working_tree().commit('four', rev_id=r4, allow_pointless=False)
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
208
        self.check_inventory_shape(b.working_tree().read_working_inventory(),
1291 by Martin Pool
- add test for moving files between directories
209
                                   ['a', 'a/b/hello', 'a/b'])
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
210
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
211
        inv = b.storage.get_revision_inventory(r4)
1092.2.21 by Robert Collins
convert name_version to revision in inventory entries
212
        eq(inv['hello-id'].revision, r4)
213
        eq(inv['a-id'].revision, r1)
214
        eq(inv['b-id'].revision, r3)
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
215
        
1246 by Martin Pool
- add very simple commit tests
216
    def test_removed_commit(self):
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
217
        """Commit with a removed file"""
1390 by Robert Collins
pair programming worx... merge integration and weave
218
        b = Branch.initialize('.')
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
219
        wt = b.working_tree()
1247 by Martin Pool
- tests for deletion and removal of files in commits
220
        file('hello', 'w').write('hello world')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
221
        b.working_tree().add(['hello'], ['hello-id'])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
222
        b.working_tree().commit(message='add hello')
1247 by Martin Pool
- tests for deletion and removal of files in commits
223
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
224
        wt = b.working_tree()  # FIXME: kludge for aliasing of working inventory
225
        wt.remove('hello')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
226
        b.working_tree().commit('removed hello', rev_id='rev2')
1247 by Martin Pool
- tests for deletion and removal of files in commits
227
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
228
        tree = b.storage.revision_tree('rev2')
1247 by Martin Pool
- tests for deletion and removal of files in commits
229
        self.assertFalse(tree.has_id('hello-id'))
1246 by Martin Pool
- add very simple commit tests
230
231
1256 by Martin Pool
- test that commits append to the tree's ancestry
232
    def test_committed_ancestry(self):
233
        """Test commit appends revisions to ancestry."""
1390 by Robert Collins
pair programming worx... merge integration and weave
234
        b = Branch.initialize('.')
1256 by Martin Pool
- test that commits append to the tree's ancestry
235
        rev_ids = []
236
        for i in range(4):
237
            file('hello', 'w').write((str(i) * 4) + '\n')
238
            if i == 0:
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
239
                b.working_tree().add(['hello'], ['hello-id'])
1256 by Martin Pool
- test that commits append to the tree's ancestry
240
            rev_id = 'test@rev-%d' % (i+1)
241
            rev_ids.append(rev_id)
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
242
            b.working_tree().commit(message='rev %d' % (i+1),
1256 by Martin Pool
- test that commits append to the tree's ancestry
243
                     rev_id=rev_id)
244
        eq = self.assertEquals
245
        eq(b.revision_history(), rev_ids)
246
        for i in range(4):
1185.66.2 by Aaron Bentley
Moved get_ancestry to RevisionStorage
247
            anc = b.storage.get_ancestry(rev_ids[i])
1390 by Robert Collins
pair programming worx... merge integration and weave
248
            eq(anc, [None] + rev_ids[:i+1])
1416 by Robert Collins
when committing a specific file, include all its parents
249
250
    def test_commit_new_subdir_child_selective(self):
251
        b = Branch.initialize('.')
252
        self.build_tree(['dir/', 'dir/file1', 'dir/file2'])
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
253
        b.working_tree().add(['dir', 'dir/file1', 'dir/file2'],
1416 by Robert Collins
when committing a specific file, include all its parents
254
              ['dirid', 'file1id', 'file2id'])
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
255
        b.working_tree().commit('dir/file1', specific_files=['dir/file1'], rev_id='1')
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
256
        inv = b.storage.get_inventory('1')
1416 by Robert Collins
when committing a specific file, include all its parents
257
        self.assertEqual('1', inv['dirid'].revision)
258
        self.assertEqual('1', inv['file1id'].revision)
259
        # FIXME: This should raise a KeyError I think, rbc20051006
260
        self.assertRaises(BzrError, inv.__getitem__, 'file2id')
1185.16.65 by mbp at sourcefrog
- new commit --strict option
261
262
    def test_strict_commit(self):
263
        """Try and commit with unknown files and strict = True, should fail."""
264
        from bzrlib.errors import StrictCommitFailed
265
        b = Branch.initialize('.')
266
        file('hello', 'w').write('hello world')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
267
        b.working_tree().add('hello')
1185.16.65 by mbp at sourcefrog
- new commit --strict option
268
        file('goodbye', 'w').write('goodbye cruel world!')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
269
        self.assertRaises(StrictCommitFailed, b.working_tree().commit,
1185.16.65 by mbp at sourcefrog
- new commit --strict option
270
            message='add hello but not goodbye', strict=True)
271
1185.22.4 by Michael Ellerman
Strict commit was a little .. ah .. too strict, oops :}
272
    def test_strict_commit_without_unknowns(self):
273
        """Try and commit with no unknown files and strict = True,
274
        should work."""
275
        from bzrlib.errors import StrictCommitFailed
276
        b = Branch.initialize('.')
277
        file('hello', 'w').write('hello world')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
278
        b.working_tree().add('hello')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
279
        b.working_tree().commit(message='add hello', strict=True)
1185.22.4 by Michael Ellerman
Strict commit was a little .. ah .. too strict, oops :}
280
1185.16.65 by mbp at sourcefrog
- new commit --strict option
281
    def test_nonstrict_commit(self):
282
        """Try and commit with unknown files and strict = False, should work."""
283
        b = Branch.initialize('.')
284
        file('hello', 'w').write('hello world')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
285
        b.working_tree().add('hello')
1185.16.65 by mbp at sourcefrog
- new commit --strict option
286
        file('goodbye', 'w').write('goodbye cruel world!')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
287
        b.working_tree().commit(message='add hello but not goodbye', strict=False)
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
288
1185.22.4 by Michael Ellerman
Strict commit was a little .. ah .. too strict, oops :}
289
    def test_nonstrict_commit_without_unknowns(self):
290
        """Try and commit with no unknown files and strict = False,
291
        should work."""
292
        b = Branch.initialize('.')
293
        file('hello', 'w').write('hello world')
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
294
        b.working_tree().add('hello')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
295
        b.working_tree().commit(message='add hello', strict=False)
1185.22.4 by Michael Ellerman
Strict commit was a little .. ah .. too strict, oops :}
296
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
297
    def test_signed_commit(self):
298
        import bzrlib.gpg
299
        import bzrlib.commit as commit
300
        oldstrategy = bzrlib.gpg.GPGStrategy
301
        branch = Branch.initialize('.')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
302
        branch.working_tree().commit("base", allow_pointless=True, rev_id='A')
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
303
        self.failIf(branch.storage.revision_store.has_id('A', 'sig'))
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
304
        try:
305
            from bzrlib.testament import Testament
306
            # monkey patch gpg signing mechanism
307
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
308
            commit.Commit(config=MustSignConfig(branch)).commit(branch, "base",
309
                                                      allow_pointless=True,
310
                                                      rev_id='B')
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
311
            self.assertEqual(Testament.from_revision(branch.storage,
312
                             'B').as_short_text(),
313
                             branch.storage.revision_store.get('B', 
314
                                                               'sig').read())
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
315
        finally:
316
            bzrlib.gpg.GPGStrategy = oldstrategy
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
317
318
    def test_commit_failed_signature(self):
319
        import bzrlib.gpg
320
        import bzrlib.commit as commit
321
        oldstrategy = bzrlib.gpg.GPGStrategy
322
        branch = Branch.initialize('.')
1457.1.17 by Robert Collins
Branch.commit() has moved to WorkingTree.commit(). (Robert Collins)
323
        branch.working_tree().commit("base", allow_pointless=True, rev_id='A')
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
324
        self.failIf(branch.storage.revision_store.has_id('A', 'sig'))
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
325
        try:
326
            from bzrlib.testament import Testament
327
            # monkey patch gpg signing mechanism
328
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.DisabledGPGStrategy
329
            config = MustSignConfig(branch)
330
            self.assertRaises(SigningFailed,
331
                              commit.Commit(config=config).commit,
332
                              branch, "base",
333
                              allow_pointless=True,
334
                              rev_id='B')
335
            branch = Branch.open('.')
336
            self.assertEqual(branch.revision_history(), ['A'])
1185.65.1 by Aaron Bentley
Refactored out ControlFiles and RevisionStore from _Branch
337
            self.failIf(branch.storage.revision_store.has_id('B'))
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
338
        finally:
339
            bzrlib.gpg.GPGStrategy = oldstrategy
1472 by Robert Collins
post commit hook, first pass implementation
340
341
    def test_commit_invokes_hooks(self):
342
        import bzrlib.commit as commit
343
        branch = Branch.initialize('.')
344
        calls = []
345
        def called(branch, rev_id):
346
            calls.append('called')
347
        bzrlib.ahook = called
348
        try:
349
            config = BranchWithHooks(branch)
350
            commit.Commit(config=config).commit(
351
                            branch, "base",
352
                            allow_pointless=True,
353
                            rev_id='A')
354
            self.assertEqual(['called', 'called'], calls)
355
        finally:
356
            del bzrlib.ahook