/brz/remove-bazaar

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