/brz/remove-bazaar

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