/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5557.1.15 by John Arbash Meinel
Merge bzr.dev 5597 to resolve NEWS, aka bzr-2.3.txt
1
# Copyright (C) 2005-2011 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1246 by Martin Pool
- add very simple commit tests
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1246 by Martin Pool
- add very simple commit tests
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1246 by Martin Pool
- add very simple commit tests
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1246 by Martin Pool
- add very simple commit tests
16
17
18
import os
19
1472 by Robert Collins
post commit hook, first pass implementation
20
import bzrlib
1957.1.17 by John Arbash Meinel
Change tests that expect locking to fail to timeout sooner.
21
from bzrlib import (
3113.6.7 by Aaron Bentley
Fix commit for a checkout sharing a repo with its branch (abentley, #177592)
22
    bzrdir,
1957.1.17 by John Arbash Meinel
Change tests that expect locking to fail to timeout sooner.
23
    errors,
24
    )
1246 by Martin Pool
- add very simple commit tests
25
from bzrlib.branch import Branch
5579.3.1 by Jelmer Vernooij
Remove unused imports.
26
from bzrlib.bzrdir import BzrDirMetaFormat1
1668.1.5 by Martin Pool
[broken] fix up display of files changed by a commit
27
from bzrlib.commit import Commit, NullCommitReporter
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
28
from bzrlib.config import BranchConfig
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
29
from bzrlib.errors import (PointlessCommit, BzrError, SigningFailed,
1614.1.1 by Aaron Bentley
Fixed master locking in commit
30
                           LockContention)
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
31
from bzrlib.tests import (
32
    SymlinkFeature,
33
    TestCaseWithTransport,
34
    test_foreign,
35
    )
1246 by Martin Pool
- add very simple commit tests
36
37
1257 by Martin Pool
doc
38
# TODO: Test commit with some added, and added-but-missing files
39
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
40
class MustSignConfig(BranchConfig):
41
42
    def signature_needed(self):
43
        return True
44
45
    def gpg_signing_command(self):
46
        return ['cat', '-']
47
48
1472 by Robert Collins
post commit hook, first pass implementation
49
class BranchWithHooks(BranchConfig):
50
51
    def post_commit(self):
52
        return "bzrlib.ahook bzrlib.ahook"
53
54
1668.1.5 by Martin Pool
[broken] fix up display of files changed by a commit
55
class CapturingReporter(NullCommitReporter):
56
    """This reporter captures the calls made to it for evaluation later."""
57
58
    def __init__(self):
59
        # a list of the calls this received
60
        self.calls = []
61
62
    def snapshot_change(self, change, path):
63
        self.calls.append(('change', change, path))
64
65
    def deleted(self, file_id):
66
        self.calls.append(('deleted', file_id))
67
68
    def missing(self, path):
69
        self.calls.append(('missing', path))
70
71
    def renamed(self, change, old_path, new_path):
72
        self.calls.append(('renamed', change, old_path, new_path))
73
2789.2.1 by Ian Clatworthy
Make commit less verbose by default
74
    def is_verbose(self):
75
        return True
76
1668.1.5 by Martin Pool
[broken] fix up display of files changed by a commit
77
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
78
class TestCommit(TestCaseWithTransport):
1390 by Robert Collins
pair programming worx... merge integration and weave
79
1246 by Martin Pool
- add very simple commit tests
80
    def test_simple_commit(self):
81
        """Commit and check two versions of a single file."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
82
        wt = self.make_branch_and_tree('.')
83
        b = wt.branch
1246 by Martin Pool
- add very simple commit tests
84
        file('hello', 'w').write('hello world')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
85
        wt.add('hello')
86
        wt.commit(message='add hello')
87
        file_id = wt.path2id('hello')
1246 by Martin Pool
- add very simple commit tests
88
89
        file('hello', 'w').write('version 2')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
90
        wt.commit(message='commit 2')
1246 by Martin Pool
- add very simple commit tests
91
92
        eq = self.assertEquals
93
        eq(b.revno(), 2)
94
        rh = b.revision_history()
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
95
        rev = b.repository.get_revision(rh[0])
1246 by Martin Pool
- add very simple commit tests
96
        eq(rev.message, 'add hello')
97
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
98
        tree1 = b.repository.revision_tree(rh[0])
3010.1.3 by Robert Collins
Lock RevisionTrees correctly in commit tests.
99
        tree1.lock_read()
1246 by Martin Pool
- add very simple commit tests
100
        text = tree1.get_file_text(file_id)
3010.1.3 by Robert Collins
Lock RevisionTrees correctly in commit tests.
101
        tree1.unlock()
102
        self.assertEqual('hello world', text)
1246 by Martin Pool
- add very simple commit tests
103
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
104
        tree2 = b.repository.revision_tree(rh[1])
3010.1.3 by Robert Collins
Lock RevisionTrees correctly in commit tests.
105
        tree2.lock_read()
106
        text = tree2.get_file_text(file_id)
107
        tree2.unlock()
108
        self.assertEqual('version 2', text)
1246 by Martin Pool
- add very simple commit tests
109
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
110
    def test_commit_lossy_native(self):
111
        """Attempt a lossy commit to a native branch."""
112
        wt = self.make_branch_and_tree('.')
113
        b = wt.branch
114
        file('hello', 'w').write('hello world')
115
        wt.add('hello')
116
        revid = wt.commit(message='add hello', rev_id='revid', lossy=True)
117
        self.assertEquals('revid', revid)
118
119
    def test_commit_lossy_foreign(self):
120
        """Attempt a lossy commit to a foreign branch."""
5777.6.6 by Jelmer Vernooij
Add lossy tests.
121
        test_foreign.register_dummy_foreign_for_test(self)
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
122
        wt = self.make_branch_and_tree('.',
123
            format=test_foreign.DummyForeignVcsDirFormat())
124
        b = wt.branch
125
        file('hello', 'w').write('hello world')
126
        wt.add('hello')
5777.6.6 by Jelmer Vernooij
Add lossy tests.
127
        revid = wt.commit(message='add hello', lossy=True,
128
            timestamp=1302659388, timezone=0)
129
        self.assertEquals('dummy-v1:1302659388.0-0-UNKNOWN', revid)
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
130
4183.5.5 by Robert Collins
Enable record_iter_changes for cases where it can work.
131
    def test_missing_commit(self):
132
        """Test a commit with a missing file"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
133
        wt = self.make_branch_and_tree('.')
134
        b = wt.branch
1247 by Martin Pool
- tests for deletion and removal of files in commits
135
        file('hello', 'w').write('hello world')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
136
        wt.add(['hello'], ['hello-id'])
137
        wt.commit(message='add hello')
1247 by Martin Pool
- tests for deletion and removal of files in commits
138
139
        os.remove('hello')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
140
        wt.commit('removed hello', rev_id='rev2')
1247 by Martin Pool
- tests for deletion and removal of files in commits
141
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
142
        tree = b.repository.revision_tree('rev2')
1247 by Martin Pool
- tests for deletion and removal of files in commits
143
        self.assertFalse(tree.has_id('hello-id'))
144
2258.4.1 by Jelmer Vernooij
Add test that demonstrates a corner case bug in commit.
145
    def test_partial_commit_move(self):
3373.4.1 by John Arbash Meinel
Merge in and clean up the test for bug #83039.
146
        """Test a partial commit where a file was renamed but not committed.
147
148
        https://bugs.launchpad.net/bzr/+bug/83039
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
149
2258.4.1 by Jelmer Vernooij
Add test that demonstrates a corner case bug in commit.
150
        If not handled properly, commit will try to snapshot
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
151
        dialog.py with olive/ as a parent, while
2258.4.1 by Jelmer Vernooij
Add test that demonstrates a corner case bug in commit.
152
        olive/ has not been snapshotted yet.
153
        """
154
        wt = self.make_branch_and_tree('.')
155
        b = wt.branch
3373.4.1 by John Arbash Meinel
Merge in and clean up the test for bug #83039.
156
        self.build_tree(['annotate/', 'annotate/foo.py',
157
                         'olive/', 'olive/dialog.py'
158
                        ])
2258.4.1 by Jelmer Vernooij
Add test that demonstrates a corner case bug in commit.
159
        wt.add(['annotate', 'olive', 'annotate/foo.py', 'olive/dialog.py'])
160
        wt.commit(message='add files')
3373.4.1 by John Arbash Meinel
Merge in and clean up the test for bug #83039.
161
        wt.rename_one("olive/dialog.py", "aaa")
162
        self.build_tree_contents([('annotate/foo.py', 'modified\n')])
2258.4.1 by Jelmer Vernooij
Add test that demonstrates a corner case bug in commit.
163
        wt.commit('renamed hello', specific_files=["annotate"])
164
1253 by Martin Pool
- test that pointless commits are trapped
165
    def test_pointless_commit(self):
166
        """Commit refuses unless there are changes or it's forced."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
167
        wt = self.make_branch_and_tree('.')
168
        b = wt.branch
1253 by Martin Pool
- test that pointless commits are trapped
169
        file('hello', 'w').write('hello')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
170
        wt.add(['hello'])
171
        wt.commit(message='add hello')
1253 by Martin Pool
- test that pointless commits are trapped
172
        self.assertEquals(b.revno(), 1)
173
        self.assertRaises(PointlessCommit,
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
174
                          wt.commit,
1253 by Martin Pool
- test that pointless commits are trapped
175
                          message='fails',
176
                          allow_pointless=False)
177
        self.assertEquals(b.revno(), 1)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
178
1252 by Martin Pool
- add test for commit of an empty tree
179
    def test_commit_empty(self):
1253 by Martin Pool
- test that pointless commits are trapped
180
        """Commiting an empty tree works."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
181
        wt = self.make_branch_and_tree('.')
182
        b = wt.branch
183
        wt.commit(message='empty tree', allow_pointless=True)
1253 by Martin Pool
- test that pointless commits are trapped
184
        self.assertRaises(PointlessCommit,
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
185
                          wt.commit,
1253 by Martin Pool
- test that pointless commits are trapped
186
                          message='empty tree',
187
                          allow_pointless=False)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
188
        wt.commit(message='empty tree', allow_pointless=True)
1252 by Martin Pool
- add test for commit of an empty tree
189
        self.assertEquals(b.revno(), 2)
190
191
    def test_selective_delete(self):
192
        """Selective commit in tree with deletions"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
193
        wt = self.make_branch_and_tree('.')
194
        b = wt.branch
1254 by Martin Pool
- fix handling of selective commit with deleted files
195
        file('hello', 'w').write('hello')
196
        file('buongia', 'w').write('buongia')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
197
        wt.add(['hello', 'buongia'],
1255 by Martin Pool
- more tests for selective commit of deletion
198
              ['hello-id', 'buongia-id'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
199
        wt.commit(message='add files',
1255 by Martin Pool
- more tests for selective commit of deletion
200
                 rev_id='test@rev-1')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
201
1254 by Martin Pool
- fix handling of selective commit with deleted files
202
        os.remove('hello')
203
        file('buongia', 'w').write('new text')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
204
        wt.commit(message='update text',
1254 by Martin Pool
- fix handling of selective commit with deleted files
205
                 specific_files=['buongia'],
1255 by Martin Pool
- more tests for selective commit of deletion
206
                 allow_pointless=False,
207
                 rev_id='test@rev-2')
1254 by Martin Pool
- fix handling of selective commit with deleted files
208
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
209
        wt.commit(message='remove hello',
1254 by Martin Pool
- fix handling of selective commit with deleted files
210
                 specific_files=['hello'],
1255 by Martin Pool
- more tests for selective commit of deletion
211
                 allow_pointless=False,
212
                 rev_id='test@rev-3')
1254 by Martin Pool
- fix handling of selective commit with deleted files
213
214
        eq = self.assertEquals
215
        eq(b.revno(), 3)
1255 by Martin Pool
- more tests for selective commit of deletion
216
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
217
        tree2 = b.repository.revision_tree('test@rev-2')
3010.1.3 by Robert Collins
Lock RevisionTrees correctly in commit tests.
218
        tree2.lock_read()
219
        self.addCleanup(tree2.unlock)
1255 by Martin Pool
- more tests for selective commit of deletion
220
        self.assertTrue(tree2.has_filename('hello'))
221
        self.assertEquals(tree2.get_file_text('hello-id'), 'hello')
222
        self.assertEquals(tree2.get_file_text('buongia-id'), 'new text')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
223
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
224
        tree3 = b.repository.revision_tree('test@rev-3')
3010.1.3 by Robert Collins
Lock RevisionTrees correctly in commit tests.
225
        tree3.lock_read()
226
        self.addCleanup(tree3.unlock)
1255 by Martin Pool
- more tests for selective commit of deletion
227
        self.assertFalse(tree3.has_filename('hello'))
228
        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
229
230
    def test_commit_rename(self):
231
        """Test commit of a revision where a file is renamed."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
232
        tree = self.make_branch_and_tree('.')
233
        b = tree.branch
1185.38.7 by John Arbash Meinel
Updated build_tree to use fixed line-endings for tests which read the file contents and compare
234
        self.build_tree(['hello'], line_endings='binary')
1508.1.7 by Robert Collins
Move rename_one from Branch to WorkingTree. (Robert Collins).
235
        tree.add(['hello'], ['hello-id'])
236
        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
237
1508.1.7 by Robert Collins
Move rename_one from Branch to WorkingTree. (Robert Collins).
238
        tree.rename_one('hello', 'fruity')
239
        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
240
1303 by Martin Pool
- commit updates entry_version
241
        eq = self.assertEquals
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
242
        tree1 = b.repository.revision_tree('test@rev-1')
3010.1.3 by Robert Collins
Lock RevisionTrees correctly in commit tests.
243
        tree1.lock_read()
244
        self.addCleanup(tree1.unlock)
1303 by Martin Pool
- commit updates entry_version
245
        eq(tree1.id2path('hello-id'), 'hello')
246
        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
247
        self.assertFalse(tree1.has_filename('fruity'))
1291 by Martin Pool
- add test for moving files between directories
248
        self.check_inventory_shape(tree1.inventory, ['hello'])
1303 by Martin Pool
- commit updates entry_version
249
        ie = tree1.inventory['hello-id']
1092.2.21 by Robert Collins
convert name_version to revision in inventory entries
250
        eq(ie.revision, 'test@rev-1')
1285 by Martin Pool
- fix bug in committing files that are renamed but not modified
251
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
252
        tree2 = b.repository.revision_tree('test@rev-2')
3010.1.3 by Robert Collins
Lock RevisionTrees correctly in commit tests.
253
        tree2.lock_read()
254
        self.addCleanup(tree2.unlock)
1303 by Martin Pool
- commit updates entry_version
255
        eq(tree2.id2path('hello-id'), 'fruity')
256
        eq(tree2.get_file_text('hello-id'), 'contents of hello\n')
1291 by Martin Pool
- add test for moving files between directories
257
        self.check_inventory_shape(tree2.inventory, ['fruity'])
1303 by Martin Pool
- commit updates entry_version
258
        ie = tree2.inventory['hello-id']
1092.2.21 by Robert Collins
convert name_version to revision in inventory entries
259
        eq(ie.revision, 'test@rev-2')
1291 by Martin Pool
- add test for moving files between directories
260
261
    def test_reused_rev_id(self):
1292 by Martin Pool
- add check that revision ids cannot be committed twice
262
        """Test that a revision id cannot be reused in a branch"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
263
        wt = self.make_branch_and_tree('.')
264
        b = wt.branch
265
        wt.commit('initial', rev_id='test@rev-1', allow_pointless=True)
1292 by Martin Pool
- add check that revision ids cannot be committed twice
266
        self.assertRaises(Exception,
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
267
                          wt.commit,
1292 by Martin Pool
- add check that revision ids cannot be committed twice
268
                          message='reused id',
269
                          rev_id='test@rev-1',
270
                          allow_pointless=True)
1291 by Martin Pool
- add test for moving files between directories
271
272
    def test_commit_move(self):
273
        """Test commit of revisions with moved files and directories"""
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
274
        eq = self.assertEquals
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
275
        wt = self.make_branch_and_tree('.')
276
        b = wt.branch
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
277
        r1 = 'test@rev-1'
1291 by Martin Pool
- add test for moving files between directories
278
        self.build_tree(['hello', 'a/', 'b/'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
279
        wt.add(['hello', 'a', 'b'], ['hello-id', 'a-id', 'b-id'])
280
        wt.commit('initial', rev_id=r1, allow_pointless=False)
281
        wt.move(['hello'], 'a')
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
282
        r2 = 'test@rev-2'
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
283
        wt.commit('two', rev_id=r2, allow_pointless=False)
2255.2.136 by John Arbash Meinel
(James Westby) add read locks around read_working_inventory() in test_commit_move
284
        wt.lock_read()
285
        try:
286
            self.check_inventory_shape(wt.read_working_inventory(),
2545.3.2 by James Westby
Add a test for check_inventory_shape.
287
                                       ['a/', 'a/hello', 'b/'])
2255.2.136 by John Arbash Meinel
(James Westby) add read locks around read_working_inventory() in test_commit_move
288
        finally:
289
            wt.unlock()
1291 by Martin Pool
- add test for moving files between directories
290
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
291
        wt.move(['b'], 'a')
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
292
        r3 = 'test@rev-3'
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
293
        wt.commit('three', rev_id=r3, allow_pointless=False)
2255.2.136 by John Arbash Meinel
(James Westby) add read locks around read_working_inventory() in test_commit_move
294
        wt.lock_read()
295
        try:
296
            self.check_inventory_shape(wt.read_working_inventory(),
2545.3.2 by James Westby
Add a test for check_inventory_shape.
297
                                       ['a/', 'a/hello', 'a/b/'])
5035.3.1 by Jelmer Vernooij
Remove Repository.get_revision_inventory.
298
            self.check_inventory_shape(b.repository.get_inventory(r3),
2545.3.2 by James Westby
Add a test for check_inventory_shape.
299
                                       ['a/', 'a/hello', 'a/b/'])
2255.2.136 by John Arbash Meinel
(James Westby) add read locks around read_working_inventory() in test_commit_move
300
        finally:
301
            wt.unlock()
1291 by Martin Pool
- add test for moving files between directories
302
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
303
        wt.move(['a/hello'], 'a/b')
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
304
        r4 = 'test@rev-4'
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
305
        wt.commit('four', rev_id=r4, allow_pointless=False)
2255.2.136 by John Arbash Meinel
(James Westby) add read locks around read_working_inventory() in test_commit_move
306
        wt.lock_read()
307
        try:
308
            self.check_inventory_shape(wt.read_working_inventory(),
2545.3.2 by James Westby
Add a test for check_inventory_shape.
309
                                       ['a/', 'a/b/hello', 'a/b/'])
2255.2.136 by John Arbash Meinel
(James Westby) add read locks around read_working_inventory() in test_commit_move
310
        finally:
311
            wt.unlock()
1306 by Martin Pool
- tests that name_version is updated properly in renames/moves
312
5035.3.1 by Jelmer Vernooij
Remove Repository.get_revision_inventory.
313
        inv = b.repository.get_inventory(r4)
1092.2.21 by Robert Collins
convert name_version to revision in inventory entries
314
        eq(inv['hello-id'].revision, r4)
315
        eq(inv['a-id'].revision, r1)
316
        eq(inv['b-id'].revision, r3)
2255.2.136 by John Arbash Meinel
(James Westby) add read locks around read_working_inventory() in test_commit_move
317
1246 by Martin Pool
- add very simple commit tests
318
    def test_removed_commit(self):
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
319
        """Commit with a removed file"""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
320
        wt = self.make_branch_and_tree('.')
321
        b = wt.branch
1247 by Martin Pool
- tests for deletion and removal of files in commits
322
        file('hello', 'w').write('hello world')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
323
        wt.add(['hello'], ['hello-id'])
324
        wt.commit(message='add hello')
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
325
        wt.remove('hello')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
326
        wt.commit('removed hello', rev_id='rev2')
1247 by Martin Pool
- tests for deletion and removal of files in commits
327
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
328
        tree = b.repository.revision_tree('rev2')
1247 by Martin Pool
- tests for deletion and removal of files in commits
329
        self.assertFalse(tree.has_id('hello-id'))
1246 by Martin Pool
- add very simple commit tests
330
1256 by Martin Pool
- test that commits append to the tree's ancestry
331
    def test_committed_ancestry(self):
332
        """Test commit appends revisions to ancestry."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
333
        wt = self.make_branch_and_tree('.')
334
        b = wt.branch
1256 by Martin Pool
- test that commits append to the tree's ancestry
335
        rev_ids = []
336
        for i in range(4):
337
            file('hello', 'w').write((str(i) * 4) + '\n')
338
            if i == 0:
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
339
                wt.add(['hello'], ['hello-id'])
1256 by Martin Pool
- test that commits append to the tree's ancestry
340
            rev_id = 'test@rev-%d' % (i+1)
341
            rev_ids.append(rev_id)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
342
            wt.commit(message='rev %d' % (i+1),
1256 by Martin Pool
- test that commits append to the tree's ancestry
343
                     rev_id=rev_id)
344
        eq = self.assertEquals
345
        eq(b.revision_history(), rev_ids)
346
        for i in range(4):
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
347
            anc = b.repository.get_ancestry(rev_ids[i])
1390 by Robert Collins
pair programming worx... merge integration and weave
348
            eq(anc, [None] + rev_ids[:i+1])
1416 by Robert Collins
when committing a specific file, include all its parents
349
350
    def test_commit_new_subdir_child_selective(self):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
351
        wt = self.make_branch_and_tree('.')
352
        b = wt.branch
1416 by Robert Collins
when committing a specific file, include all its parents
353
        self.build_tree(['dir/', 'dir/file1', 'dir/file2'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
354
        wt.add(['dir', 'dir/file1', 'dir/file2'],
1416 by Robert Collins
when committing a specific file, include all its parents
355
              ['dirid', 'file1id', 'file2id'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
356
        wt.commit('dir/file1', specific_files=['dir/file1'], rev_id='1')
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
357
        inv = b.repository.get_inventory('1')
1416 by Robert Collins
when committing a specific file, include all its parents
358
        self.assertEqual('1', inv['dirid'].revision)
359
        self.assertEqual('1', inv['file1id'].revision)
360
        # FIXME: This should raise a KeyError I think, rbc20051006
361
        self.assertRaises(BzrError, inv.__getitem__, 'file2id')
1185.16.65 by mbp at sourcefrog
- new commit --strict option
362
363
    def test_strict_commit(self):
364
        """Try and commit with unknown files and strict = True, should fail."""
365
        from bzrlib.errors import StrictCommitFailed
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
366
        wt = self.make_branch_and_tree('.')
367
        b = wt.branch
1185.16.65 by mbp at sourcefrog
- new commit --strict option
368
        file('hello', 'w').write('hello world')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
369
        wt.add('hello')
1185.16.65 by mbp at sourcefrog
- new commit --strict option
370
        file('goodbye', 'w').write('goodbye cruel world!')
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
371
        self.assertRaises(StrictCommitFailed, wt.commit,
1185.16.65 by mbp at sourcefrog
- new commit --strict option
372
            message='add hello but not goodbye', strict=True)
373
1185.22.4 by Michael Ellerman
Strict commit was a little .. ah .. too strict, oops :}
374
    def test_strict_commit_without_unknowns(self):
375
        """Try and commit with no unknown files and strict = True,
376
        should work."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
377
        wt = self.make_branch_and_tree('.')
378
        b = wt.branch
1185.22.4 by Michael Ellerman
Strict commit was a little .. ah .. too strict, oops :}
379
        file('hello', 'w').write('hello world')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
380
        wt.add('hello')
381
        wt.commit(message='add hello', strict=True)
1185.22.4 by Michael Ellerman
Strict commit was a little .. ah .. too strict, oops :}
382
1185.16.65 by mbp at sourcefrog
- new commit --strict option
383
    def test_nonstrict_commit(self):
384
        """Try and commit with unknown files and strict = False, should work."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
385
        wt = self.make_branch_and_tree('.')
386
        b = wt.branch
1185.16.65 by mbp at sourcefrog
- new commit --strict option
387
        file('hello', 'w').write('hello world')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
388
        wt.add('hello')
1185.16.65 by mbp at sourcefrog
- new commit --strict option
389
        file('goodbye', 'w').write('goodbye cruel world!')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
390
        wt.commit(message='add hello but not goodbye', strict=False)
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
391
1185.22.4 by Michael Ellerman
Strict commit was a little .. ah .. too strict, oops :}
392
    def test_nonstrict_commit_without_unknowns(self):
393
        """Try and commit with no unknown files and strict = False,
394
        should work."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
395
        wt = self.make_branch_and_tree('.')
396
        b = wt.branch
1185.22.4 by Michael Ellerman
Strict commit was a little .. ah .. too strict, oops :}
397
        file('hello', 'w').write('hello world')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
398
        wt.add('hello')
399
        wt.commit(message='add hello', strict=False)
1185.22.4 by Michael Ellerman
Strict commit was a little .. ah .. too strict, oops :}
400
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
401
    def test_signed_commit(self):
402
        import bzrlib.gpg
403
        import bzrlib.commit as commit
404
        oldstrategy = bzrlib.gpg.GPGStrategy
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
405
        wt = self.make_branch_and_tree('.')
406
        branch = wt.branch
407
        wt.commit("base", allow_pointless=True, rev_id='A')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
408
        self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
409
        try:
410
            from bzrlib.testament import Testament
411
            # monkey patch gpg signing mechanism
412
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.LoopbackGPGStrategy
2149.1.3 by Aaron Bentley
Updates from review comments
413
            commit.Commit(config=MustSignConfig(branch)).commit(message="base",
414
                                                      allow_pointless=True,
415
                                                      rev_id='B',
416
                                                      working_tree=wt)
1551.12.15 by Aaron Bentley
add header/trailer to fake clearsigned texts
417
            def sign(text):
418
                return bzrlib.gpg.LoopbackGPGStrategy(None).sign(text)
419
            self.assertEqual(sign(Testament.from_revision(branch.repository,
420
                             'B').as_short_text()),
1563.2.31 by Robert Collins
Convert Knit repositories to use knits.
421
                             branch.repository.get_signature_text('B'))
1442.1.60 by Robert Collins
gpg sign commits if the policy says we need to
422
        finally:
423
            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.
424
425
    def test_commit_failed_signature(self):
426
        import bzrlib.gpg
427
        import bzrlib.commit as commit
428
        oldstrategy = bzrlib.gpg.GPGStrategy
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
429
        wt = self.make_branch_and_tree('.')
430
        branch = wt.branch
431
        wt.commit("base", allow_pointless=True, rev_id='A')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
432
        self.assertFalse(branch.repository.has_signature_for_revision_id('A'))
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
433
        try:
434
            # monkey patch gpg signing mechanism
435
            bzrlib.gpg.GPGStrategy = bzrlib.gpg.DisabledGPGStrategy
436
            config = MustSignConfig(branch)
437
            self.assertRaises(SigningFailed,
438
                              commit.Commit(config=config).commit,
1534.4.34 by Robert Collins
Fix remaining uses of deprecated apis within bzrlib.
439
                              message="base",
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
440
                              allow_pointless=True,
1534.4.34 by Robert Collins
Fix remaining uses of deprecated apis within bzrlib.
441
                              rev_id='B',
442
                              working_tree=wt)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
443
            branch = Branch.open(self.get_url('.'))
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
444
            self.assertEqual(branch.revision_history(), ['A'])
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
445
            self.assertFalse(branch.repository.has_revision('B'))
1442.1.62 by Robert Collins
Allow creation of testaments from uncommitted data, and use that to get signatures before committing revisions.
446
        finally:
447
            bzrlib.gpg.GPGStrategy = oldstrategy
1472 by Robert Collins
post commit hook, first pass implementation
448
449
    def test_commit_invokes_hooks(self):
450
        import bzrlib.commit as commit
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
451
        wt = self.make_branch_and_tree('.')
452
        branch = wt.branch
1472 by Robert Collins
post commit hook, first pass implementation
453
        calls = []
454
        def called(branch, rev_id):
455
            calls.append('called')
456
        bzrlib.ahook = called
457
        try:
458
            config = BranchWithHooks(branch)
459
            commit.Commit(config=config).commit(
2149.1.3 by Aaron Bentley
Updates from review comments
460
                            message = "base",
1472 by Robert Collins
post commit hook, first pass implementation
461
                            allow_pointless=True,
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
462
                            rev_id='A', working_tree = wt)
1472 by Robert Collins
post commit hook, first pass implementation
463
            self.assertEqual(['called', 'called'], calls)
464
        finally:
465
            del bzrlib.ahook
1593.1.1 by Robert Collins
Move responsibility for setting branch nickname in commits to the WorkingTree convenience function.
466
467
    def test_commit_object_doesnt_set_nick(self):
468
        # using the Commit object directly does not set the branch nick.
469
        wt = self.make_branch_and_tree('.')
470
        c = Commit()
2149.1.3 by Aaron Bentley
Updates from review comments
471
        c.commit(working_tree=wt, message='empty tree', allow_pointless=True)
1593.1.1 by Robert Collins
Move responsibility for setting branch nickname in commits to the WorkingTree convenience function.
472
        self.assertEquals(wt.branch.revno(), 1)
473
        self.assertEqual({},
474
                         wt.branch.repository.get_revision(
475
                            wt.branch.last_revision()).properties)
476
1614.1.1 by Aaron Bentley
Fixed master locking in commit
477
    def test_safe_master_lock(self):
478
        os.mkdir('master')
479
        master = BzrDirMetaFormat1().initialize('master')
480
        master.create_repository()
481
        master_branch = master.create_branch()
482
        master.create_workingtree()
483
        bound = master.sprout('bound')
484
        wt = bound.open_workingtree()
485
        wt.branch.set_bound_location(os.path.realpath('master'))
486
        master_branch.lock_write()
1658.1.5 by Martin Pool
Release more locks taken during test suite
487
        try:
488
            self.assertRaises(LockContention, wt.commit, 'silly')
489
        finally:
490
            master_branch.unlock()
1668.1.3 by Martin Pool
[patch] use the correct transaction when committing snapshot (Malone: #43959)
491
492
    def test_commit_bound_merge(self):
493
        # see bug #43959; commit of a merge in a bound branch fails to push
494
        # the new commit into the master
495
        master_branch = self.make_branch('master')
496
        bound_tree = self.make_branch_and_tree('bound')
497
        bound_tree.branch.bind(master_branch)
498
499
        self.build_tree_contents([('bound/content_file', 'initial contents\n')])
500
        bound_tree.add(['content_file'])
501
        bound_tree.commit(message='woo!')
502
503
        other_bzrdir = master_branch.bzrdir.sprout('other')
504
        other_tree = other_bzrdir.open_workingtree()
505
4775.1.1 by Martin Pool
Remove several 'the the' typos
506
        # do a commit to the other branch changing the content file so
1668.1.3 by Martin Pool
[patch] use the correct transaction when committing snapshot (Malone: #43959)
507
        # that our commit after merging will have a merged revision in the
508
        # content file history.
509
        self.build_tree_contents([('other/content_file', 'change in other\n')])
510
        other_tree.commit('change in other')
511
512
        # do a merge into the bound branch from other, and then change the
513
        # content file locally to force a new revision (rather than using the
514
        # revision from other). This forces extra processing in commit.
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
515
        bound_tree.merge_from_branch(other_tree.branch)
1668.1.3 by Martin Pool
[patch] use the correct transaction when committing snapshot (Malone: #43959)
516
        self.build_tree_contents([('bound/content_file', 'change in bound\n')])
517
518
        # before #34959 was fixed, this failed with 'revision not present in
519
        # weave' when trying to implicitly push from the bound branch to the master
520
        bound_tree.commit(message='commit of merge in bound tree')
1668.1.5 by Martin Pool
[broken] fix up display of files changed by a commit
521
522
    def test_commit_reporting_after_merge(self):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
523
        # when doing a commit of a merge, the reporter needs to still
1668.1.5 by Martin Pool
[broken] fix up display of files changed by a commit
524
        # be called for each item that is added/removed/deleted.
525
        this_tree = self.make_branch_and_tree('this')
526
        # we need a bunch of files and dirs, to perform one action on each.
527
        self.build_tree([
528
            'this/dirtorename/',
529
            'this/dirtoreparent/',
530
            'this/dirtoleave/',
531
            'this/dirtoremove/',
532
            'this/filetoreparent',
533
            'this/filetorename',
534
            'this/filetomodify',
535
            'this/filetoremove',
536
            'this/filetoleave']
537
            )
538
        this_tree.add([
539
            'dirtorename',
540
            'dirtoreparent',
541
            'dirtoleave',
542
            'dirtoremove',
543
            'filetoreparent',
544
            'filetorename',
545
            'filetomodify',
546
            'filetoremove',
547
            'filetoleave']
548
            )
549
        this_tree.commit('create_files')
550
        other_dir = this_tree.bzrdir.sprout('other')
551
        other_tree = other_dir.open_workingtree()
552
        other_tree.lock_write()
553
        # perform the needed actions on the files and dirs.
554
        try:
555
            other_tree.rename_one('dirtorename', 'renameddir')
556
            other_tree.rename_one('dirtoreparent', 'renameddir/reparenteddir')
557
            other_tree.rename_one('filetorename', 'renamedfile')
558
            other_tree.rename_one('filetoreparent', 'renameddir/reparentedfile')
559
            other_tree.remove(['dirtoremove', 'filetoremove'])
560
            self.build_tree_contents([
561
                ('other/newdir/', ),
562
                ('other/filetomodify', 'new content'),
563
                ('other/newfile', 'new file content')])
564
            other_tree.add('newfile')
565
            other_tree.add('newdir/')
566
            other_tree.commit('modify all sample files and dirs.')
567
        finally:
568
            other_tree.unlock()
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
569
        this_tree.merge_from_branch(other_tree.branch)
1668.1.5 by Martin Pool
[broken] fix up display of files changed by a commit
570
        reporter = CapturingReporter()
571
        this_tree.commit('do the commit', reporter=reporter)
4183.5.5 by Robert Collins
Enable record_iter_changes for cases where it can work.
572
        expected = set([
1668.1.5 by Martin Pool
[broken] fix up display of files changed by a commit
573
            ('change', 'modified', 'filetomodify'),
574
            ('change', 'added', 'newdir'),
575
            ('change', 'added', 'newfile'),
576
            ('renamed', 'renamed', 'dirtorename', 'renameddir'),
2829.1.1 by Ian Clatworthy
re-apply Aaron's fix for #94975 (Ian Clatworthy)
577
            ('renamed', 'renamed', 'filetorename', 'renamedfile'),
1668.1.5 by Martin Pool
[broken] fix up display of files changed by a commit
578
            ('renamed', 'renamed', 'dirtoreparent', 'renameddir/reparenteddir'),
579
            ('renamed', 'renamed', 'filetoreparent', 'renameddir/reparentedfile'),
580
            ('deleted', 'dirtoremove'),
581
            ('deleted', 'filetoremove'),
4183.5.5 by Robert Collins
Enable record_iter_changes for cases where it can work.
582
            ])
583
        result = set(reporter.calls)
584
        missing = expected - result
585
        new = result - expected
586
        self.assertEqual((set(), set()), (missing, new))
1551.7.24 by Aaron Bentley
Ensure commit respects file spec when committing removals
587
588
    def test_commit_removals_respects_filespec(self):
589
        """Commit respects the specified_files for removals."""
590
        tree = self.make_branch_and_tree('.')
591
        self.build_tree(['a', 'b'])
592
        tree.add(['a', 'b'])
593
        tree.commit('added a, b')
594
        tree.remove(['a', 'b'])
1906.1.1 by Robert Collins
(robertc) Trivial change to test_commit_removals_respects_filespec to be easir to read.
595
        tree.commit('removed a', specific_files='a')
2255.2.148 by John Arbash Meinel
lock a basis tree during a commit test.
596
        basis = tree.basis_tree()
597
        tree.lock_read()
598
        try:
599
            self.assertIs(None, basis.path2id('a'))
600
            self.assertFalse(basis.path2id('b') is None)
601
        finally:
602
            tree.unlock()
1864.2.1 by John Arbash Meinel
Commit timestamp restricted to 1ms precision.
603
604
    def test_commit_saves_1ms_timestamp(self):
605
        """Passing in a timestamp is saved with 1ms resolution"""
606
        tree = self.make_branch_and_tree('.')
607
        self.build_tree(['a'])
608
        tree.add('a')
609
        tree.commit('added a', timestamp=1153248633.4186721, timezone=0,
610
                    rev_id='a1')
611
612
        rev = tree.branch.repository.get_revision('a1')
613
        self.assertEqual(1153248633.419, rev.timestamp)
614
615
    def test_commit_has_1ms_resolution(self):
616
        """Allowing commit to generate the timestamp also has 1ms resolution"""
617
        tree = self.make_branch_and_tree('.')
618
        self.build_tree(['a'])
619
        tree.add('a')
620
        tree.commit('added a', rev_id='a1')
621
622
        rev = tree.branch.repository.get_revision('a1')
623
        timestamp = rev.timestamp
624
        timestamp_1ms = round(timestamp, 3)
625
        self.assertEqual(timestamp_1ms, timestamp)
1959.4.1 by Aaron Bentley
Correctly handle all file kind changes
626
2255.2.135 by John Arbash Meinel
Add locking in the test_commit_kind_changes test.
627
    def assertBasisTreeKind(self, kind, tree, file_id):
628
        basis = tree.basis_tree()
629
        basis.lock_read()
630
        try:
631
            self.assertEqual(kind, basis.kind(file_id))
632
        finally:
633
            basis.unlock()
634
1959.4.1 by Aaron Bentley
Correctly handle all file kind changes
635
    def test_commit_kind_changes(self):
2949.5.1 by Alexander Belchenko
selftest: use SymlinkFeature instead of TestSkipped where appropriate
636
        self.requireFeature(SymlinkFeature)
1959.4.1 by Aaron Bentley
Correctly handle all file kind changes
637
        tree = self.make_branch_and_tree('.')
638
        os.symlink('target', 'name')
639
        tree.add('name', 'a-file-id')
640
        tree.commit('Added a symlink')
2255.2.135 by John Arbash Meinel
Add locking in the test_commit_kind_changes test.
641
        self.assertBasisTreeKind('symlink', tree, 'a-file-id')
1959.4.1 by Aaron Bentley
Correctly handle all file kind changes
642
643
        os.unlink('name')
644
        self.build_tree(['name'])
645
        tree.commit('Changed symlink to file')
2255.2.135 by John Arbash Meinel
Add locking in the test_commit_kind_changes test.
646
        self.assertBasisTreeKind('file', tree, 'a-file-id')
1959.4.1 by Aaron Bentley
Correctly handle all file kind changes
647
648
        os.unlink('name')
649
        os.symlink('target', 'name')
650
        tree.commit('file to symlink')
2255.2.135 by John Arbash Meinel
Add locking in the test_commit_kind_changes test.
651
        self.assertBasisTreeKind('symlink', tree, 'a-file-id')
1959.4.1 by Aaron Bentley
Correctly handle all file kind changes
652
653
        os.unlink('name')
654
        os.mkdir('name')
655
        tree.commit('symlink to directory')
2255.2.135 by John Arbash Meinel
Add locking in the test_commit_kind_changes test.
656
        self.assertBasisTreeKind('directory', tree, 'a-file-id')
1959.4.1 by Aaron Bentley
Correctly handle all file kind changes
657
658
        os.rmdir('name')
659
        os.symlink('target', 'name')
660
        tree.commit('directory to symlink')
2255.2.135 by John Arbash Meinel
Add locking in the test_commit_kind_changes test.
661
        self.assertBasisTreeKind('symlink', tree, 'a-file-id')
1959.4.1 by Aaron Bentley
Correctly handle all file kind changes
662
663
        # prepare for directory <-> file tests
664
        os.unlink('name')
665
        os.mkdir('name')
666
        tree.commit('symlink to directory')
2255.2.135 by John Arbash Meinel
Add locking in the test_commit_kind_changes test.
667
        self.assertBasisTreeKind('directory', tree, 'a-file-id')
1959.4.1 by Aaron Bentley
Correctly handle all file kind changes
668
669
        os.rmdir('name')
670
        self.build_tree(['name'])
671
        tree.commit('Changed directory to file')
2255.2.135 by John Arbash Meinel
Add locking in the test_commit_kind_changes test.
672
        self.assertBasisTreeKind('file', tree, 'a-file-id')
1959.4.1 by Aaron Bentley
Correctly handle all file kind changes
673
674
        os.unlink('name')
675
        os.mkdir('name')
676
        tree.commit('file to directory')
2255.2.135 by John Arbash Meinel
Add locking in the test_commit_kind_changes test.
677
        self.assertBasisTreeKind('directory', tree, 'a-file-id')
1959.4.2 by Aaron Bentley
Merge bzr.dev
678
1551.8.29 by Aaron Bentley
Stop accepting non-existant files in commit (#50793)
679
    def test_commit_unversioned_specified(self):
680
        """Commit should raise if specified files isn't in basis or worktree"""
681
        tree = self.make_branch_and_tree('.')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
682
        self.assertRaises(errors.PathsNotVersionedError, tree.commit,
1551.8.29 by Aaron Bentley
Stop accepting non-existant files in commit (#50793)
683
                          'message', specific_files=['bogus'])
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
684
685
    class Callback(object):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
686
2149.1.4 by Aaron Bentley
Add additional test that callback is called with a Commit instance
687
        def __init__(self, message, testcase):
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
688
            self.called = False
689
            self.message = message
2149.1.4 by Aaron Bentley
Add additional test that callback is called with a Commit instance
690
            self.testcase = testcase
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
691
2149.1.4 by Aaron Bentley
Add additional test that callback is called with a Commit instance
692
        def __call__(self, commit_obj):
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
693
            self.called = True
2149.1.4 by Aaron Bentley
Add additional test that callback is called with a Commit instance
694
            self.testcase.assertTrue(isinstance(commit_obj, Commit))
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
695
            return self.message
696
697
    def test_commit_callback(self):
698
        """Commit should invoke a callback to get the message"""
699
700
        tree = self.make_branch_and_tree('.')
701
        try:
702
            tree.commit()
703
        except Exception, e:
704
            self.assertTrue(isinstance(e, BzrError))
2149.1.3 by Aaron Bentley
Updates from review comments
705
            self.assertEqual('The message or message_callback keyword'
706
                             ' parameter is required for commit().', str(e))
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
707
        else:
708
            self.fail('exception not raised')
2149.1.4 by Aaron Bentley
Add additional test that callback is called with a Commit instance
709
        cb = self.Callback(u'commit 1', self)
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
710
        tree.commit(message_callback=cb)
711
        self.assertTrue(cb.called)
712
        repository = tree.branch.repository
713
        message = repository.get_revision(tree.last_revision()).message
714
        self.assertEqual('commit 1', message)
715
716
    def test_no_callback_pointless(self):
717
        """Callback should not be invoked for pointless commit"""
718
        tree = self.make_branch_and_tree('.')
2149.1.4 by Aaron Bentley
Add additional test that callback is called with a Commit instance
719
        cb = self.Callback(u'commit 2', self)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
720
        self.assertRaises(PointlessCommit, tree.commit, message_callback=cb,
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
721
                          allow_pointless=False)
722
        self.assertFalse(cb.called)
723
724
    def test_no_callback_netfailure(self):
725
        """Callback should not be invoked if connectivity fails"""
2149.1.3 by Aaron Bentley
Updates from review comments
726
        tree = self.make_branch_and_tree('.')
2149.1.4 by Aaron Bentley
Add additional test that callback is called with a Commit instance
727
        cb = self.Callback(u'commit 2', self)
2149.1.3 by Aaron Bentley
Updates from review comments
728
        repository = tree.branch.repository
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
729
        # simulate network failure
4617.2.1 by Robert Collins
Fix test_commit for use with 2a as the default repository.
730
        def raise_(self, arg, arg2, arg3=None, arg4=None):
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
731
            raise errors.NoSuchFile('foo')
732
        repository.add_inventory = raise_
4617.2.1 by Robert Collins
Fix test_commit for use with 2a as the default repository.
733
        repository.add_inventory_by_delta = raise_
2149.1.1 by Aaron Bentley
Provide a message_callback parameter to tree.commit
734
        self.assertRaises(errors.NoSuchFile, tree.commit, message_callback=cb)
735
        self.assertFalse(cb.called)
1551.15.9 by Aaron Bentley
Better error for selected-file commit of merges
736
737
    def test_selected_file_merge_commit(self):
738
        """Ensure the correct error is raised"""
739
        tree = self.make_branch_and_tree('foo')
740
        # pending merge would turn into a left parent
741
        tree.commit('commit 1')
742
        tree.add_parent_tree_id('example')
743
        self.build_tree(['foo/bar', 'foo/baz'])
744
        tree.add(['bar', 'baz'])
745
        err = self.assertRaises(errors.CannotCommitSelectedFileMerge,
746
            tree.commit, 'commit 2', specific_files=['bar', 'baz'])
747
        self.assertEqual(['bar', 'baz'], err.files)
748
        self.assertEqual('Selected-file commit of merges is not supported'
749
                         ' yet: files bar, baz', str(err))
2671.2.2 by Lukáš Lalinský
Move setting of the author revision property to MutableTree.commit. Don't use try/except KeyError in LongLogFormatter to display authors and branch-nicks. Removed warning about missing e-mail in the authors name.
750
2829.1.1 by Ian Clatworthy
re-apply Aaron's fix for #94975 (Ian Clatworthy)
751
    def test_commit_ordering(self):
752
        """Test of corner-case commit ordering error"""
753
        tree = self.make_branch_and_tree('.')
754
        self.build_tree(['a/', 'a/z/', 'a/c/', 'a/z/x', 'a/z/y'])
755
        tree.add(['a/', 'a/z/', 'a/c/', 'a/z/x', 'a/z/y'])
756
        tree.commit('setup')
757
        self.build_tree(['a/c/d/'])
758
        tree.add('a/c/d')
759
        tree.rename_one('a/z/x', 'a/c/d/x')
760
        tree.commit('test', specific_files=['a/z/y'])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
761
2671.2.2 by Lukáš Lalinský
Move setting of the author revision property to MutableTree.commit. Don't use try/except KeyError in LongLogFormatter to display authors and branch-nicks. Removed warning about missing e-mail in the authors name.
762
    def test_commit_no_author(self):
763
        """The default kwarg author in MutableTree.commit should not add
764
        the 'author' revision property.
765
        """
766
        tree = self.make_branch_and_tree('foo')
767
        rev_id = tree.commit('commit 1')
768
        rev = tree.branch.repository.get_revision(rev_id)
769
        self.assertFalse('author' in rev.properties)
4056.2.3 by James Westby
Use a new "authors" revision property to allow multiple authors
770
        self.assertFalse('authors' in rev.properties)
2671.2.2 by Lukáš Lalinský
Move setting of the author revision property to MutableTree.commit. Don't use try/except KeyError in LongLogFormatter to display authors and branch-nicks. Removed warning about missing e-mail in the authors name.
771
772
    def test_commit_author(self):
773
        """Passing a non-empty author kwarg to MutableTree.commit should add
774
        the 'author' revision property.
775
        """
776
        tree = self.make_branch_and_tree('foo')
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
777
        rev_id = self.callDeprecated(['The parameter author was '
778
                'deprecated in version 1.13. Use authors instead'],
779
                tree.commit, 'commit 1', author='John Doe <jdoe@example.com>')
2671.2.2 by Lukáš Lalinský
Move setting of the author revision property to MutableTree.commit. Don't use try/except KeyError in LongLogFormatter to display authors and branch-nicks. Removed warning about missing e-mail in the authors name.
780
        rev = tree.branch.repository.get_revision(rev_id)
781
        self.assertEqual('John Doe <jdoe@example.com>',
4056.2.3 by James Westby
Use a new "authors" revision property to allow multiple authors
782
                         rev.properties['authors'])
783
        self.assertFalse('author' in rev.properties)
3113.6.7 by Aaron Bentley
Fix commit for a checkout sharing a repo with its branch (abentley, #177592)
784
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
785
    def test_commit_empty_authors_list(self):
786
        """Passing an empty list to authors shouldn't add the property."""
787
        tree = self.make_branch_and_tree('foo')
788
        rev_id = tree.commit('commit 1', authors=[])
789
        rev = tree.branch.repository.get_revision(rev_id)
790
        self.assertFalse('author' in rev.properties)
4056.2.3 by James Westby
Use a new "authors" revision property to allow multiple authors
791
        self.assertFalse('authors' in rev.properties)
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
792
793
    def test_multiple_authors(self):
794
        tree = self.make_branch_and_tree('foo')
795
        rev_id = tree.commit('commit 1',
796
                authors=['John Doe <jdoe@example.com>',
797
                         'Jane Rey <jrey@example.com>'])
798
        rev = tree.branch.repository.get_revision(rev_id)
799
        self.assertEqual('John Doe <jdoe@example.com>\n'
4056.2.3 by James Westby
Use a new "authors" revision property to allow multiple authors
800
                'Jane Rey <jrey@example.com>', rev.properties['authors'])
801
        self.assertFalse('author' in rev.properties)
4056.2.1 by James Westby
Allow specifying multiple authors for a revision.
802
803
    def test_author_and_authors_incompatible(self):
804
        tree = self.make_branch_and_tree('foo')
805
        self.assertRaises(AssertionError, tree.commit, 'commit 1',
806
                authors=['John Doe <jdoe@example.com>',
807
                         'Jane Rey <jrey@example.com>'],
808
                author="Jack Me <jme@example.com>")
809
810
    def test_author_with_newline_rejected(self):
811
        tree = self.make_branch_and_tree('foo')
812
        self.assertRaises(AssertionError, tree.commit, 'commit 1',
813
                authors=['John\nDoe <jdoe@example.com>'])
814
3113.6.7 by Aaron Bentley
Fix commit for a checkout sharing a repo with its branch (abentley, #177592)
815
    def test_commit_with_checkout_and_branch_sharing_repo(self):
816
        repo = self.make_repository('repo', shared=True)
817
        # make_branch_and_tree ignores shared repos
818
        branch = bzrdir.BzrDir.create_branch_convenience('repo/branch')
819
        tree2 = branch.create_checkout('repo/tree2')
820
        tree2.commit('message', rev_id='rev1')
821
        self.assertTrue(tree2.branch.repository.has_revision('rev1'))