/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) 2006-2012, 2016 Canonical Ltd
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
2
# Authors:  Robert Collins <robert.collins@canonical.com>
2255.13.4 by Martin Pool
merge
3
#           and others
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
4
#
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
9
#
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
# GNU General Public License for more details.
14
#
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
17
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
18
3136.1.10 by Aaron Bentley
Clean error if filesystem does not support hard-links
19
import errno
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
20
import os
21
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
22
from ... import (
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
23
    branch,
6059.4.4 by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config.
24
    config,
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
25
    controldir,
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
26
    errors,
27
    osutils,
6241.3.1 by Jelmer Vernooij
Support WorkingTree.clone() having its revision argument set to the NULL revision.
28
    revision as _mod_revision,
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
29
    tests,
6059.4.4 by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config.
30
    trace,
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
31
    urlutils,
5582.4.3 by Jelmer Vernooij
remove more unused imports, avoid relying on a specific set of working tree formats that support references.
32
    )
6670.4.15 by Jelmer Vernooij
Fix per workingtree tests.
33
from...bzr import (
34
    bzrdir,
35
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
36
from ...errors import (
5582.4.3 by Jelmer Vernooij
remove more unused imports, avoid relying on a specific set of working tree formats that support references.
37
    UnsupportedOperation,
38
    PathsNotVersionedError,
39
    )
6670.4.3 by Jelmer Vernooij
Fix more imports.
40
from ...bzr.inventory import Inventory
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
41
from ...mutabletree import MutableTree
42
from ...osutils import pathjoin, getcwd, has_symlinks
43
from ...sixish import (
7045.4.4 by Jelmer Vernooij
Fix more git tests.
44
    StringIO,
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
45
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
46
from .. import (
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
47
    features,
48
    TestSkipped,
49
    TestNotApplicable,
50
    )
7143.15.2 by Jelmer Vernooij
Run autopep8.
51
from . import TestCaseWithWorkingTree
6670.4.3 by Jelmer Vernooij
Fix more imports.
52
from ...bzr.workingtree import (
6653.5.1 by Jelmer Vernooij
Fix some more tests.
53
    InventoryWorkingTree,
54
    )
6846.6.1 by Jelmer Vernooij
Move Tree{Link,File,Directory,Entry} to breezy.tree.
55
from ...tree import (
5582.4.3 by Jelmer Vernooij
remove more unused imports, avoid relying on a specific set of working tree formats that support references.
56
    TreeDirectory,
57
    TreeFile,
58
    TreeLink,
6846.6.1 by Jelmer Vernooij
Move Tree{Link,File,Directory,Entry} to breezy.tree.
59
    )
60
from ...conflicts import ConflictList, TextConflict, ContentsConflict
61
from ...workingtree import (
62
    SettingFileIdUnsupported,
5582.4.3 by Jelmer Vernooij
remove more unused imports, avoid relying on a specific set of working tree formats that support references.
63
    WorkingTree,
64
    )
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
65
1711.7.19 by John Arbash Meinel
file:// urls look slightly different on win32
66
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
67
class TestWorkingTree(TestCaseWithWorkingTree):
68
6437.70.6 by John Arbash Meinel
Fix a couple tests that wanted to directly create a wt where the branch was.
69
    def requireBranchReference(self):
70
        test_branch = self.make_branch('test-branch')
71
        try:
72
            # if there is a working tree now, this is not supported.
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
73
            test_branch.controldir.open_workingtree()
6437.70.6 by John Arbash Meinel
Fix a couple tests that wanted to directly create a wt where the branch was.
74
            raise TestNotApplicable("only on trees that can be separate"
7143.15.2 by Jelmer Vernooij
Run autopep8.
75
                                    " from their branch.")
6437.70.6 by John Arbash Meinel
Fix a couple tests that wanted to directly create a wt where the branch was.
76
        except (errors.NoWorkingTree, errors.NotLocalUrl):
77
            pass
78
5516.1.1 by Vincent Ladeuil
TestCaseWithWorkingTree.make_branch_builder respects its relpath parameter.
79
    def test_branch_builder(self):
80
        # Just a smoke test that we get a branch at the specified relpath
81
        builder = self.make_branch_builder('foobar')
6437.70.9 by John Arbash Meinel
branch_builder builds in the branch/repository location, not in the wt location.
82
        br = branch.Branch.open(self.get_url('foobar'))
5516.1.1 by Vincent Ladeuil
TestCaseWithWorkingTree.make_branch_builder respects its relpath parameter.
83
1732.1.8 by John Arbash Meinel
Adding a test for list_files
84
    def test_list_files(self):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
85
        tree = self.make_branch_and_tree('.')
1732.1.8 by John Arbash Meinel
Adding a test for list_files
86
        self.build_tree(['dir/', 'file'])
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
87
        if has_symlinks():
88
            os.symlink('target', 'symlink')
2255.2.52 by Robert Collins
Dirstate - fix workingtree.list_files to use the public interface to access the trees inventory.
89
        tree.lock_read()
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
90
        files = list(tree.list_files())
2255.2.52 by Robert Collins
Dirstate - fix workingtree.list_files to use the public interface to access the trees inventory.
91
        tree.unlock()
7143.15.2 by Jelmer Vernooij
Run autopep8.
92
        self.assertEqual(
93
            files.pop(0), ('dir', '?', 'directory', None, TreeDirectory()))
6861.1.1 by Jelmer Vernooij
More foreign branch test fixes.
94
        self.assertEqual(files.pop(0), ('file', '?', 'file', None, TreeFile()))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
95
        if has_symlinks():
7143.15.2 by Jelmer Vernooij
Run autopep8.
96
            self.assertEqual(files.pop(0), ('symlink', '?',
97
                                            'symlink', None, TreeLink()))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
98
1732.1.8 by John Arbash Meinel
Adding a test for list_files
99
    def test_list_files_sorted(self):
100
        tree = self.make_branch_and_tree('.')
1836.1.18 by John Arbash Meinel
Cleaned up the last failing tests. All tests pass again.
101
        self.build_tree(['dir/', 'file', 'dir/file', 'dir/b',
102
                         'dir/subdir/', 'a', 'dir/subfile',
103
                         'zz_dir/', 'zz_dir/subfile'])
2255.2.52 by Robert Collins
Dirstate - fix workingtree.list_files to use the public interface to access the trees inventory.
104
        tree.lock_read()
1836.1.18 by John Arbash Meinel
Cleaned up the last failing tests. All tests pass again.
105
        files = [(path, kind) for (path, v, kind, file_id, entry)
7143.15.2 by Jelmer Vernooij
Run autopep8.
106
                 in tree.list_files()]
2255.2.52 by Robert Collins
Dirstate - fix workingtree.list_files to use the public interface to access the trees inventory.
107
        tree.unlock()
1732.1.8 by John Arbash Meinel
Adding a test for list_files
108
        self.assertEqual([
109
            ('a', 'file'),
110
            ('dir', 'directory'),
111
            ('file', 'file'),
1732.1.25 by John Arbash Meinel
Fix list_files test, we don't need to check if children are empty if we fall off the loop.
112
            ('zz_dir', 'directory'),
1732.1.8 by John Arbash Meinel
Adding a test for list_files
113
            ], files)
114
6861.1.1 by Jelmer Vernooij
More foreign branch test fixes.
115
        with tree.lock_write():
116
            if tree.has_versioned_directories():
117
                tree.add(['dir', 'zz_dir'])
118
                files = [(path, kind) for (path, v, kind, file_id, entry)
7143.15.2 by Jelmer Vernooij
Run autopep8.
119
                         in tree.list_files()]
6861.1.1 by Jelmer Vernooij
More foreign branch test fixes.
120
                self.assertEqual([
121
                    ('a', 'file'),
122
                    ('dir', 'directory'),
123
                    ('dir/b', 'file'),
124
                    ('dir/file', 'file'),
125
                    ('dir/subdir', 'directory'),
126
                    ('dir/subfile', 'file'),
127
                    ('file', 'file'),
128
                    ('zz_dir', 'directory'),
129
                    ('zz_dir/subfile', 'file'),
130
                    ], files)
131
            else:
132
                tree.add(['dir/b'])
133
                files = [(path, kind) for (path, v, kind, file_id, entry)
7143.15.2 by Jelmer Vernooij
Run autopep8.
134
                         in tree.list_files()]
6861.1.1 by Jelmer Vernooij
More foreign branch test fixes.
135
                self.assertEqual([
136
                    ('a', 'file'),
137
                    ('dir', 'directory'),
138
                    ('dir/b', 'file'),
139
                    ('dir/file', 'file'),
140
                    ('dir/subdir', 'directory'),
141
                    ('dir/subfile', 'file'),
142
                    ('file', 'file'),
143
                    ('zz_dir', 'directory'),
144
                    ], files)
1732.1.8 by John Arbash Meinel
Adding a test for list_files
145
1551.10.29 by Aaron Bentley
Fix tree.list_files when file kind changes
146
    def test_list_files_kind_change(self):
147
        tree = self.make_branch_and_tree('tree')
148
        self.build_tree(['tree/filename'])
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
149
        tree.add('filename')
1551.10.29 by Aaron Bentley
Fix tree.list_files when file kind changes
150
        os.unlink('tree/filename')
151
        self.build_tree(['tree/filename/'])
152
        tree.lock_read()
153
        self.addCleanup(tree.unlock)
154
        result = list(tree.list_files())
155
        self.assertEqual(1, len(result))
6861.1.1 by Jelmer Vernooij
More foreign branch test fixes.
156
        if tree.has_versioned_directories():
157
            self.assertEqual(
7143.15.2 by Jelmer Vernooij
Run autopep8.
158
                ('filename', 'V', 'directory', tree.path2id('filename')),
159
                result[0][:4])
6861.1.1 by Jelmer Vernooij
More foreign branch test fixes.
160
        else:
161
            self.assertEqual(
7143.15.2 by Jelmer Vernooij
Run autopep8.
162
                ('filename', '?', 'directory', None),
163
                result[0][:4])
1551.10.29 by Aaron Bentley
Fix tree.list_files when file kind changes
164
6449.4.5 by Jelmer Vernooij
Review feedback from vila.
165
    def test_get_config_stack(self):
6449.4.1 by Jelmer Vernooij
Add convenience method WorkingTree.get_config_stack().
166
        # Smoke test that all working trees succeed getting a config
167
        wt = self.make_branch_and_tree('.')
6449.4.3 by Jelmer Vernooij
Use WorkingTree.get_config_stack.
168
        conf = wt.get_config_stack()
6449.4.6 by Jelmer Vernooij
Fix typo.
169
        self.assertIsInstance(conf, config.Stack)
6449.4.1 by Jelmer Vernooij
Add convenience method WorkingTree.get_config_stack().
170
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
171
    def test_open_containing(self):
6437.70.7 by John Arbash Meinel
one more test that wanted to have a branch reference
172
        local_wt = self.make_branch_and_tree('.')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
173
        local_url = local_wt.controldir.root_transport.base
6437.70.7 by John Arbash Meinel
one more test that wanted to have a branch reference
174
        local_base = urlutils.local_path_from_url(local_url)
175
        del local_wt
1711.7.28 by John Arbash Meinel
clean up the WorkingTree.open_containing tests
176
177
        # Empty opens '.'
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
178
        wt, relpath = WorkingTree.open_containing()
179
        self.assertEqual('', relpath)
1711.7.28 by John Arbash Meinel
clean up the WorkingTree.open_containing tests
180
        self.assertEqual(wt.basedir + '/', local_base)
181
182
        # '.' opens this dir
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
183
        wt, relpath = WorkingTree.open_containing(u'.')
184
        self.assertEqual('', relpath)
1711.7.28 by John Arbash Meinel
clean up the WorkingTree.open_containing tests
185
        self.assertEqual(wt.basedir + '/', local_base)
186
187
        # './foo' finds '.' and a relpath of 'foo'
188
        wt, relpath = WorkingTree.open_containing('./foo')
189
        self.assertEqual('foo', relpath)
190
        self.assertEqual(wt.basedir + '/', local_base)
191
192
        # abspath(foo) finds '.' and relpath of 'foo'
193
        wt, relpath = WorkingTree.open_containing('./foo')
194
        wt, relpath = WorkingTree.open_containing(getcwd() + '/foo')
195
        self.assertEqual('foo', relpath)
196
        self.assertEqual(wt.basedir + '/', local_base)
197
198
        # can even be a url: finds '.' and relpath of 'foo'
199
        wt, relpath = WorkingTree.open_containing('./foo')
200
        wt, relpath = WorkingTree.open_containing(
7143.15.2 by Jelmer Vernooij
Run autopep8.
201
            urlutils.local_path_to_url(getcwd() + '/foo'))
1711.7.28 by John Arbash Meinel
clean up the WorkingTree.open_containing tests
202
        self.assertEqual('foo', relpath)
203
        self.assertEqual(wt.basedir + '/', local_base)
204
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
205
    def test_basic_relpath(self):
206
        # for comprehensive relpath tests, see whitebox.py.
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
207
        tree = self.make_branch_and_tree('.')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
208
        self.assertEqual('child',
209
                         tree.relpath(pathjoin(getcwd(), 'child')))
210
211
    def test_lock_locks_branch(self):
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
212
        tree = self.make_branch_and_tree('.')
6437.70.8 by John Arbash Meinel
trivially implement peek_lock_mode.
213
        self.assertEqual(None, tree.branch.peek_lock_mode())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
214
        tree.lock_read()
215
        self.assertEqual('r', tree.branch.peek_lock_mode())
216
        tree.unlock()
217
        self.assertEqual(None, tree.branch.peek_lock_mode())
218
        tree.lock_write()
219
        self.assertEqual('w', tree.branch.peek_lock_mode())
220
        tree.unlock()
221
        self.assertEqual(None, tree.branch.peek_lock_mode())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
222
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
223
    def test_revert(self):
224
        """Test selected-file revert"""
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
225
        tree = self.make_branch_and_tree('.')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
226
227
        self.build_tree(['hello.txt'])
7143.15.2 by Jelmer Vernooij
Run autopep8.
228
        with open('hello.txt', 'w') as f:
229
            f.write('initial hello')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
230
1551.7.17 by Aaron Bentley
Switch to PathsNotVersioned, accept extra_trees
231
        self.assertRaises(PathsNotVersionedError,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
232
                          tree.revert, ['hello.txt'])
233
        tree.add(['hello.txt'])
234
        tree.commit('create initial hello.txt')
235
6973.10.4 by Jelmer Vernooij
Update python3.passing.
236
        self.check_file_contents('hello.txt', b'initial hello')
7143.15.2 by Jelmer Vernooij
Run autopep8.
237
        with open('hello.txt', 'w') as f:
238
            f.write('new hello')
6973.10.4 by Jelmer Vernooij
Update python3.passing.
239
        self.check_file_contents('hello.txt', b'new hello')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
240
241
        # revert file modified since last revision
242
        tree.revert(['hello.txt'])
6973.10.4 by Jelmer Vernooij
Update python3.passing.
243
        self.check_file_contents('hello.txt', b'initial hello')
244
        self.check_file_contents('hello.txt.~1~', b'new hello')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
245
246
        # reverting again does not clobber the backup
247
        tree.revert(['hello.txt'])
6973.10.4 by Jelmer Vernooij
Update python3.passing.
248
        self.check_file_contents('hello.txt', b'initial hello')
249
        self.check_file_contents('hello.txt.~1~', b'new hello')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
250
1534.10.28 by Aaron Bentley
Use numbered backup files
251
        # backup files are numbered
7143.15.2 by Jelmer Vernooij
Run autopep8.
252
        with open('hello.txt', 'w') as f:
253
            f.write('new hello2')
1534.10.28 by Aaron Bentley
Use numbered backup files
254
        tree.revert(['hello.txt'])
6973.10.4 by Jelmer Vernooij
Update python3.passing.
255
        self.check_file_contents('hello.txt', b'initial hello')
256
        self.check_file_contents('hello.txt.~1~', b'new hello')
257
        self.check_file_contents('hello.txt.~2~', b'new hello2')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
258
1558.12.7 by Aaron Bentley
Fixed revert with missing files
259
    def test_revert_missing(self):
260
        # Revert a file that has been deleted since last commit
261
        tree = self.make_branch_and_tree('.')
7143.15.2 by Jelmer Vernooij
Run autopep8.
262
        with open('hello.txt', 'w') as f:
263
            f.write('initial hello')
1558.12.7 by Aaron Bentley
Fixed revert with missing files
264
        tree.add('hello.txt')
265
        tree.commit('added hello.txt')
266
        os.unlink('hello.txt')
267
        tree.remove('hello.txt')
268
        tree.revert(['hello.txt'])
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
269
        self.assertPathExists('hello.txt')
1558.12.7 by Aaron Bentley
Fixed revert with missing files
270
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
271
    def test_versioned_files_not_unknown(self):
272
        tree = self.make_branch_and_tree('.')
1831.1.1 by Martin Pool
[merge] remove default ignore list & update
273
        self.build_tree(['hello.txt'])
1740.6.1 by Martin Pool
Remove Scratch objects used by doctests
274
        tree.add('hello.txt')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
275
        self.assertEqual(list(tree.unknowns()),
7143.15.2 by Jelmer Vernooij
Run autopep8.
276
                         [])
1831.1.1 by Martin Pool
[merge] remove default ignore list & update
277
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
278
    def test_unknowns(self):
279
        tree = self.make_branch_and_tree('.')
280
        self.build_tree(['hello.txt',
1534.10.29 by Aaron Bentley
Fixed backup numbering to match GNU standard better
281
                         'hello.txt.~1~'])
6855.4.1 by Jelmer Vernooij
Yet more bees.
282
        self.build_tree_contents([('.bzrignore', b'*.~*\n')])
1765.1.1 by Robert Collins
Remove the default ignores list from bzr, lowering the minimum overhead in bzr add.
283
        tree.add('.bzrignore')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
284
        self.assertEqual(list(tree.unknowns()),
7143.15.2 by Jelmer Vernooij
Run autopep8.
285
                         ['hello.txt'])
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
286
287
    def test_initialize(self):
288
        # initialize should create a working tree and branch in an existing dir
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
289
        t = self.make_branch_and_tree('.')
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
290
        b = branch.Branch.open('.')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
291
        self.assertEqual(t.branch.base, b.base)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
292
        t2 = WorkingTree.open('.')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
293
        self.assertEqual(t.basedir, t2.basedir)
294
        self.assertEqual(b.base, t2.branch.base)
295
        # TODO maybe we should check the branch format? not sure if its
296
        # appropriate here.
297
298
    def test_rename_dirs(self):
299
        """Test renaming directories and the files within them."""
300
        wt = self.make_branch_and_tree('.')
301
        b = wt.branch
302
        self.build_tree(['dir/', 'dir/sub/', 'dir/sub/file'])
303
        wt.add(['dir', 'dir/sub', 'dir/sub/file'])
304
305
        wt.commit('create initial state')
306
6165.4.4 by Jelmer Vernooij
Avoid .revision_history().
307
        revid = b.last_revision()
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
308
        self.log('first revision_id is {%s}' % revid)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
309
5807.1.5 by Jelmer Vernooij
Fix more things to use tree objects.
310
        tree = b.repository.revision_tree(revid)
311
        self.log('contents of tree: %r' % list(tree.iter_entries_by_dir()))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
312
5807.1.5 by Jelmer Vernooij
Fix more things to use tree objects.
313
        self.check_tree_shape(tree, ['dir/', 'dir/sub/', 'dir/sub/file'])
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
314
        wt.rename_one('dir', 'newdir')
315
2255.2.57 by Robert Collins
Dirstate test change: TestWorkingTree.test_rename_dirs should lock around accessing the trees inventory.
316
        wt.lock_read()
5807.1.5 by Jelmer Vernooij
Fix more things to use tree objects.
317
        self.check_tree_shape(wt,
7143.15.2 by Jelmer Vernooij
Run autopep8.
318
                              ['newdir/', 'newdir/sub/', 'newdir/sub/file'])
2255.2.57 by Robert Collins
Dirstate test change: TestWorkingTree.test_rename_dirs should lock around accessing the trees inventory.
319
        wt.unlock()
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
320
        wt.rename_one('newdir/sub', 'newdir/newsub')
2255.2.57 by Robert Collins
Dirstate test change: TestWorkingTree.test_rename_dirs should lock around accessing the trees inventory.
321
        wt.lock_read()
5807.1.5 by Jelmer Vernooij
Fix more things to use tree objects.
322
        self.check_tree_shape(wt, ['newdir/', 'newdir/newsub/',
7143.15.2 by Jelmer Vernooij
Run autopep8.
323
                                   'newdir/newsub/file'])
2255.2.57 by Robert Collins
Dirstate test change: TestWorkingTree.test_rename_dirs should lock around accessing the trees inventory.
324
        wt.unlock()
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
325
326
    def test_add_in_unversioned(self):
327
        """Try to add a file in an unversioned directory.
328
329
        "bzr add" adds the parent as necessary, but simple working tree add
330
        doesn't do that.
331
        """
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
332
        from breezy.errors import NotVersionedError
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
333
        wt = self.make_branch_and_tree('.')
334
        self.build_tree(['foo/',
335
                         'foo/hello'])
6072.1.2 by Jelmer Vernooij
Fix versioned directories tests.
336
        if not wt._format.supports_versioned_directories:
6072.1.1 by Jelmer Vernooij
Various fixes for tests of foreign plugins.
337
            wt.add('foo/hello')
338
        else:
339
            self.assertRaises(NotVersionedError,
340
                              wt.add,
341
                              'foo/hello')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
342
343
    def test_add_missing(self):
344
        # adding a msising file -> NoSuchFile
345
        wt = self.make_branch_and_tree('.')
346
        self.assertRaises(errors.NoSuchFile, wt.add, 'fpp')
347
348
    def test_remove_verbose(self):
7143.15.2 by Jelmer Vernooij
Run autopep8.
349
        # FIXME the remove api should not print or otherwise depend on the
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
350
        # text UI - RBC 20060124
351
        wt = self.make_branch_and_tree('.')
352
        self.build_tree(['hello'])
353
        wt.add(['hello'])
354
        wt.commit(message='add hello')
7045.4.4 by Jelmer Vernooij
Fix more git tests.
355
        stdout = StringIO()
356
        stderr = StringIO()
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
357
        self.assertEqual(None, self.apply_redirected(None, stdout, stderr,
358
                                                     wt.remove,
359
                                                     ['hello'],
360
                                                     verbose=True))
361
        self.assertEqual('?       hello\n', stdout.getvalue())
362
        self.assertEqual('', stderr.getvalue())
363
364
    def test_clone_trivial(self):
365
        wt = self.make_branch_and_tree('source')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
366
        cloned_dir = wt.controldir.clone('target')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
367
        cloned = cloned_dir.open_workingtree()
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
368
        self.assertEqual(cloned.get_parent_ids(), wt.get_parent_ids())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
369
6241.3.1 by Jelmer Vernooij
Support WorkingTree.clone() having its revision argument set to the NULL revision.
370
    def test_clone_empty(self):
371
        wt = self.make_branch_and_tree('source')
7143.15.2 by Jelmer Vernooij
Run autopep8.
372
        cloned_dir = wt.controldir.clone(
373
            'target', revision_id=_mod_revision.NULL_REVISION)
6241.3.1 by Jelmer Vernooij
Support WorkingTree.clone() having its revision argument set to the NULL revision.
374
        cloned = cloned_dir.open_workingtree()
375
        self.assertEqual(cloned.get_parent_ids(), wt.get_parent_ids())
376
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
377
    def test_last_revision(self):
378
        wt = self.make_branch_and_tree('source')
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
379
        self.assertEqual([], wt.get_parent_ids())
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
380
        a = wt.commit('A', allow_pointless=True)
2249.5.7 by John Arbash Meinel
Make sure WorkingTree revision_ids are also returned as utf8 strings
381
        parent_ids = wt.get_parent_ids()
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
382
        self.assertEqual([a], parent_ids)
2249.5.7 by John Arbash Meinel
Make sure WorkingTree revision_ids are also returned as utf8 strings
383
        for parent_id in parent_ids:
7018.3.2 by Jelmer Vernooij
Fix some git tests.
384
            self.assertIsInstance(parent_id, bytes)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
385
386
    def test_set_last_revision(self):
387
        wt = self.make_branch_and_tree('source')
1908.1.1 by Robert Collins
Relax WorkingTree.set_last-revision to allow any revision to be set.
388
        # set last-revision to one not in the history
6844.1.1 by Jelmer Vernooij
Many more foreign branch fixes.
389
        if wt.branch.repository._format.supports_ghosts:
6973.10.6 by Jelmer Vernooij
Fix tests.
390
            wt.set_last_revision(b'A')
1908.1.1 by Robert Collins
Relax WorkingTree.set_last-revision to allow any revision to be set.
391
        # set it back to None for an empty tree.
6973.10.6 by Jelmer Vernooij
Fix tests.
392
        wt.set_last_revision(b'null:')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
393
        a = wt.commit('A', allow_pointless=True)
6747.2.2 by Jelmer Vernooij
Fix tests.
394
        self.assertEqual([a], wt.get_parent_ids())
6498.3.4 by Jelmer Vernooij
Remove more .set_revision_history / .revision_history references.
395
        # null: is aways in the branch
6973.10.6 by Jelmer Vernooij
Fix tests.
396
        wt.set_last_revision(b'null:')
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
397
        self.assertEqual([], wt.get_parent_ids())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
398
        # and now we can set it to 'A'
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
399
        # because some formats mutate the branch to set it on the tree
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
400
        # we need to alter the branch to let this pass.
6498.3.4 by Jelmer Vernooij
Remove more .set_revision_history / .revision_history references.
401
        if getattr(wt.branch, "_set_revision_history", None) is None:
2230.3.27 by Aaron Bentley
Skip arbitrary revision-history test for Branch6
402
            raise TestSkipped("Branch format does not permit arbitrary"
403
                              " history")
6973.10.6 by Jelmer Vernooij
Fix tests.
404
        wt.branch._set_revision_history([a, b'B'])
6747.2.2 by Jelmer Vernooij
Fix tests.
405
        wt.set_last_revision(a)
406
        self.assertEqual([a], wt.get_parent_ids())
6973.10.6 by Jelmer Vernooij
Fix tests.
407
        self.assertRaises(errors.ReservedId, wt.set_last_revision, b'A:')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
408
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
409
    def test_set_last_revision_different_to_branch(self):
410
        # working tree formats from the meta-dir format and newer support
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
411
        # setting the last revision on a tree independently of that on the
412
        # branch. Its concievable that some future formats may want to
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
413
        # couple them again (i.e. because its really a smart server and
414
        # the working tree will always match the branch). So we test
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
415
        # that formats where initialising a branch does not initialise a
416
        # tree - and thus have separable entities - support skewing the
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
417
        # two things.
6437.70.7 by John Arbash Meinel
one more test that wanted to have a branch reference
418
        self.requireBranchReference()
419
        wt = self.make_branch_and_tree('tree')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
420
        a = wt.commit('A', allow_pointless=True)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
421
        wt.set_last_revision(None)
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
422
        self.assertEqual([], wt.get_parent_ids())
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
423
        self.assertEqual(a, wt.branch.last_revision())
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
424
        # and now we can set it back to 'A'
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
425
        wt.set_last_revision(a)
426
        self.assertEqual([a], wt.get_parent_ids())
427
        self.assertEqual(a, wt.branch.last_revision())
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
428
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
429
    def test_clone_and_commit_preserves_last_revision(self):
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
430
        """Doing a commit into a clone tree does not affect the source."""
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
431
        wt = self.make_branch_and_tree('source')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
432
        cloned_dir = wt.controldir.clone('target')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
433
        wt.commit('A', allow_pointless=True)
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
434
        self.assertNotEqual(cloned_dir.open_workingtree().get_parent_ids(),
435
                            wt.get_parent_ids())
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
436
437
    def test_clone_preserves_content(self):
438
        wt = self.make_branch_and_tree('source')
2255.2.51 by John Arbash Meinel
simple rewrap for 79 char lines
439
        self.build_tree(['added', 'deleted', 'notadded'],
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
440
                        transport=wt.controldir.transport.clone('..'))
6829.2.1 by Jelmer Vernooij
Avoid passing in file_ids/revision_ids in a few more places.
441
        wt.add('deleted')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
442
        wt.commit('add deleted')
443
        wt.remove('deleted')
6829.2.1 by Jelmer Vernooij
Avoid passing in file_ids/revision_ids in a few more places.
444
        wt.add('added')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
445
        cloned_dir = wt.controldir.clone('target')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
446
        cloned = cloned_dir.open_workingtree()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
447
        cloned_transport = cloned.controldir.transport.clone('..')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
448
        self.assertFalse(cloned_transport.has('deleted'))
449
        self.assertTrue(cloned_transport.has('added'))
450
        self.assertFalse(cloned_transport.has('notadded'))
6852.3.1 by Jelmer Vernooij
add Tree.is_versioned.
451
        self.assertTrue(cloned.is_versioned('added'))
452
        self.assertFalse(cloned.is_versioned('deleted'))
453
        self.assertFalse(cloned.is_versioned('notadded'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
454
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
455
    def test_basis_tree_returns_last_revision(self):
456
        wt = self.make_branch_and_tree('.')
457
        self.build_tree(['foo'])
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
458
        wt.add('foo')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
459
        a = wt.commit('A')
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
460
        wt.rename_one('foo', 'bar')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
461
        b = wt.commit('B')
462
        wt.set_parent_ids([b])
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
463
        tree = wt.basis_tree()
2255.2.30 by Robert Collins
Some workingtree_implementations/test_workingtree.py test work - add DirStateRevisionTree.has_filename, locks around appropriate calls in tests.
464
        tree.lock_read()
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
465
        self.assertTrue(tree.has_filename('bar'))
2255.2.30 by Robert Collins
Some workingtree_implementations/test_workingtree.py test work - add DirStateRevisionTree.has_filename, locks around appropriate calls in tests.
466
        tree.unlock()
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
467
        wt.set_parent_ids([a])
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
468
        tree = wt.basis_tree()
2255.2.30 by Robert Collins
Some workingtree_implementations/test_workingtree.py test work - add DirStateRevisionTree.has_filename, locks around appropriate calls in tests.
469
        tree.lock_read()
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
470
        self.assertTrue(tree.has_filename('foo'))
2255.2.30 by Robert Collins
Some workingtree_implementations/test_workingtree.py test work - add DirStateRevisionTree.has_filename, locks around appropriate calls in tests.
471
        tree.unlock()
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
472
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
473
    def test_clone_tree_revision(self):
474
        # make a tree with a last-revision,
475
        # and clone it with a different last-revision, this should switch
476
        # do it.
477
        #
478
        # also test that the content is merged
479
        # and conflicts recorded.
480
        # This should merge between the trees - local edits should be preserved
481
        # but other changes occured.
482
        # we test this by having one file that does
483
        # not change between two revisions, and another that does -
484
        # if the changed one is not changed, fail,
485
        # if the one that did not change has lost a local change, fail.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
486
        #
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
487
        raise TestSkipped('revision limiting is not implemented yet.')
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
488
489
    def test_initialize_with_revision_id(self):
490
        # a bzrdir can construct a working tree for itself @ a specific revision.
491
        source = self.make_branch_and_tree('source')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
492
        a = source.commit('a', allow_pointless=True)
493
        source.commit('b', allow_pointless=True)
1508.1.21 by Robert Collins
Implement -r limit for checkout command.
494
        self.build_tree(['new/'])
495
        made_control = self.bzrdir_format.initialize('new')
496
        source.branch.repository.clone(made_control)
497
        source.branch.clone(made_control)
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
498
        made_tree = self.workingtree_format.initialize(made_control,
7143.15.2 by Jelmer Vernooij
Run autopep8.
499
                                                       revision_id=a)
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
500
        self.assertEqual([a], made_tree.get_parent_ids())
1508.1.23 by Robert Collins
Test that the working tree last revision is indeed set during commit.
501
6435.1.1 by Jelmer Vernooij
Add post_build_tree hook.
502
    def test_post_build_tree_hook(self):
503
        calls = []
7143.15.2 by Jelmer Vernooij
Run autopep8.
504
6435.1.1 by Jelmer Vernooij
Add post_build_tree hook.
505
        def track_post_build_tree(tree):
506
            calls.append(tree.last_revision())
507
        source = self.make_branch_and_tree('source')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
508
        a = source.commit('a', allow_pointless=True)
509
        source.commit('b', allow_pointless=True)
6435.1.2 by Jelmer Vernooij
Fix test against wt2.
510
        self.build_tree(['new/'])
511
        made_control = self.bzrdir_format.initialize('new')
512
        source.branch.repository.clone(made_control)
513
        source.branch.clone(made_control)
6435.1.1 by Jelmer Vernooij
Add post_build_tree hook.
514
        MutableTree.hooks.install_named_hook("post_build_tree",
7143.15.2 by Jelmer Vernooij
Run autopep8.
515
                                             track_post_build_tree, "Test")
6435.1.1 by Jelmer Vernooij
Add post_build_tree hook.
516
        made_tree = self.workingtree_format.initialize(made_control,
7143.15.2 by Jelmer Vernooij
Run autopep8.
517
                                                       revision_id=a)
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
518
        self.assertEqual([a], calls)
6435.1.1 by Jelmer Vernooij
Add post_build_tree hook.
519
1508.1.24 by Robert Collins
Add update command for use with checkouts.
520
    def test_update_sets_last_revision(self):
521
        # working tree formats from the meta-dir format and newer support
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
522
        # setting the last revision on a tree independently of that on the
523
        # branch. Its concievable that some future formats may want to
1508.1.24 by Robert Collins
Add update command for use with checkouts.
524
        # couple them again (i.e. because its really a smart server and
525
        # the working tree will always match the branch). So we test
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
526
        # that formats where initialising a branch does not initialise a
527
        # tree - and thus have separable entities - support skewing the
1508.1.24 by Robert Collins
Add update command for use with checkouts.
528
        # two things.
6437.70.14 by John Arbash Meinel
Finish bug #1046697 and run all per_workingtree tests against a checkout.
529
        self.requireBranchReference()
6437.70.6 by John Arbash Meinel
Fix a couple tests that wanted to directly create a wt where the branch was.
530
        wt = self.make_branch_and_tree('tree')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
531
        # create an out of date working tree by making a checkout in this
532
        # current format
533
        self.build_tree(['checkout/', 'tree/file'])
534
        checkout = bzrdir.BzrDirMetaFormat1().initialize('checkout')
6437.70.6 by John Arbash Meinel
Fix a couple tests that wanted to directly create a wt where the branch was.
535
        checkout.set_branch_reference(wt.branch)
1508.1.24 by Robert Collins
Add update command for use with checkouts.
536
        old_tree = self.workingtree_format.initialize(checkout)
537
        # now commit to 'tree'
538
        wt.add('file')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
539
        a = wt.commit('A')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
540
        # and update old_tree
541
        self.assertEqual(0, old_tree.update())
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
542
        self.assertPathExists('checkout/file')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
543
        self.assertEqual([a], old_tree.get_parent_ids())
1508.1.24 by Robert Collins
Add update command for use with checkouts.
544
1731.1.33 by Aaron Bentley
Revert no-special-root changes
545
    def test_update_sets_root_id(self):
546
        """Ensure tree root is set properly by update.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
547
1731.1.33 by Aaron Bentley
Revert no-special-root changes
548
        Since empty trees don't have root_ids, but workingtrees do,
549
        an update of a checkout of revision 0 to a new revision,  should set
550
        the root id.
551
        """
552
        wt = self.make_branch_and_tree('tree')
553
        main_branch = wt.branch
554
        # create an out of date working tree by making a checkout in this
555
        # current format
556
        self.build_tree(['checkout/', 'tree/file'])
1731.1.43 by Aaron Bentley
Merge more checkout changes
557
        checkout = main_branch.create_checkout('checkout')
1731.1.33 by Aaron Bentley
Revert no-special-root changes
558
        # now commit to 'tree'
559
        wt.add('file')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
560
        a = wt.commit('A')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
561
        # and update checkout
1731.1.33 by Aaron Bentley
Revert no-special-root changes
562
        self.assertEqual(0, checkout.update())
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
563
        self.assertPathExists('checkout/file')
1731.1.33 by Aaron Bentley
Revert no-special-root changes
564
        self.assertEqual(wt.get_root_id(), checkout.get_root_id())
565
        self.assertNotEqual(None, wt.get_root_id())
566
4634.123.1 by John Arbash Meinel
Add a failing test for 'update'. When this branch lands, update should work.
567
    def test_update_sets_updated_root_id(self):
568
        wt = self.make_branch_and_tree('tree')
6793.4.1 by Jelmer Vernooij
Improve set_root_id handling.
569
        if not wt._format.supports_setting_file_ids:
570
            self.assertRaises(SettingFileIdUnsupported, wt.set_root_id,
7143.15.2 by Jelmer Vernooij
Run autopep8.
571
                              'first_root_id')
6793.4.1 by Jelmer Vernooij
Improve set_root_id handling.
572
            return
6855.4.1 by Jelmer Vernooij
Yet more bees.
573
        wt.set_root_id(b'first_root_id')
7045.4.13 by Jelmer Vernooij
Some more test fixes.
574
        self.assertEqual(b'first_root_id', wt.get_root_id())
4634.123.1 by John Arbash Meinel
Add a failing test for 'update'. When this branch lands, update should work.
575
        self.build_tree(['tree/file'])
576
        wt.add(['file'])
577
        wt.commit('first')
578
        co = wt.branch.create_checkout('checkout')
6855.4.1 by Jelmer Vernooij
Yet more bees.
579
        wt.set_root_id(b'second_root_id')
4634.123.1 by John Arbash Meinel
Add a failing test for 'update'. When this branch lands, update should work.
580
        wt.commit('second')
7045.4.13 by Jelmer Vernooij
Some more test fixes.
581
        self.assertEqual(b'second_root_id', wt.get_root_id())
4634.123.1 by John Arbash Meinel
Add a failing test for 'update'. When this branch lands, update should work.
582
        self.assertEqual(0, co.update())
7045.4.13 by Jelmer Vernooij
Some more test fixes.
583
        self.assertEqual(b'second_root_id', co.get_root_id())
4634.123.1 by John Arbash Meinel
Add a failing test for 'update'. When this branch lands, update should work.
584
1508.1.24 by Robert Collins
Add update command for use with checkouts.
585
    def test_update_returns_conflict_count(self):
586
        # working tree formats from the meta-dir format and newer support
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
587
        # setting the last revision on a tree independently of that on the
588
        # branch. Its concievable that some future formats may want to
1508.1.24 by Robert Collins
Add update command for use with checkouts.
589
        # couple them again (i.e. because its really a smart server and
590
        # the working tree will always match the branch). So we test
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
591
        # that formats where initialising a branch does not initialise a
592
        # tree - and thus have separable entities - support skewing the
1508.1.24 by Robert Collins
Add update command for use with checkouts.
593
        # two things.
6437.70.6 by John Arbash Meinel
Fix a couple tests that wanted to directly create a wt where the branch was.
594
        self.requireBranchReference()
595
        wt = self.make_branch_and_tree('tree')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
596
        # create an out of date working tree by making a checkout in this
597
        # current format
598
        self.build_tree(['checkout/', 'tree/file'])
599
        checkout = bzrdir.BzrDirMetaFormat1().initialize('checkout')
6437.70.6 by John Arbash Meinel
Fix a couple tests that wanted to directly create a wt where the branch was.
600
        checkout.set_branch_reference(wt.branch)
1508.1.24 by Robert Collins
Add update command for use with checkouts.
601
        old_tree = self.workingtree_format.initialize(checkout)
602
        # now commit to 'tree'
603
        wt.add('file')
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
604
        a = wt.commit('A')
1508.1.24 by Robert Collins
Add update command for use with checkouts.
605
        # and add a file file to the checkout
606
        self.build_tree(['checkout/file'])
607
        old_tree.add('file')
608
        # and update old_tree
609
        self.assertEqual(1, old_tree.update())
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
610
        self.assertEqual([a], old_tree.get_parent_ids())
1508.1.24 by Robert Collins
Add update command for use with checkouts.
611
1534.7.199 by Aaron Bentley
Moved merge/revert tests into test_workingtree.py
612
    def test_merge_revert(self):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
613
        from breezy.merge import merge_inner
1534.7.199 by Aaron Bentley
Moved merge/revert tests into test_workingtree.py
614
        this = self.make_branch_and_tree('b1')
7143.15.2 by Jelmer Vernooij
Run autopep8.
615
        self.build_tree_contents(
616
            [('b1/a', b'a test\n'), ('b1/b', b'b test\n')])
4789.12.1 by John Arbash Meinel
Fix per_workingtree.test_workingtree.test_merge_revert
617
        this.add(['a', 'b'])
1534.7.199 by Aaron Bentley
Moved merge/revert tests into test_workingtree.py
618
        this.commit(message='')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
619
        base = this.controldir.clone('b2').open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
620
        self.build_tree_contents([('b2/a', b'b test\n')])
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
621
        other = this.controldir.clone('b3').open_workingtree()
7143.15.2 by Jelmer Vernooij
Run autopep8.
622
        self.build_tree_contents(
623
            [('b3/a', b'c test\n'), ('b3/c', b'c test\n')])
1534.7.199 by Aaron Bentley
Moved merge/revert tests into test_workingtree.py
624
        other.add('c')
625
7143.15.2 by Jelmer Vernooij
Run autopep8.
626
        self.build_tree_contents(
627
            [('b1/b', b'q test\n'), ('b1/d', b'd test\n')])
4789.12.1 by John Arbash Meinel
Fix per_workingtree.test_workingtree.test_merge_revert
628
        # Note: If we don't lock this before calling merge_inner, then we get a
629
        #       lock-contention failure. This probably indicates something
630
        #       weird going on inside merge_inner. Probably something about
631
        #       calling bt = this_tree.basis_tree() in one lock, and then
632
        #       locking both this_tree and bt separately, causing a dirstate
633
        #       locking race.
634
        this.lock_write()
635
        self.addCleanup(this.unlock)
1534.7.199 by Aaron Bentley
Moved merge/revert tests into test_workingtree.py
636
        merge_inner(this.branch, other, base, this_tree=this)
7029.4.2 by Jelmer Vernooij
Fix more merge tests.
637
        with open('b1/a', 'rb') as a:
4789.12.1 by John Arbash Meinel
Fix per_workingtree.test_workingtree.test_merge_revert
638
            self.assertNotEqual(a.read(), 'a test\n')
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
639
        this.revert()
7029.4.2 by Jelmer Vernooij
Fix more merge tests.
640
        self.assertFileEqual(b'a test\n', 'b1/a')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
641
        self.assertPathExists('b1/b.~1~')
6947.2.1 by Jelmer Vernooij
Don't expect unmodified files to be removed when a merge is reverted on working trees that don't support merge_modified.
642
        if this.supports_merge_modified():
643
            self.assertPathDoesNotExist('b1/c')
644
            self.assertPathDoesNotExist('b1/a.~1~')
645
        else:
646
            self.assertPathExists('b1/c')
647
            self.assertPathExists('b1/a.~1~')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
648
        self.assertPathExists('b1/d')
1534.7.200 by Aaron Bentley
Merge from mainline
649
1587.1.10 by Robert Collins
update updates working tree and branch together.
650
    def test_update_updates_bound_branch_no_local_commits(self):
651
        # doing an update in a tree updates the branch its bound to too.
652
        master_tree = self.make_branch_and_tree('master')
653
        tree = self.make_branch_and_tree('tree')
654
        try:
655
            tree.branch.bind(master_tree.branch)
656
        except errors.UpgradeRequired:
657
            # legacy branches cannot bind
658
            return
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
659
        foo = master_tree.commit('foo', allow_pointless=True)
1587.1.10 by Robert Collins
update updates working tree and branch together.
660
        tree.update()
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
661
        self.assertEqual([foo], tree.get_parent_ids())
662
        self.assertEqual(foo, tree.branch.last_revision())
1587.1.11 by Robert Collins
Local commits appear to be working properly.
663
664
    def test_update_turns_local_commit_into_merge(self):
665
        # doing an update with a few local commits and no master commits
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
666
        # makes pending-merges.
1587.1.13 by Robert Collins
Explain why update pivots more clearly in the relevant test.
667
        # this is done so that 'bzr update; bzr revert' will always produce
668
        # an exact copy of the 'logical branch' - the referenced branch for
669
        # a checkout, and the master for a bound branch.
670
        # its possible that we should instead have 'bzr update' when there
671
        # is nothing new on the master leave the current commits intact and
672
        # alter 'revert' to revert to the master always. But for now, its
673
        # good.
1587.1.11 by Robert Collins
Local commits appear to be working properly.
674
        master_tree = self.make_branch_and_tree('master')
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
675
        master_tip = master_tree.commit('first master commit')
1587.1.11 by Robert Collins
Local commits appear to be working properly.
676
        tree = self.make_branch_and_tree('tree')
677
        try:
678
            tree.branch.bind(master_tree.branch)
679
        except errors.UpgradeRequired:
680
            # legacy branches cannot bind
681
            return
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
682
        # sync with master
683
        tree.update()
684
        # work locally
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
685
        tree.commit('foo', allow_pointless=True, local=True)
686
        bar = tree.commit('bar', allow_pointless=True, local=True)
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
687
        # sync with master prepatory to committing
1587.1.11 by Robert Collins
Local commits appear to be working properly.
688
        tree.update()
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
689
        # which should have pivoted the local tip into a merge
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
690
        self.assertEqual([master_tip, bar], tree.get_parent_ids())
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
691
        # and the local branch history should match the masters now.
6165.4.4 by Jelmer Vernooij
Avoid .revision_history().
692
        self.assertEqual(master_tree.branch.last_revision(),
6747.2.1 by Jelmer Vernooij
Avoid setting revision_ids.
693
                         tree.branch.last_revision())
1587.1.11 by Robert Collins
Local commits appear to be working properly.
694
4916.1.7 by Martin Pool
Add per_workingtree test you can update to arbitrary revisions
695
    def test_update_takes_revision_parameter(self):
696
        wt = self.make_branch_and_tree('wt')
6855.4.1 by Jelmer Vernooij
Yet more bees.
697
        self.build_tree_contents([('wt/a', b'old content')])
4916.1.7 by Martin Pool
Add per_workingtree test you can update to arbitrary revisions
698
        wt.add(['a'])
699
        rev1 = wt.commit('first master commit')
6855.4.1 by Jelmer Vernooij
Yet more bees.
700
        self.build_tree_contents([('wt/a', b'new content')])
4916.1.7 by Martin Pool
Add per_workingtree test you can update to arbitrary revisions
701
        rev2 = wt.commit('second master commit')
5243.1.2 by Martin
Point launchpad links in comments at production server rather than edge
702
        # https://bugs.launchpad.net/bzr/+bug/45719/comments/20
4916.1.7 by Martin Pool
Add per_workingtree test you can update to arbitrary revisions
703
        # when adding 'update -r' we should make sure all wt formats support
704
        # it
705
        conflicts = wt.update(revision=rev1)
7029.4.2 by Jelmer Vernooij
Fix more merge tests.
706
        self.assertFileEqual(b'old content', 'wt/a')
4916.1.7 by Martin Pool
Add per_workingtree test you can update to arbitrary revisions
707
        self.assertEqual([rev1], wt.get_parent_ids())
708
2255.2.156 by Martin Pool
Merge WorkingTree implementation back from trunk
709
    def test_merge_modified_detects_corruption(self):
710
        # FIXME: This doesn't really test that it works; also this is not
711
        # implementation-independent. mbp 20070226
1558.3.3 by Aaron Bentley
Fix error handling for merge_modified
712
        tree = self.make_branch_and_tree('master')
6072.1.1 by Jelmer Vernooij
Various fixes for tests of foreign plugins.
713
        if not isinstance(tree, InventoryWorkingTree):
714
            raise TestNotApplicable("merge-hashes is specific to bzr "
7143.15.2 by Jelmer Vernooij
Run autopep8.
715
                                    "working trees")
7029.4.2 by Jelmer Vernooij
Fix more merge tests.
716
        tree._transport.put_bytes('merge-hashes', b'asdfasdf')
1558.3.3 by Aaron Bentley
Fix error handling for merge_modified
717
        self.assertRaises(errors.MergeModifiedFormatError, tree.merge_modified)
1534.10.8 by Aaron Bentley
Implemented conflict_lines in terms of old system on WorkingTree
718
2298.1.1 by Martin Pool
Add test for merge_modified
719
    def test_merge_modified(self):
720
        # merge_modified stores a map from file id to hash
721
        tree = self.make_branch_and_tree('tree')
6855.4.1 by Jelmer Vernooij
Yet more bees.
722
        self.build_tree_contents([('tree/somefile', b'hello')])
6852.3.1 by Jelmer Vernooij
add Tree.is_versioned.
723
        with tree.lock_write():
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
724
            tree.add(['somefile'])
6855.4.3 by Jelmer Vernooij
Merge trink.
725
            d = {tree.path2id('somefile'): osutils.sha_string(b'hello')}
6885.2.1 by Jelmer Vernooij
Add WorkingTree.supports_merge_modified.
726
            if tree.supports_merge_modified():
6862.6.1 by Jelmer Vernooij
Allow working trees to not implement set_merge_modified.
727
                tree.set_merge_modified(d)
6885.2.1 by Jelmer Vernooij
Add WorkingTree.supports_merge_modified.
728
                mm = tree.merge_modified()
729
                self.assertEqual(mm, d)
730
            else:
731
                self.assertRaises(
732
                    errors.UnsupportedOperation,
733
                    tree.set_merge_modified, d)
6862.6.1 by Jelmer Vernooij
Allow working trees to not implement set_merge_modified.
734
                mm = tree.merge_modified()
735
                self.assertEqual(mm, {})
6885.2.1 by Jelmer Vernooij
Add WorkingTree.supports_merge_modified.
736
        if tree.supports_merge_modified():
2298.1.1 by Martin Pool
Add test for merge_modified
737
            mm = tree.merge_modified()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
738
            self.assertEqual(mm, d)
6862.6.1 by Jelmer Vernooij
Allow working trees to not implement set_merge_modified.
739
        else:
740
            mm = tree.merge_modified()
741
            self.assertEqual(mm, {})
2298.1.1 by Martin Pool
Add test for merge_modified
742
1534.10.22 by Aaron Bentley
Got ConflictList implemented
743
    def test_conflicts(self):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
744
        from breezy.tests.test_conflicts import example_conflicts
1534.10.8 by Aaron Bentley
Implemented conflict_lines in terms of old system on WorkingTree
745
        tree = self.make_branch_and_tree('master')
746
        try:
1534.10.22 by Aaron Bentley
Got ConflictList implemented
747
            tree.set_conflicts(example_conflicts)
1534.10.8 by Aaron Bentley
Implemented conflict_lines in terms of old system on WorkingTree
748
        except UnsupportedOperation:
1534.10.22 by Aaron Bentley
Got ConflictList implemented
749
            raise TestSkipped('set_conflicts not supported')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
750
1534.10.8 by Aaron Bentley
Implemented conflict_lines in terms of old system on WorkingTree
751
        tree2 = WorkingTree.open('master')
1534.10.22 by Aaron Bentley
Got ConflictList implemented
752
        self.assertEqual(tree2.conflicts(), example_conflicts)
7029.4.2 by Jelmer Vernooij
Fix more merge tests.
753
        tree2._transport.put_bytes('conflicts', b'')
3407.2.7 by Martin Pool
Deprecate LockableFiles.put_utf8 and put_bytes.
754
        self.assertRaises(errors.ConflictFormatError,
1955.3.14 by John Arbash Meinel
Correctly fix the workingtree put() test fixes
755
                          tree2.conflicts)
7029.4.2 by Jelmer Vernooij
Fix more merge tests.
756
        tree2._transport.put_bytes('conflicts', b'a')
3407.2.7 by Martin Pool
Deprecate LockableFiles.put_utf8 and put_bytes.
757
        self.assertRaises(errors.ConflictFormatError,
1955.3.14 by John Arbash Meinel
Correctly fix the workingtree put() test fixes
758
                          tree2.conflicts)
1534.10.12 by Aaron Bentley
Merge produces new conflicts
759
760
    def make_merge_conflicts(self):
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
761
        from breezy.merge import merge_inner
1534.10.12 by Aaron Bentley
Merge produces new conflicts
762
        tree = self.make_branch_and_tree('mine')
7143.15.2 by Jelmer Vernooij
Run autopep8.
763
        with open('mine/bloo', 'wb') as f:
764
            f.write(b'one')
765
        with open('mine/blo', 'wb') as f:
766
            f.write(b'on')
2255.2.32 by Robert Collins
Make test_clear_merge_conflicts pass for dirstate. This involved working
767
        tree.add(['bloo', 'blo'])
1534.10.12 by Aaron Bentley
Merge produces new conflicts
768
        tree.commit("blah", allow_pointless=False)
2255.5.3 by John Arbash Meinel
XXX Workaround the DirStateRevisionTree bug until we get a proper fix, tests pass again
769
        base = tree.branch.repository.revision_tree(tree.last_revision())
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
770
        controldir.ControlDir.open("mine").sprout("other")
7143.15.2 by Jelmer Vernooij
Run autopep8.
771
        with open('other/bloo', 'wb') as f:
772
            f.write(b'two')
1534.10.12 by Aaron Bentley
Merge produces new conflicts
773
        othertree = WorkingTree.open('other')
774
        othertree.commit('blah', allow_pointless=False)
7143.15.2 by Jelmer Vernooij
Run autopep8.
775
        with open('mine/bloo', 'wb') as f:
776
            f.write(b'three')
1534.10.12 by Aaron Bentley
Merge produces new conflicts
777
        tree.commit("blah", allow_pointless=False)
778
        merge_inner(tree.branch, othertree, base, this_tree=tree)
779
        return tree
780
781
    def test_merge_conflicts(self):
782
        tree = self.make_merge_conflicts()
1534.10.22 by Aaron Bentley
Got ConflictList implemented
783
        self.assertEqual(len(tree.conflicts()), 1)
1534.10.12 by Aaron Bentley
Merge produces new conflicts
784
785
    def test_clear_merge_conflicts(self):
786
        tree = self.make_merge_conflicts()
1534.10.22 by Aaron Bentley
Got ConflictList implemented
787
        self.assertEqual(len(tree.conflicts()), 1)
1534.10.12 by Aaron Bentley
Merge produces new conflicts
788
        try:
1534.10.22 by Aaron Bentley
Got ConflictList implemented
789
            tree.set_conflicts(ConflictList())
1534.10.12 by Aaron Bentley
Merge produces new conflicts
790
        except UnsupportedOperation:
2949.5.1 by Alexander Belchenko
selftest: use SymlinkFeature instead of TestSkipped where appropriate
791
            raise TestSkipped('unsupported operation')
1534.10.22 by Aaron Bentley
Got ConflictList implemented
792
        self.assertEqual(tree.conflicts(), ConflictList())
1534.10.14 by Aaron Bentley
Made revert clear conflicts
793
1551.7.11 by Aaron Bentley
Add WorkingTree.add_conflicts
794
    def test_add_conflicts(self):
795
        tree = self.make_branch_and_tree('tree')
796
        try:
797
            tree.add_conflicts([TextConflict('path_a')])
798
        except UnsupportedOperation:
2949.5.1 by Alexander Belchenko
selftest: use SymlinkFeature instead of TestSkipped where appropriate
799
            raise TestSkipped('unsupported operation')
1551.7.13 by Aaron Bentley
Switched from actual, expected to expected, actual, for John.
800
        self.assertEqual(ConflictList([TextConflict('path_a')]),
801
                         tree.conflicts())
1551.7.11 by Aaron Bentley
Add WorkingTree.add_conflicts
802
        tree.add_conflicts([TextConflict('path_a')])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
803
        self.assertEqual(ConflictList([TextConflict('path_a')]),
1551.7.13 by Aaron Bentley
Switched from actual, expected to expected, actual, for John.
804
                         tree.conflicts())
1551.7.11 by Aaron Bentley
Add WorkingTree.add_conflicts
805
        tree.add_conflicts([ContentsConflict('path_a')])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
806
        self.assertEqual(ConflictList([ContentsConflict('path_a'),
1551.7.13 by Aaron Bentley
Switched from actual, expected to expected, actual, for John.
807
                                       TextConflict('path_a')]),
808
                         tree.conflicts())
1551.7.11 by Aaron Bentley
Add WorkingTree.add_conflicts
809
        tree.add_conflicts([TextConflict('path_b')])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
810
        self.assertEqual(ConflictList([ContentsConflict('path_a'),
1551.7.11 by Aaron Bentley
Add WorkingTree.add_conflicts
811
                                       TextConflict('path_a'),
1551.7.13 by Aaron Bentley
Switched from actual, expected to expected, actual, for John.
812
                                       TextConflict('path_b')]),
813
                         tree.conflicts())
1551.7.11 by Aaron Bentley
Add WorkingTree.add_conflicts
814
1534.10.14 by Aaron Bentley
Made revert clear conflicts
815
    def test_revert_clear_conflicts(self):
816
        tree = self.make_merge_conflicts()
1534.10.22 by Aaron Bentley
Got ConflictList implemented
817
        self.assertEqual(len(tree.conflicts()), 1)
1534.10.14 by Aaron Bentley
Made revert clear conflicts
818
        tree.revert(["blo"])
1534.10.22 by Aaron Bentley
Got ConflictList implemented
819
        self.assertEqual(len(tree.conflicts()), 1)
1534.10.14 by Aaron Bentley
Made revert clear conflicts
820
        tree.revert(["bloo"])
1534.10.22 by Aaron Bentley
Got ConflictList implemented
821
        self.assertEqual(len(tree.conflicts()), 0)
1534.10.14 by Aaron Bentley
Made revert clear conflicts
822
823
    def test_revert_clear_conflicts2(self):
824
        tree = self.make_merge_conflicts()
1534.10.22 by Aaron Bentley
Got ConflictList implemented
825
        self.assertEqual(len(tree.conflicts()), 1)
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
826
        tree.revert()
1534.10.22 by Aaron Bentley
Got ConflictList implemented
827
        self.assertEqual(len(tree.conflicts()), 0)
1624.3.22 by Olaf Conradi
Merge bzr.dev
828
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
829
    def test_format_description(self):
830
        tree = self.make_branch_and_tree('tree')
831
        text = tree._format.get_format_description()
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
832
        self.assertTrue(len(text))
1681.1.1 by Robert Collins
Make WorkingTree.branch a read only property. (Robert Collins)
833
6844.1.2 by Jelmer Vernooij
Add supports_leftmost_parent_id_as_ghost.
834
    def test_format_leftmost_parent_id_as_ghost(self):
835
        tree = self.make_branch_and_tree('tree')
836
        self.assertIn(
7143.15.2 by Jelmer Vernooij
Run autopep8.
837
            tree._format.supports_leftmost_parent_id_as_ghost, (True, False))
6844.1.2 by Jelmer Vernooij
Add supports_leftmost_parent_id_as_ghost.
838
1681.1.1 by Robert Collins
Make WorkingTree.branch a read only property. (Robert Collins)
839
    def test_branch_attribute_is_not_settable(self):
840
        # the branch attribute is an aspect of the working tree, not a
841
        # configurable attribute
842
        tree = self.make_branch_and_tree('tree')
7143.15.2 by Jelmer Vernooij
Run autopep8.
843
1681.1.1 by Robert Collins
Make WorkingTree.branch a read only property. (Robert Collins)
844
        def set_branch():
845
            tree.branch = tree.branch
846
        self.assertRaises(AttributeError, set_branch)
847
1713.3.1 by Robert Collins
Smoke tests for tree.list_files and bzr ignored when a versioned file matches an ignore rule.
848
    def test_list_files_versioned_before_ignored(self):
849
        """A versioned file matching an ignore rule should not be ignored."""
850
        tree = self.make_branch_and_tree('.')
851
        self.build_tree(['foo.pyc'])
852
        # ensure that foo.pyc is ignored
6855.4.1 by Jelmer Vernooij
Yet more bees.
853
        self.build_tree_contents([('.bzrignore', b'foo.pyc')])
6829.2.1 by Jelmer Vernooij
Avoid passing in file_ids/revision_ids in a few more places.
854
        tree.add('foo.pyc')
855
        anid = tree.path2id('foo.pyc')
2255.2.52 by Robert Collins
Dirstate - fix workingtree.list_files to use the public interface to access the trees inventory.
856
        tree.lock_read()
1713.3.1 by Robert Collins
Smoke tests for tree.list_files and bzr ignored when a versioned file matches an ignore rule.
857
        files = sorted(list(tree.list_files()))
2255.2.52 by Robert Collins
Dirstate - fix workingtree.list_files to use the public interface to access the trees inventory.
858
        tree.unlock()
1713.3.1 by Robert Collins
Smoke tests for tree.list_files and bzr ignored when a versioned file matches an ignore rule.
859
        self.assertEqual((u'.bzrignore', '?', 'file', None), files[0][:-1])
6829.2.1 by Jelmer Vernooij
Avoid passing in file_ids/revision_ids in a few more places.
860
        self.assertEqual((u'foo.pyc', 'V', 'file', anid), files[1][:-1])
1713.3.1 by Robert Collins
Smoke tests for tree.list_files and bzr ignored when a versioned file matches an ignore rule.
861
        self.assertEqual(2, len(files))
1711.8.2 by John Arbash Meinel
Test that WorkingTree locks Branch before self, and unlocks self before Branch
862
1830.3.7 by John Arbash Meinel
Check that WorkingTree.add does the right thing.
863
    def test_non_normalized_add_accessible(self):
864
        try:
865
            self.build_tree([u'a\u030a'])
866
        except UnicodeError:
867
            raise TestSkipped('Filesystem does not support unicode filenames')
868
        tree = self.make_branch_and_tree('.')
869
        orig = osutils.normalized_filename
870
        osutils.normalized_filename = osutils._accessible_normalized_filename
871
        try:
872
            tree.add([u'a\u030a'])
2255.2.58 by Robert Collins
Fix the way we used osutils.normalized_filename in dirstate to support overriding in tests - and document this in the original location it was used.
873
            tree.lock_read()
1907.1.3 by Aaron Bentley
Fixed unicode test cases
874
            self.assertEqual([('', 'directory'), (u'\xe5', 'file')],
7143.15.2 by Jelmer Vernooij
Run autopep8.
875
                             [(path, ie.kind) for path, ie in
876
                              tree.iter_entries_by_dir()])
2255.2.58 by Robert Collins
Fix the way we used osutils.normalized_filename in dirstate to support overriding in tests - and document this in the original location it was used.
877
            tree.unlock()
1830.3.7 by John Arbash Meinel
Check that WorkingTree.add does the right thing.
878
        finally:
879
            osutils.normalized_filename = orig
880
881
    def test_non_normalized_add_inaccessible(self):
882
        try:
883
            self.build_tree([u'a\u030a'])
884
        except UnicodeError:
885
            raise TestSkipped('Filesystem does not support unicode filenames')
886
        tree = self.make_branch_and_tree('.')
887
        orig = osutils.normalized_filename
888
        osutils.normalized_filename = osutils._inaccessible_normalized_filename
889
        try:
890
            self.assertRaises(errors.InvalidNormalization,
7143.15.2 by Jelmer Vernooij
Run autopep8.
891
                              tree.add, [u'a\u030a'])
1830.3.7 by John Arbash Meinel
Check that WorkingTree.add does the right thing.
892
        finally:
893
            osutils.normalized_filename = orig
2123.3.9 by Steffen Eichenberg
added tests for deprecated API workingtree.move
894
1852.15.14 by Robert Collins
test that WorkingTree._write_inventory works as expected by the current code.
895
    def test__write_inventory(self):
896
        # The private interface _write_inventory is currently used by transform.
897
        tree = self.make_branch_and_tree('.')
5807.1.2 by Jelmer Vernooij
Skip some inventory-specific tests for non-inventory working trees.
898
        if not isinstance(tree, InventoryWorkingTree):
899
            raise TestNotApplicable("_write_inventory does not exist on "
7143.15.2 by Jelmer Vernooij
Run autopep8.
900
                                    "non-inventory working trees")
1852.15.14 by Robert Collins
test that WorkingTree._write_inventory works as expected by the current code.
901
        # if we write write an inventory then do a walkdirs we should get back
902
        # missing entries, and actual, and unknowns as appropriate.
903
        self.build_tree(['present', 'unknown'])
2946.3.3 by John Arbash Meinel
Prefer tree.get_root_id() as more explicit than tree.path2id('')
904
        inventory = Inventory(tree.get_root_id())
6973.13.2 by Jelmer Vernooij
Fix some more tests.
905
        inventory.add_path('missing', 'file', b'missing-id')
906
        inventory.add_path('present', 'file', b'present-id')
2255.2.28 by Robert Collins
TestWorkingTree.test__write_inventory needs to lock the tree before calling _write_inventory for dirstate.
907
        # there is no point in being able to write an inventory to an unlocked
908
        # tree object - its a low level api not a convenience api.
909
        tree.lock_write()
1852.15.14 by Robert Collins
test that WorkingTree._write_inventory works as expected by the current code.
910
        tree._write_inventory(inventory)
2255.2.28 by Robert Collins
TestWorkingTree.test__write_inventory needs to lock the tree before calling _write_inventory for dirstate.
911
        tree.unlock()
1852.15.14 by Robert Collins
test that WorkingTree._write_inventory works as expected by the current code.
912
        tree.lock_read()
913
        try:
914
            present_stat = os.lstat('present')
915
            unknown_stat = os.lstat('unknown')
916
            expected_results = [
2946.3.3 by John Arbash Meinel
Prefer tree.get_root_id() as more explicit than tree.path2id('')
917
                (('', tree.get_root_id()),
6973.13.2 by Jelmer Vernooij
Fix some more tests.
918
                 [('missing', 'missing', 'unknown', None, b'missing-id', 'file'),
7143.15.2 by Jelmer Vernooij
Run autopep8.
919
                  ('present', 'present', 'file',
920
                   present_stat, b'present-id', 'file'),
1852.15.14 by Robert Collins
test that WorkingTree._write_inventory works as expected by the current code.
921
                  ('unknown', 'unknown', 'file', unknown_stat, None, None),
7143.15.2 by Jelmer Vernooij
Run autopep8.
922
                  ]
923
                 )]
1852.15.14 by Robert Collins
test that WorkingTree._write_inventory works as expected by the current code.
924
            self.assertEqual(expected_results, list(tree.walkdirs()))
925
        finally:
926
            tree.unlock()
2255.7.56 by Robert Collins
Document behaviour of tree.path2id("path/").
927
928
    def test_path2id(self):
2255.7.62 by Robert Collins
Update the Tree.filter_unversioned_files docstring to reflect what the existing implementations actually do, and change the WorkingTree4 implementation to match a newly created test for it.
929
        # smoke test for path2id
2255.7.56 by Robert Collins
Document behaviour of tree.path2id("path/").
930
        tree = self.make_branch_and_tree('.')
931
        self.build_tree(['foo'])
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
932
        if tree.supports_setting_file_ids():
6855.4.1 by Jelmer Vernooij
Yet more bees.
933
            tree.add(['foo'], [b'foo-id'])
934
            self.assertEqual(b'foo-id', tree.path2id('foo'))
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
935
            # the next assertion is for backwards compatability with
936
            # WorkingTree3, though its probably a bad idea, it makes things
937
            # work. Perhaps it should raise a deprecation warning?
6855.4.1 by Jelmer Vernooij
Yet more bees.
938
            self.assertEqual(b'foo-id', tree.path2id('foo/'))
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
939
        else:
940
            tree.add(['foo'])
6821.2.2 by Jelmer Vernooij
More foreign fixes.
941
            if tree.branch.repository._format.supports_versioned_directories:
942
                self.assertIsInstance(str, tree.path2id('foo'))
943
            else:
944
                self.skipTest('format does not support versioning directories')
2255.7.62 by Robert Collins
Update the Tree.filter_unversioned_files docstring to reflect what the existing implementations actually do, and change the WorkingTree4 implementation to match a newly created test for it.
945
946
    def test_filter_unversioned_files(self):
947
        # smoke test for filter_unversioned_files
948
        tree = self.make_branch_and_tree('.')
949
        paths = ['here-and-versioned', 'here-and-not-versioned',
7143.15.2 by Jelmer Vernooij
Run autopep8.
950
                 'not-here-and-versioned', 'not-here-and-not-versioned']
2255.7.62 by Robert Collins
Update the Tree.filter_unversioned_files docstring to reflect what the existing implementations actually do, and change the WorkingTree4 implementation to match a newly created test for it.
951
        tree.add(['here-and-versioned', 'not-here-and-versioned'],
7143.15.2 by Jelmer Vernooij
Run autopep8.
952
                 kinds=['file', 'file'])
2255.7.62 by Robert Collins
Update the Tree.filter_unversioned_files docstring to reflect what the existing implementations actually do, and change the WorkingTree4 implementation to match a newly created test for it.
953
        self.build_tree(['here-and-versioned', 'here-and-not-versioned'])
954
        tree.lock_read()
955
        self.addCleanup(tree.unlock)
956
        self.assertEqual(
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
957
            {'not-here-and-not-versioned', 'here-and-not-versioned'},
2255.7.62 by Robert Collins
Update the Tree.filter_unversioned_files docstring to reflect what the existing implementations actually do, and change the WorkingTree4 implementation to match a newly created test for it.
958
            tree.filter_unversioned_files(paths))
2255.2.200 by Martin Pool
Add simple test for WorkingTree.kind
959
960
    def test_detect_real_kind(self):
961
        # working trees report the real kind of the file on disk, not the kind
962
        # they had when they were first added
963
        # create one file of every interesting type
964
        tree = self.make_branch_and_tree('.')
4100.2.2 by Aaron Bentley
Remove locking decorator
965
        tree.lock_write()
966
        self.addCleanup(tree.unlock)
2255.2.200 by Martin Pool
Add simple test for WorkingTree.kind
967
        self.build_tree(['file', 'directory/'])
968
        names = ['file', 'directory']
969
        if has_symlinks():
970
            os.symlink('target', 'symlink')
971
            names.append('symlink')
6809.4.7 by Jelmer Vernooij
Swap arguments for get_symlink_target and kind/stored_kind.
972
        tree.add(names)
2255.2.200 by Martin Pool
Add simple test for WorkingTree.kind
973
        # now when we first look, we should see everything with the same kind
974
        # with which they were initially added
975
        for n in names:
6809.4.7 by Jelmer Vernooij
Swap arguments for get_symlink_target and kind/stored_kind.
976
            actual_kind = tree.kind(n)
2255.2.200 by Martin Pool
Add simple test for WorkingTree.kind
977
            self.assertEqual(n, actual_kind)
978
        # move them around so the names no longer correspond to the types
979
        os.rename(names[0], 'tmp')
980
        for i in range(1, len(names)):
7143.15.2 by Jelmer Vernooij
Run autopep8.
981
            os.rename(names[i], names[i - 1])
2255.2.200 by Martin Pool
Add simple test for WorkingTree.kind
982
        os.rename('tmp', names[-1])
2255.2.202 by Martin Pool
WorkingTree_4.kind should report tree-references if they're
983
        # now look and expect to see the correct types again
984
        for i in range(len(names)):
7143.15.2 by Jelmer Vernooij
Run autopep8.
985
            actual_kind = tree.kind(names[i - 1])
2255.2.202 by Martin Pool
WorkingTree_4.kind should report tree-references if they're
986
            expected_kind = names[i]
987
            self.assertEqual(expected_kind, actual_kind)
2499.3.1 by Aaron Bentley
Fix Workingtree4.get_file_sha1 on missing files
988
3146.8.4 by Aaron Bentley
Eliminate direct use of inventory from transform application
989
    def test_stored_kind_with_missing(self):
990
        tree = self.make_branch_and_tree('tree')
991
        tree.lock_write()
992
        self.addCleanup(tree.unlock)
993
        self.build_tree(['tree/a', 'tree/b/'])
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
994
        tree.add(['a', 'b'])
3146.8.4 by Aaron Bentley
Eliminate direct use of inventory from transform application
995
        os.unlink('tree/a')
996
        os.rmdir('tree/b')
6809.4.7 by Jelmer Vernooij
Swap arguments for get_symlink_target and kind/stored_kind.
997
        self.assertEqual('file', tree.stored_kind('a'))
6816.1.1 by Jelmer Vernooij
Avoid passing in file ids.
998
        if tree.branch.repository._format.supports_versioned_directories:
6809.4.26 by Jelmer Vernooij
Merge trunk.
999
            self.assertEqual('directory', tree.stored_kind('b'))
3146.8.4 by Aaron Bentley
Eliminate direct use of inventory from transform application
1000
2499.3.1 by Aaron Bentley
Fix Workingtree4.get_file_sha1 on missing files
1001
    def test_missing_file_sha1(self):
1002
        """If a file is missing, its sha1 should be reported as None."""
1003
        tree = self.make_branch_and_tree('.')
1004
        tree.lock_write()
1005
        self.addCleanup(tree.unlock)
1006
        self.build_tree(['file'])
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
1007
        tree.add('file')
2499.3.1 by Aaron Bentley
Fix Workingtree4.get_file_sha1 on missing files
1008
        tree.commit('file added')
1009
        os.unlink('file')
6809.4.5 by Jelmer Vernooij
Swap arguments for get_file_*.
1010
        self.assertIs(None, tree.get_file_sha1('file'))
1551.15.56 by Aaron Bentley
Raise NoSuchId when get_file_sha1 is invoked with a baed file id
1011
1012
    def test_no_file_sha1(self):
6809.4.13 by Jelmer Vernooij
Fix tests.
1013
        """If a file is not present, get_file_sha1 should raise NoSuchFile"""
1551.15.56 by Aaron Bentley
Raise NoSuchId when get_file_sha1 is invoked with a baed file id
1014
        tree = self.make_branch_and_tree('.')
1015
        tree.lock_write()
1016
        self.addCleanup(tree.unlock)
6809.4.13 by Jelmer Vernooij
Fix tests.
1017
        self.assertRaises(errors.NoSuchFile, tree.get_file_sha1,
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
1018
                          'nonexistant')
1551.15.56 by Aaron Bentley
Raise NoSuchId when get_file_sha1 is invoked with a baed file id
1019
        self.build_tree(['file'])
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
1020
        tree.add('file')
1551.15.56 by Aaron Bentley
Raise NoSuchId when get_file_sha1 is invoked with a baed file id
1021
        tree.commit('foo')
1022
        tree.remove('file')
6809.4.13 by Jelmer Vernooij
Fix tests.
1023
        self.assertRaises(errors.NoSuchFile, tree.get_file_sha1,
6809.4.5 by Jelmer Vernooij
Swap arguments for get_file_*.
1024
                          'file')
3034.4.5 by Aaron Bentley
Add workingtree test for case_insensitive var
1025
1026
    def test_case_sensitive(self):
1027
        """If filesystem is case-sensitive, tree should report this.
1028
1029
        We check case-sensitivity by creating a file with a lowercase name,
1030
        then testing whether it exists with an uppercase name.
1031
        """
3034.4.9 by Alexander Belchenko
skip test_workingtree.TestWorkingTree.test_case_sensitive for WT2
1032
        self.build_tree(['filename'])
3034.4.5 by Aaron Bentley
Add workingtree test for case_insensitive var
1033
        if os.path.exists('FILENAME'):
1034
            case_sensitive = False
1035
        else:
1036
            case_sensitive = True
1037
        tree = self.make_branch_and_tree('test')
1038
        self.assertEqual(case_sensitive, tree.case_sensitive)
6113.1.1 by Jelmer Vernooij
Skip some tests against foreign formats.
1039
        if not isinstance(tree, InventoryWorkingTree):
1040
            raise TestNotApplicable("get_format_string is only available "
1041
                                    "on bzr working trees")
5632.1.1 by John Arbash Meinel
Make case_sensitive_filename an attribute of the format.
1042
        # now we cheat, and make a file that matches the case-sensitive name
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1043
        t = tree.controldir.get_workingtree_transport(None)
5632.1.1 by John Arbash Meinel
Make case_sensitive_filename an attribute of the format.
1044
        try:
1045
            content = tree._format.get_format_string()
1046
        except NotImplementedError:
1047
            # All-in-one formats didn't have a separate format string.
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1048
            content = tree.controldir._format.get_format_string()
5632.1.1 by John Arbash Meinel
Make case_sensitive_filename an attribute of the format.
1049
        t.put_bytes(tree._format.case_sensitive_filename, content)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1050
        tree = tree.controldir.open_workingtree()
5632.1.1 by John Arbash Meinel
Make case_sensitive_filename an attribute of the format.
1051
        self.assertFalse(tree.case_sensitive)
3146.8.2 by Aaron Bentley
Introduce iter_all_file_ids, to avoid hitting Inventory for this case
1052
6379.7.1 by Jelmer Vernooij
Add and use WorkingTree._supports_executable.
1053
    def test_supports_executable(self):
1054
        self.build_tree(['filename'])
1055
        tree = self.make_branch_and_tree('.')
1056
        tree.add('filename')
1057
        self.assertIsInstance(tree._supports_executable(), bool)
1058
        if tree._supports_executable():
1059
            tree.lock_read()
1060
            try:
6809.4.4 by Jelmer Vernooij
Swap arguments for Tree.is_executable.
1061
                self.assertFalse(tree.is_executable('filename'))
6379.7.1 by Jelmer Vernooij
Add and use WorkingTree._supports_executable.
1062
            finally:
1063
                tree.unlock()
6619.3.14 by Jelmer Vernooij
Convert some octal numbers to new notations.
1064
            os.chmod('filename', 0o755)
6379.7.1 by Jelmer Vernooij
Add and use WorkingTree._supports_executable.
1065
            self.addCleanup(tree.lock_read().unlock)
6809.4.4 by Jelmer Vernooij
Swap arguments for Tree.is_executable.
1066
            self.assertTrue(tree.is_executable('filename'))
6379.7.1 by Jelmer Vernooij
Add and use WorkingTree._supports_executable.
1067
        else:
1068
            self.addCleanup(tree.lock_read().unlock)
6809.4.4 by Jelmer Vernooij
Swap arguments for Tree.is_executable.
1069
            self.assertFalse(tree.is_executable('filename'))
6379.7.1 by Jelmer Vernooij
Add and use WorkingTree._supports_executable.
1070
3146.8.16 by Aaron Bentley
Updates from review
1071
    def test_all_file_ids_with_missing(self):
3146.8.2 by Aaron Bentley
Introduce iter_all_file_ids, to avoid hitting Inventory for this case
1072
        tree = self.make_branch_and_tree('tree')
1073
        tree.lock_write()
1074
        self.addCleanup(tree.unlock)
1075
        self.build_tree(['tree/a', 'tree/b'])
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
1076
        tree.add(['a', 'b'])
3146.8.2 by Aaron Bentley
Introduce iter_all_file_ids, to avoid hitting Inventory for this case
1077
        os.unlink('tree/a')
6745.1.1 by Jelmer Vernooij
Avoid explicitly setting file ids or guard it by checking
1078
        self.assertEqual(
7143.15.2 by Jelmer Vernooij
Run autopep8.
1079
            {'a', 'b', ''},
1080
            set(tree.all_versioned_paths()))
3146.8.19 by Aaron Bentley
Merge with bzr.dev
1081
3136.1.10 by Aaron Bentley
Clean error if filesystem does not support hard-links
1082
    def test_sprout_hardlink(self):
3619.6.9 by Mark Hammond
Move check for os.link to the start of the test
1083
        real_os_link = getattr(os, 'link', None)
1084
        if real_os_link is None:
1085
            raise TestNotApplicable("This platform doesn't provide os.link")
3136.1.10 by Aaron Bentley
Clean error if filesystem does not support hard-links
1086
        source = self.make_branch_and_tree('source')
1087
        self.build_tree(['source/file'])
1088
        source.add('file')
1089
        source.commit('added file')
7143.15.2 by Jelmer Vernooij
Run autopep8.
1090
3136.1.10 by Aaron Bentley
Clean error if filesystem does not support hard-links
1091
        def fake_link(source, target):
1092
            raise OSError(errno.EPERM, 'Operation not permitted')
1093
        os.link = fake_link
1094
        try:
1095
            # Hard-link support is optional, so supplying hardlink=True may
1096
            # or may not raise an exception.  But if it does, it must be
1097
            # HardLinkNotSupported
1098
            try:
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1099
                source.controldir.sprout('target', accelerator_tree=source,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1100
                                         hardlink=True)
3136.1.10 by Aaron Bentley
Clean error if filesystem does not support hard-links
1101
            except errors.HardLinkNotSupported:
1102
                pass
1103
        finally:
1104
            os.link = real_os_link
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
1105
1106
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1107
class TestWorkingTreeUpdate(TestCaseWithWorkingTree):
1108
1109
    def make_diverged_master_branch(self):
1110
        """
1111
        B: wt.branch.last_revision()
1112
        M: wt.branch.get_master_branch().last_revision()
1113
        W: wt.last_revision()
1114
1115
1116
            1
1117
            |\
1118
          B-2 3
1119
            | |
1120
            4 5-M
1121
            |
1122
            W
6162.3.2 by Jelmer Vernooij
Add WorkingTreeFormat.get_controldir_for_branch().
1123
        """
1124
        format = self.workingtree_format.get_controldir_for_branch()
1125
        builder = self.make_branch_builder(".", format=format)
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1126
        builder.start_series()
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1127
        revids = {}
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1128
        # mainline
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1129
        revids['1'] = builder.build_snapshot(
6816.2.1 by Jelmer Vernooij
Migrate some build_snapshot code over to having revision_id as keyword argument.
1130
            None,
6883.22.13 by Jelmer Vernooij
Actually pass in None file-ids to BranchBuilder.
1131
            [('add', ('', None, 'directory', '')),
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
1132
             ('add', ('file1', None, 'file', b'file1 content\n'))])
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1133
        # branch
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1134
        revids['2'] = builder.build_snapshot([revids['1']], [])
1135
        revids['4'] = builder.build_snapshot(
1136
            [revids['1']],
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
1137
            [('add', ('file4', None, 'file', b'file4 content\n'))])
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1138
        # master
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1139
        revids['3'] = builder.build_snapshot([revids['1']], [])
1140
        revids['5'] = builder.build_snapshot(
1141
            [revids['3']],
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
1142
            [('add', ('file5', None, 'file', b'file5 content\n'))])
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1143
        builder.finish_series()
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1144
        return (builder, builder._branch.last_revision(), revids)
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1145
4985.3.21 by Vincent Ladeuil
Final cleanup.
1146
    def make_checkout_and_master(self, builder, wt_path, master_path, wt_revid,
1147
                                 master_revid=None, branch_revid=None):
1148
        """Build a lightweight checkout and its master branch."""
1149
        if master_revid is None:
1150
            master_revid = wt_revid
1151
        if branch_revid is None:
1152
            branch_revid = master_revid
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1153
        final_branch = builder.get_branch()
1154
        # The master branch
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
1155
        master = final_branch.controldir.sprout(master_path,
7143.15.2 by Jelmer Vernooij
Run autopep8.
1156
                                                master_revid).open_branch()
4985.3.21 by Vincent Ladeuil
Final cleanup.
1157
        # The checkout
1158
        wt = self.make_branch_and_tree(wt_path)
1159
        wt.pull(final_branch, stop_revision=wt_revid)
7143.15.2 by Jelmer Vernooij
Run autopep8.
1160
        wt.branch.pull(
1161
            final_branch, stop_revision=branch_revid, overwrite=True)
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1162
        try:
4985.3.21 by Vincent Ladeuil
Final cleanup.
1163
            wt.branch.bind(master)
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1164
        except errors.UpgradeRequired:
4985.3.21 by Vincent Ladeuil
Final cleanup.
1165
            raise TestNotApplicable(
1166
                "Can't bind %s" % wt.branch._format.__class__)
1167
        return wt, master
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1168
1169
    def test_update_remove_commit(self):
1170
        """Update should remove revisions when the branch has removed
1171
        some commits.
1172
1173
        We want to revert 4, so that strating with the
1174
        make_diverged_master_branch() graph the final result should be
1175
        equivalent to:
1176
1177
           1
1178
           |\
1179
           3 2
1180
           | |\
1181
        MB-5 | 4
1182
           |/
1183
           W
1184
1185
        And the changes in 4 have been removed from the WT.
1186
        """
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1187
        builder, tip, revids = self.make_diverged_master_branch()
4985.3.21 by Vincent Ladeuil
Final cleanup.
1188
        wt, master = self.make_checkout_and_master(
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1189
            builder, 'checkout', 'master', revids['4'],
1190
            master_revid=tip, branch_revid=revids['2'])
4985.3.19 by Vincent Ladeuil
Make the test more precise.
1191
        # First update the branch
1192
        old_tip = wt.branch.update()
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1193
        self.assertEqual(revids['2'], old_tip)
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1194
        # No conflicts should occur
4985.3.21 by Vincent Ladeuil
Final cleanup.
1195
        self.assertEqual(0, wt.update(old_tip=old_tip))
4985.3.19 by Vincent Ladeuil
Make the test more precise.
1196
        # We are in sync with the master
1197
        self.assertEqual(tip, wt.branch.last_revision())
4985.3.20 by Vincent Ladeuil
Remove the blackbox test and fix typo.
1198
        # We have the right parents ready to be committed
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1199
        self.assertEqual([revids['5'], revids['2']],
1200
                         wt.get_parent_ids())
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1201
4985.3.21 by Vincent Ladeuil
Final cleanup.
1202
    def test_update_revision(self):
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1203
        builder, tip, revids = self.make_diverged_master_branch()
4985.3.21 by Vincent Ladeuil
Final cleanup.
1204
        wt, master = self.make_checkout_and_master(
6821.2.2 by Jelmer Vernooij
More foreign fixes.
1205
            builder, 'checkout', 'master', revids['4'],
1206
            master_revid=tip, branch_revid=revids['2'])
1207
        self.assertEqual(0, wt.update(revision=revids['1']))
1208
        self.assertEqual(revids['1'], wt.last_revision())
4985.3.21 by Vincent Ladeuil
Final cleanup.
1209
        self.assertEqual(tip, wt.branch.last_revision())
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
1210
        self.assertPathExists('checkout/file1')
1211
        self.assertPathDoesNotExist('checkout/file4')
1212
        self.assertPathDoesNotExist('checkout/file5')
4985.3.21 by Vincent Ladeuil
Final cleanup.
1213
4985.3.18 by Vincent Ladeuil
Start rewriting the test.
1214
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
1215
class TestIllegalPaths(TestCaseWithWorkingTree):
1216
1217
    def test_bad_fs_path(self):
3638.3.14 by Vincent Ladeuil
Make test_bad_fs_path not applicable on OSX.
1218
        if osutils.normalizes_filenames():
1219
            # You *can't* create an illegal filename on OSX.
1220
            raise tests.TestNotApplicable('OSX normalizes filenames')
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
1221
        self.requireFeature(features.UTF8Filesystem)
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
1222
        # We require a UTF8 filesystem, because otherwise we would need to get
1223
        # tricky to figure out how to create an illegal filename.
1224
        # \xb5 is an illegal path because it should be \xc2\xb5 for UTF-8
1225
        tree = self.make_branch_and_tree('tree')
6883.14.3 by Jelmer Vernooij
Merge badfs test fix.
1226
        self.build_tree(['tree/subdir/', 'tree/subdir/somefile'])
1227
        tree.add(['subdir', 'subdir/somefile'])
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
1228
7058.4.5 by Jelmer Vernooij
Fix bad_fs_path.
1229
        with open(b'tree/subdir/m\xb5', 'wb') as f:
6973.7.5 by Jelmer Vernooij
s/file/open.
1230
            f.write(b'trivial\n')
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
1231
1232
        tree.lock_read()
1233
        self.addCleanup(tree.unlock)
1234
        basis = tree.basis_tree()
1235
        basis.lock_read()
1236
        self.addCleanup(basis.unlock)
1237
1238
        e = self.assertListRaises(errors.BadFilenameEncoding,
1239
                                  tree.iter_changes, tree.basis_tree(),
6883.14.3 by Jelmer Vernooij
Merge badfs test fix.
1240
                                  want_unversioned=True)
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
1241
        # We should display the relative path
7058.4.5 by Jelmer Vernooij
Fix bad_fs_path.
1242
        self.assertEqual(b'subdir/m\xb5', e.filename)
3287.20.3 by John Arbash Meinel
Aaron recommended to make this a WT_impl test.
1243
        self.assertEqual(osutils._fs_enc, e.fs_encoding)
5158.6.5 by Martin Pool
Implement ControlComponent on WorkingTree
1244
1245
1246
class TestControlComponent(TestCaseWithWorkingTree):
1247
    """WorkingTree implementations adequately implement ControlComponent."""
6059.4.4 by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config.
1248
5158.6.5 by Martin Pool
Implement ControlComponent on WorkingTree
1249
    def test_urls(self):
1250
        wt = self.make_branch_and_tree('wt')
1251
        self.assertIsInstance(wt.user_url, str)
1252
        self.assertEqual(wt.user_url, wt.user_transport.base)
1253
        self.assertEqual(wt.control_url, wt.control_transport.base)
5807.4.7 by John Arbash Meinel
Add a config setting.
1254
1255
1256
class TestWorthSavingLimit(TestCaseWithWorkingTree):
1257
1258
    def make_wt_with_worth_saving_limit(self):
1259
        wt = self.make_branch_and_tree('wt')
1260
        if getattr(wt, '_worth_saving_limit', None) is None:
1261
            raise tests.TestNotApplicable('no _worth_saving_limit for'
1262
                                          ' this tree type')
1263
        wt.lock_write()
1264
        self.addCleanup(wt.unlock)
1265
        return wt
1266
1267
    def test_not_set(self):
1268
        # Default should be 10
1269
        wt = self.make_wt_with_worth_saving_limit()
1270
        self.assertEqual(10, wt._worth_saving_limit())
1271
        ds = wt.current_dirstate()
1272
        self.assertEqual(10, ds._worth_saving_limit)
1273
1274
    def test_set_in_branch(self):
1275
        wt = self.make_wt_with_worth_saving_limit()
6449.4.3 by Jelmer Vernooij
Use WorkingTree.get_config_stack.
1276
        conf = wt.get_config_stack()
6059.4.4 by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config.
1277
        conf.set('bzr.workingtree.worth_saving_limit', '20')
5807.4.7 by John Arbash Meinel
Add a config setting.
1278
        self.assertEqual(20, wt._worth_saving_limit())
1279
        ds = wt.current_dirstate()
1280
        self.assertEqual(10, ds._worth_saving_limit)
1281
1282
    def test_invalid(self):
1283
        wt = self.make_wt_with_worth_saving_limit()
6449.4.3 by Jelmer Vernooij
Use WorkingTree.get_config_stack.
1284
        conf = wt.get_config_stack()
6059.4.4 by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config.
1285
        conf.set('bzr.workingtree.worth_saving_limit', 'a')
5807.4.7 by John Arbash Meinel
Add a config setting.
1286
        # If the config entry is invalid, default to 10
6059.4.4 by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config.
1287
        warnings = []
7143.15.2 by Jelmer Vernooij
Run autopep8.
1288
6059.4.4 by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config.
1289
        def warning(*args):
1290
            warnings.append(args[0] % args[1:])
1291
        self.overrideAttr(trace, 'warning', warning)
5807.4.7 by John Arbash Meinel
Add a config setting.
1292
        self.assertEqual(10, wt._worth_saving_limit())
6059.4.4 by Vincent Ladeuil
Migrate bzr.workingtree.worth_saving_limit to stack-based config.
1293
        self.assertLength(1, warnings)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1294
        self.assertEqual('Value "a" is not valid for'
7143.15.2 by Jelmer Vernooij
Run autopep8.
1295
                         ' "bzr.workingtree.worth_saving_limit"',
1296
                         warnings[0])
5993.3.1 by Jelmer Vernooij
Add WorkingTreeFormat.supports_versioned_directories attribute.
1297
1298
1299
class TestFormatAttributes(TestCaseWithWorkingTree):
1300
1301
    def test_versioned_directories(self):
1302
        self.assertSubset(
1303
            [self.workingtree_format.supports_versioned_directories],
1304
            (True, False))
6741.1.1 by Jelmer Vernooij
Add WorkingTreeFormat.supports_setting_file_ids.
1305
1306
    def test_supports_setting_file_ids(self):
1307
        self.assertSubset(
1308
            [self.workingtree_format.supports_setting_file_ids],
1309
            (True, False))
6772.3.2 by Jelmer Vernooij
Add flag for store uncommitted in working tree formats.
1310
1311
    def test_supports_store_uncommitted(self):
1312
        self.assertSubset(
1313
            [self.workingtree_format.supports_store_uncommitted],
1314
            (True, False))