/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2005-2012, 2016 Canonical Ltd
1399.1.12 by Robert Collins
add new test script
2
# Authors:  Robert Collins <robert.collins@canonical.com>
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1399.1.12 by Robert Collins
add new test script
17
7122.6.1 by Jelmer Vernooij
merge Parth's work into Breezy
18
from io import BytesIO
6469.1.19 by Parth Malwankar
added merge test
19
import os
20
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
21
from .. import (
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
22
    conflicts,
23
    errors,
7350.1.2 by Vincent Ladeuil
Fix wrong conflict resolution.
24
    symbol_versioning,
6469.1.19 by Parth Malwankar
added merge test
25
    trace,
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
26
    transport,
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
27
    workingtree,
6670.4.1 by Jelmer Vernooij
Update imports.
28
    )
29
from ..bzr import (
30
    bzrdir,
31
    workingtree as bzrworkingtree,
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
32
    workingtree_3,
5816.5.7 by Jelmer Vernooij
Fix more imports.
33
    workingtree_4,
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
34
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
35
from ..lock import write_locked
36
from ..lockdir import LockDir
37
from . import TestCase, TestCaseWithTransport, TestSkipped
6846.6.1 by Jelmer Vernooij
Move Tree{Link,File,Directory,Entry} to breezy.tree.
38
from ..tree import (
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
39
    TreeEntry,
40
    TreeDirectory,
41
    TreeFile,
42
    TreeLink,
43
    )
1399.1.12 by Robert Collins
add new test script
44
7122.6.1 by Jelmer Vernooij
merge Parth's work into Breezy
45
from .features import SymlinkFeature
2255.2.121 by John Arbash Meinel
split out the WorkingTreeFormat4 tests into a separate test file
46
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
47
class TestTreeDirectory(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
48
49
    def test_kind_character(self):
50
        self.assertEqual(TreeDirectory().kind_character(), '/')
51
52
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
53
class TestTreeEntry(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
54
55
    def test_kind_character(self):
56
        self.assertEqual(TreeEntry().kind_character(), '???')
57
58
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
59
class TestTreeFile(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
60
61
    def test_kind_character(self):
62
        self.assertEqual(TreeFile().kind_character(), '')
63
64
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
65
class TestTreeLink(TestCaseWithTransport):
1399.1.12 by Robert Collins
add new test script
66
67
    def test_kind_character(self):
68
        self.assertEqual(TreeLink().kind_character(), '')
69
70
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
71
class TestDefaultFormat(TestCaseWithTransport):
72
73
    def test_get_set_default_format(self):
5662.3.3 by Jelmer Vernooij
add tests
74
        old_format = workingtree.format_registry.get_default()
5816.5.2 by Jelmer Vernooij
Fix comment - default wt format is 6.
75
        # default is 6
7143.15.2 by Jelmer Vernooij
Run autopep8.
76
        self.assertTrue(isinstance(
77
            old_format, workingtree_4.WorkingTreeFormat6))
5662.3.3 by Jelmer Vernooij
add tests
78
        workingtree.format_registry.set_default(SampleTreeFormat())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
79
        try:
80
            # the default branch format is used by the meta dir format
81
            # which is not the default bzrdir format at this point
82
            dir = bzrdir.BzrDirMetaFormat1().initialize('.')
83
            dir.create_repository()
84
            dir.create_branch()
85
            result = dir.create_workingtree()
86
            self.assertEqual(result, 'A tree')
87
        finally:
5662.3.3 by Jelmer Vernooij
add tests
88
            workingtree.format_registry.set_default(old_format)
89
        self.assertEqual(old_format, workingtree.format_registry.get_default())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
90
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
91
    def test_from_string(self):
92
        self.assertIsInstance(
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
93
            SampleTreeFormat.from_string(b"Sample tree format."),
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
94
            SampleTreeFormat)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
95
        self.assertRaises(
96
            AssertionError, SampleTreeFormat.from_string,
97
            b"Different format string.")
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
98
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
99
    def test_get_set_default_format_by_key(self):
100
        old_format = workingtree.format_registry.get_default()
5816.5.7 by Jelmer Vernooij
Fix more imports.
101
        # default is 6
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
102
        format = SampleTreeFormat()
103
        workingtree.format_registry.register(format)
104
        self.addCleanup(workingtree.format_registry.remove, format)
7143.15.2 by Jelmer Vernooij
Run autopep8.
105
        self.assertTrue(isinstance(
106
            old_format, workingtree_4.WorkingTreeFormat6))
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
107
        workingtree.format_registry.set_default_key(format.get_format_string())
108
        try:
109
            # the default branch format is used by the meta dir format
110
            # which is not the default bzrdir format at this point
111
            dir = bzrdir.BzrDirMetaFormat1().initialize('.')
112
            dir.create_repository()
113
            dir.create_branch()
114
            result = dir.create_workingtree()
115
            self.assertEqual(result, 'A tree')
116
        finally:
117
            workingtree.format_registry.set_default_key(
118
                old_format.get_format_string())
119
        self.assertEqual(old_format, workingtree.format_registry.get_default())
120
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
121
    def test_open(self):
122
        tree = self.make_branch_and_tree('.')
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
123
        open_direct = workingtree.WorkingTree.open('.')
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
124
        self.assertEqual(tree.basedir, open_direct.basedir)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
125
        open_no_args = workingtree.WorkingTree.open()
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
126
        self.assertEqual(tree.basedir, open_no_args.basedir)
127
128
    def test_open_containing(self):
129
        tree = self.make_branch_and_tree('.')
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
130
        open_direct, relpath = workingtree.WorkingTree.open_containing('.')
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
131
        self.assertEqual(tree.basedir, open_direct.basedir)
132
        self.assertEqual('', relpath)
3753.1.2 by John Arbash Meinel
Switch to using the class attribute, rather than the instance
133
        open_no_args, relpath = workingtree.WorkingTree.open_containing()
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
134
        self.assertEqual(tree.basedir, open_no_args.basedir)
135
        self.assertEqual('', relpath)
7143.15.2 by Jelmer Vernooij
Run autopep8.
136
        open_subdir, relpath = workingtree.WorkingTree.open_containing(
137
            'subdir')
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
138
        self.assertEqual(tree.basedir, open_subdir.basedir)
139
        self.assertEqual('subdir', relpath)
140
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
141
6653.3.1 by Jelmer Vernooij
Move bzr-specific code to breezy.bzrworkingtree.
142
class SampleTreeFormat(bzrworkingtree.WorkingTreeFormatMetaDir):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
143
    """A sample format
144
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
145
    this format is initializable, unsupported to aid in testing the
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
146
    open and open_downlevel routines.
147
    """
148
6349.2.4 by Jelmer Vernooij
Add test for WorkingTreeFormat.from_string.
149
    @classmethod
150
    def get_format_string(cls):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
151
        """See WorkingTreeFormat.get_format_string()."""
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
152
        return b"Sample tree format."
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
153
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
154
    def initialize(self, a_controldir, revision_id=None, from_branch=None,
3136.1.5 by Aaron Bentley
Fix sample workingtree format
155
                   accelerator_tree=None, hardlink=False):
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
156
        """Sample branches cannot be created."""
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
157
        t = a_controldir.get_workingtree_transport(self)
1955.3.13 by John Arbash Meinel
Run the full test suite, and fix up any deprecation warnings.
158
        t.put_bytes('format', self.get_format_string())
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
159
        return 'A tree'
160
161
    def is_supported(self):
162
        return False
163
164
    def open(self, transport, _found=False):
165
        return "opened tree."
166
167
5642.2.4 by Jelmer Vernooij
add tests.
168
class SampleExtraTreeFormat(workingtree.WorkingTreeFormat):
169
    """A sample format that does not support use in a metadir.
170
171
    """
172
173
    def get_format_string(self):
174
        # Not usable in a metadir, so no format string
175
        return None
176
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
177
    def initialize(self, a_controldir, revision_id=None, from_branch=None,
5642.2.4 by Jelmer Vernooij
add tests.
178
                   accelerator_tree=None, hardlink=False):
179
        raise NotImplementedError(self.initialize)
180
181
    def is_supported(self):
182
        return False
183
184
    def open(self, transport, _found=False):
185
        raise NotImplementedError(self.open)
186
187
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
188
class TestWorkingTreeFormat(TestCaseWithTransport):
189
    """Tests for the WorkingTreeFormat facility."""
190
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
191
    def test_find_format_string(self):
192
        # is the right format object found for a working tree?
193
        branch = self.make_branch('branch')
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
194
        self.assertRaises(
195
            errors.NoWorkingTree,
196
            bzrworkingtree.WorkingTreeFormatMetaDir.find_format_string,
197
            branch.controldir)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
198
        transport = branch.controldir.get_workingtree_transport(None)
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
199
        transport.mkdir('.')
7045.4.23 by Jelmer Vernooij
Fix some help tests.
200
        transport.put_bytes("format", b"some format name")
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
201
        # The format does not have to be known by Bazaar,
202
        # find_format_string just retrieves the name
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
203
        self.assertEqual(
204
            b"some format name",
205
            bzrworkingtree.WorkingTreeFormatMetaDir.find_format_string(
206
                branch.controldir))
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
207
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
208
    def test_find_format(self):
209
        # is the right format object found for a working tree?
210
        # create a branch with a few known format objects.
211
        self.build_tree(["foo/", "bar/"])
7143.15.2 by Jelmer Vernooij
Run autopep8.
212
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
213
        def check_format(format, url):
6746.2.1 by Jelmer Vernooij
Rename matchingbzrdir to matchingcontroldir.
214
            dir = format._matchingcontroldir.initialize(url)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
215
            dir.create_repository()
216
            dir.create_branch()
217
            format.initialize(dir)
7143.15.2 by Jelmer Vernooij
Run autopep8.
218
            found_format = bzrworkingtree.WorkingTreeFormatMetaDir.find_format(
219
                dir)
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
220
            self.assertIsInstance(found_format, format.__class__)
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
221
        check_format(workingtree_3.WorkingTreeFormat3(), "bar")
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_find_format_no_tree(self):
224
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
225
        self.assertRaises(errors.NoWorkingTree,
6653.5.1 by Jelmer Vernooij
Fix some more tests.
226
                          bzrworkingtree.WorkingTreeFormatMetaDir.find_format,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
227
                          dir)
228
229
    def test_find_format_unknown_format(self):
230
        dir = bzrdir.BzrDirMetaFormat1().initialize('.')
231
        dir.create_repository()
232
        dir.create_branch()
233
        SampleTreeFormat().initialize(dir)
234
        self.assertRaises(errors.UnknownFormatError,
6653.5.1 by Jelmer Vernooij
Fix some more tests.
235
                          bzrworkingtree.WorkingTreeFormatMetaDir.find_format,
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
236
                          dir)
237
6213.1.36 by Jelmer Vernooij
Add news entry, test for working tree features.
238
    def test_find_format_with_features(self):
239
        tree = self.make_branch_and_tree('.', format='2a')
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
240
        tree.update_feature_flags({b"name": b"necessity"})
6653.5.1 by Jelmer Vernooij
Fix some more tests.
241
        found_format = bzrworkingtree.WorkingTreeFormatMetaDir.find_format(
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
242
            tree.controldir)
6213.1.36 by Jelmer Vernooij
Add news entry, test for working tree features.
243
        self.assertIsInstance(found_format, workingtree.WorkingTreeFormat)
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
244
        self.assertEqual(found_format.features.get(b"name"), b"necessity")
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
245
        self.assertRaises(
246
            bzrdir.MissingFeature, found_format.check_support_status, True)
247
        self.addCleanup(
248
            bzrworkingtree.WorkingTreeFormatMetaDir.unregister_feature,
249
            b"name")
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
250
        bzrworkingtree.WorkingTreeFormatMetaDir.register_feature(b"name")
6213.1.36 by Jelmer Vernooij
Add news entry, test for working tree features.
251
        found_format.check_support_status(True)
252
5662.3.3 by Jelmer Vernooij
add tests
253
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
254
class TestWorkingTreeIterEntriesByDir_wSubtrees(TestCaseWithTransport):
255
256
    def make_simple_tree(self):
257
        tree = self.make_branch_and_tree('tree', format='development-subtree')
258
        self.build_tree(['tree/a/', 'tree/a/b/', 'tree/a/b/c'])
6855.4.1 by Jelmer Vernooij
Yet more bees.
259
        tree.set_root_id(b'root-id')
260
        tree.add(['a', 'a/b', 'a/b/c'], [b'a-id', b'b-id', b'c-id'])
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
261
        tree.commit('initial')
262
        return tree
263
264
    def test_just_directory(self):
265
        tree = self.make_simple_tree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
266
        self.assertEqual([('directory', b'root-id'),
267
                          ('directory', b'a-id'),
268
                          ('directory', b'b-id'),
269
                          ('file', b'c-id')],
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
270
                         [(ie.kind, ie.file_id)
271
                          for path, ie in tree.iter_entries_by_dir()])
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
272
        self.make_branch_and_tree('tree/a/b')
6855.4.1 by Jelmer Vernooij
Yet more bees.
273
        self.assertEqual([('tree-reference', b'b-id')],
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
274
                         [(ie.kind, ie.file_id)
6885.6.1 by Jelmer Vernooij
Support specific_files argument to Tree.iter_entries_by_dir.
275
                          for path, ie in tree.iter_entries_by_dir(
276
                              specific_files=['a/b'])])
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
277
278
    def test_direct_subtree(self):
279
        tree = self.make_simple_tree()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
280
        self.make_branch_and_tree('tree/a/b')
6855.4.1 by Jelmer Vernooij
Yet more bees.
281
        self.assertEqual([('directory', b'root-id'),
282
                          ('directory', b'a-id'),
283
                          ('tree-reference', b'b-id')],
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
284
                         [(ie.kind, ie.file_id)
285
                          for path, ie in tree.iter_entries_by_dir()])
286
287
    def test_indirect_subtree(self):
288
        tree = self.make_simple_tree()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
289
        self.make_branch_and_tree('tree/a')
6855.4.1 by Jelmer Vernooij
Yet more bees.
290
        self.assertEqual([('directory', b'root-id'),
291
                          ('tree-reference', b'a-id')],
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
292
                         [(ie.kind, ie.file_id)
293
                          for path, ie in tree.iter_entries_by_dir()])
294
295
5662.3.3 by Jelmer Vernooij
add tests
296
class TestWorkingTreeFormatRegistry(TestCase):
297
298
    def setUp(self):
299
        super(TestWorkingTreeFormatRegistry, self).setUp()
300
        self.registry = workingtree.WorkingTreeFormatRegistry()
301
302
    def test_register_unregister_format(self):
303
        format = SampleTreeFormat()
304
        self.registry.register(format)
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
305
        self.assertEqual(format, self.registry.get(b"Sample tree format."))
5662.3.3 by Jelmer Vernooij
add tests
306
        self.registry.remove(format)
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
307
        self.assertRaises(KeyError, self.registry.get, b"Sample tree format.")
5662.3.3 by Jelmer Vernooij
add tests
308
309
    def test_get_all(self):
310
        format = SampleTreeFormat()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
311
        self.assertEqual([], self.registry._get_all())
5662.3.3 by Jelmer Vernooij
add tests
312
        self.registry.register(format)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
313
        self.assertEqual([format], self.registry._get_all())
5662.3.3 by Jelmer Vernooij
add tests
314
315
    def test_register_extra(self):
5642.2.4 by Jelmer Vernooij
add tests.
316
        format = SampleExtraTreeFormat()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
317
        self.assertEqual([], self.registry._get_all())
5662.3.3 by Jelmer Vernooij
add tests
318
        self.registry.register_extra(format)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
319
        self.assertEqual([format], self.registry._get_all())
5662.3.3 by Jelmer Vernooij
add tests
320
321
    def test_register_extra_lazy(self):
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
322
        self.assertEqual([], self.registry._get_all())
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
323
        self.registry.register_extra_lazy("breezy.tests.test_workingtree",
7143.15.2 by Jelmer Vernooij
Run autopep8.
324
                                          "SampleExtraTreeFormat")
5662.3.3 by Jelmer Vernooij
add tests
325
        formats = self.registry._get_all()
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
326
        self.assertEqual(1, len(formats))
5662.3.3 by Jelmer Vernooij
add tests
327
        self.assertIsInstance(formats[0], SampleExtraTreeFormat)
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
328
329
330
class TestWorkingTreeFormat3(TestCaseWithTransport):
331
    """Tests specific to WorkingTreeFormat3."""
332
333
    def test_disk_layout(self):
334
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
335
        control.create_repository()
336
        control.create_branch()
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
337
        workingtree_3.WorkingTreeFormat3().initialize(control)
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
338
        # we want:
339
        # format 'Bazaar-NG Working Tree format 3'
340
        # inventory = blank inventory
341
        # pending-merges = ''
342
        # stat-cache = ??
343
        # no inventory.basis yet
344
        t = control.get_workingtree_transport(None)
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
345
        self.assertEqualDiff(b'Bazaar-NG Working Tree format 3',
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
346
                             t.get('format').read())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
347
        self.assertEqualDiff(t.get('inventory').read(),
7143.15.2 by Jelmer Vernooij
Run autopep8.
348
                             b'<inventory format="5">\n'
349
                             b'</inventory>\n',
1731.1.33 by Aaron Bentley
Revert no-special-root changes
350
                             )
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
351
        self.assertEqualDiff(b'### bzr hashcache v5\n',
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
352
                             t.get('stat-cache').read())
353
        self.assertFalse(t.has('inventory.basis'))
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
354
        # no last-revision file means 'None' or 'NULLREVISION'
355
        self.assertFalse(t.has('last-revision'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
356
        # TODO RBC 20060210 do a commit, check the inventory.basis is created
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
357
        # correctly and last-revision file becomes present.
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
358
359
    def test_uses_lockdir(self):
360
        """WorkingTreeFormat3 uses its own LockDir:
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
361
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
362
            - lock is a directory
363
            - when the WorkingTree is locked, LockDir can see that
364
        """
365
        t = self.get_transport()
366
        url = self.get_url()
367
        dir = bzrdir.BzrDirMetaFormat1().initialize(url)
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
368
        dir.create_repository()
369
        dir.create_branch()
1558.10.1 by Aaron Bentley
Handle lockdirs over NFS properly
370
        try:
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
371
            tree = workingtree_3.WorkingTreeFormat3().initialize(dir)
1558.10.1 by Aaron Bentley
Handle lockdirs over NFS properly
372
        except errors.NotLocalUrl:
373
            raise TestSkipped('Not a local URL')
1553.5.74 by Martin Pool
Convert WorkingTree format3 to use LockDirs
374
        self.assertIsDirectory('.bzr', t)
375
        self.assertIsDirectory('.bzr/checkout', t)
376
        self.assertIsDirectory('.bzr/checkout/lock', t)
377
        our_lock = LockDir(t, '.bzr/checkout/lock')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
378
        self.assertEqual(our_lock.peek(), None)
6969.3.2 by Jelmer Vernooij
Use context managers for locking.
379
        with tree.lock_write():
380
            self.assertTrue(our_lock.peek())
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
381
        self.assertEqual(our_lock.peek(), None)
1534.10.6 by Aaron Bentley
Conflict serialization working for WorkingTree3
382
1815.2.2 by Jelmer Vernooij
Move missing_pending_merges test to WorkingTreeFormat3-specific tests.
383
    def test_missing_pending_merges(self):
384
        control = bzrdir.BzrDirMetaFormat1().initialize(self.get_url())
385
        control.create_repository()
386
        control.create_branch()
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
387
        tree = workingtree_3.WorkingTreeFormat3().initialize(control)
3407.2.14 by Martin Pool
Remove more cases of getting transport via control_files
388
        tree._transport.delete("pending-merges")
1908.6.11 by Robert Collins
Remove usage of tree.pending_merges().
389
        self.assertEqual([], tree.get_parent_ids())
1815.2.2 by Jelmer Vernooij
Move missing_pending_merges test to WorkingTreeFormat3-specific tests.
390
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
391
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
392
class TestRevert(TestCaseWithTransport):
393
394
    def test_revert_conflicts_recursive(self):
395
        this_tree = self.make_branch_and_tree('this-tree')
396
        self.build_tree_contents([('this-tree/foo/',),
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
397
                                  ('this-tree/foo/bar', b'bar')])
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
398
        this_tree.add(['foo', 'foo/bar'])
399
        this_tree.commit('created foo/bar')
7143.15.2 by Jelmer Vernooij
Run autopep8.
400
        other_tree = this_tree.controldir.sprout(
401
            'other-tree').open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
402
        self.build_tree_contents([('other-tree/foo/bar', b'baz')])
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
403
        other_tree.commit('changed bar')
6855.4.1 by Jelmer Vernooij
Yet more bees.
404
        self.build_tree_contents([('this-tree/foo/bar', b'qux')])
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
405
        this_tree.commit('changed qux')
406
        this_tree.merge_from_branch(other_tree.branch)
407
        self.assertEqual(1, len(this_tree.conflicts()))
408
        this_tree.revert(['foo'])
409
        self.assertEqual(0, len(this_tree.conflicts()))
410
411
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
412
class TestAutoResolve(TestCaseWithTransport):
413
6543.2.2 by Martin Packman
Deprecate WorkingTree.auto_resolve
414
    def _auto_resolve(self, tree):
415
        """Call auto_resolve on tree expecting deprecation"""
416
        return self.applyDeprecated(
7290.25.5 by Jelmer Vernooij
Fix typo in the test.
417
            symbol_versioning.deprecated_in((3, 0, 1)),
6543.2.2 by Martin Packman
Deprecate WorkingTree.auto_resolve
418
            tree.auto_resolve,)
419
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
420
    def test_auto_resolve(self):
421
        base = self.make_branch_and_tree('base')
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
422
        self.build_tree_contents([('base/hello', b'Hello')])
6855.4.1 by Jelmer Vernooij
Yet more bees.
423
        base.add('hello', b'hello_id')
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
424
        base.commit('Hello')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
425
        other = base.controldir.sprout('other').open_workingtree()
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
426
        self.build_tree_contents([('other/hello', b'hELLO')])
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
427
        other.commit('Case switch')
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
428
        this = base.controldir.sprout('this').open_workingtree()
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
429
        self.assertPathExists('this/hello')
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
430
        self.build_tree_contents([('this/hello', b'Hello World')])
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
431
        this.commit('Add World')
432
        this.merge_from_branch(other.branch)
6855.4.1 by Jelmer Vernooij
Yet more bees.
433
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
434
                         this.conflicts())
6543.2.2 by Martin Packman
Deprecate WorkingTree.auto_resolve
435
        self._auto_resolve(this)
7290.25.1 by Jelmer Vernooij
merge lp:~gz/bzr/resolve_auto_refactor
436
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
437
                         this.conflicts())
438
        self.build_tree_contents([('this/hello', '<<<<<<<')])
6543.2.2 by Martin Packman
Deprecate WorkingTree.auto_resolve
439
        self._auto_resolve(this)
7290.25.1 by Jelmer Vernooij
merge lp:~gz/bzr/resolve_auto_refactor
440
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
441
                         this.conflicts())
442
        self.build_tree_contents([('this/hello', '=======')])
6543.2.2 by Martin Packman
Deprecate WorkingTree.auto_resolve
443
        self._auto_resolve(this)
7290.25.1 by Jelmer Vernooij
merge lp:~gz/bzr/resolve_auto_refactor
444
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
445
                         this.conflicts())
446
        self.build_tree_contents([('this/hello', '\n>>>>>>>')])
6543.2.2 by Martin Packman
Deprecate WorkingTree.auto_resolve
447
        remaining, resolved = self._auto_resolve(this)
6855.4.1 by Jelmer Vernooij
Yet more bees.
448
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
449
                         this.conflicts())
450
        self.assertEqual([], resolved)
6855.2.2 by Jelmer Vernooij
Format strings are bytes.
451
        self.build_tree_contents([('this/hello', b'hELLO wORLD')])
6543.2.2 by Martin Packman
Deprecate WorkingTree.auto_resolve
452
        remaining, resolved = self._auto_resolve(this)
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
453
        self.assertEqual([], this.conflicts())
6855.4.1 by Jelmer Vernooij
Yet more bees.
454
        self.assertEqual([conflicts.TextConflict('hello', b'hello_id')],
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
455
                         resolved)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
456
        self.assertPathDoesNotExist('this/hello.BASE')
2120.7.3 by Aaron Bentley
Update resolve command to automatically mark conflicts as resolved
457
6469.1.19 by Parth Malwankar
added merge test
458
    def test_unsupported_symlink_auto_resolve(self):
459
        self.requireFeature(SymlinkFeature)
460
        base = self.make_branch_and_tree('base')
461
        self.build_tree_contents([('base/hello', 'Hello')])
7122.6.12 by Jelmer Vernooij
Fix more python3 tests.
462
        base.add('hello', b'hello_id')
6469.1.19 by Parth Malwankar
added merge test
463
        base.commit('commit 0')
7122.6.1 by Jelmer Vernooij
merge Parth's work into Breezy
464
        other = base.controldir.sprout('other').open_workingtree()
6469.1.19 by Parth Malwankar
added merge test
465
        self.build_tree_contents([('other/hello', 'Hello')])
466
        os.symlink('other/hello', 'other/foo')
7122.6.12 by Jelmer Vernooij
Fix more python3 tests.
467
        other.add('foo', b'foo_id')
6469.1.19 by Parth Malwankar
added merge test
468
        other.commit('commit symlink')
7122.6.1 by Jelmer Vernooij
merge Parth's work into Breezy
469
        this = base.controldir.sprout('this').open_workingtree()
6469.1.19 by Parth Malwankar
added merge test
470
        self.assertPathExists('this/hello')
471
        self.build_tree_contents([('this/hello', 'Hello')])
472
        this.commit('commit 2')
7122.6.1 by Jelmer Vernooij
merge Parth's work into Breezy
473
        log = BytesIO()
6469.1.19 by Parth Malwankar
added merge test
474
        trace.push_log_file(log)
475
        os_symlink = getattr(os, 'symlink', None)
476
        os.symlink = None
477
        try:
478
            this.merge_from_branch(other.branch)
479
        finally:
480
            if os_symlink:
481
                os.symlink = os_symlink
482
        self.assertContainsRe(
483
            log.getvalue(),
7122.6.6 by Jelmer Vernooij
Fix more tests.
484
            b'Unable to create symlink "foo" on this filesystem')
6469.1.19 by Parth Malwankar
added merge test
485
2120.7.3 by Aaron Bentley
Update resolve command to automatically mark conflicts as resolved
486
    def test_auto_resolve_dir(self):
487
        tree = self.make_branch_and_tree('tree')
488
        self.build_tree(['tree/hello/'])
6855.4.1 by Jelmer Vernooij
Yet more bees.
489
        tree.add('hello', b'hello-id')
7290.25.5 by Jelmer Vernooij
Fix typo in the test.
490
        file_conflict = conflicts.TextConflict('hello', b'hello-id')
2120.7.3 by Aaron Bentley
Update resolve command to automatically mark conflicts as resolved
491
        tree.set_conflicts(conflicts.ConflictList([file_conflict]))
7290.25.6 by Jelmer Vernooij
Some more tests.
492
        remaining, resolved = self._auto_resolve(tree)
493
        self.assertEqual(
494
            remaining,
495
            conflicts.ConflictList([conflicts.TextConflict(u'hello', 'hello-id')]))
496
        self.assertEqual(resolved, [])
497
498
    def test_auto_resolve_missing(self):
499
        tree = self.make_branch_and_tree('tree')
500
        file_conflict = conflicts.TextConflict('hello', b'hello-id')
501
        tree.set_conflicts(conflicts.ConflictList([file_conflict]))
502
        remaining, resolved = self._auto_resolve(tree)
503
        self.assertEqual(remaining, [])
504
        self.assertEqual(
505
            resolved,
506
            conflicts.ConflictList([conflicts.TextConflict(u'hello', 'hello-id')]))
3140.1.4 by Aaron Bentley
Add WorkingTree.find_trees
507
508
6538.1.5 by Aaron Bentley
Implement WorkingTree.store_uncommitted.
509
class TestStoredUncommitted(TestCaseWithTransport):
510
511
    def store_uncommitted(self):
512
        tree = self.make_branch_and_tree('tree')
513
        tree.commit('get root in there')
6855.4.1 by Jelmer Vernooij
Yet more bees.
514
        self.build_tree_contents([('tree/file', b'content')])
515
        tree.add('file', b'file-id')
6538.1.5 by Aaron Bentley
Implement WorkingTree.store_uncommitted.
516
        tree.store_uncommitted()
517
        return tree
518
519
    def test_store_uncommitted(self):
520
        self.store_uncommitted()
521
        self.assertPathDoesNotExist('tree/file')
522
523
    def test_store_uncommitted_no_change(self):
524
        tree = self.make_branch_and_tree('tree')
525
        tree.commit('get root in there')
526
        tree.store_uncommitted()
6538.1.24 by Aaron Bentley
Eliminate get_stored_uncommitted from API.
527
        self.assertIs(None, tree.branch.get_unshelver(tree))
6538.1.10 by Aaron Bentley
Implement WorkingTree.get_uncommitted_data
528
6538.1.11 by Aaron Bentley
Switch to much simpler implementation of restore_uncommitted.
529
    def test_restore_uncommitted(self):
530
        with write_locked(self.store_uncommitted()) as tree:
531
            tree.restore_uncommitted()
532
            self.assertPathExists('tree/file')
6538.1.24 by Aaron Bentley
Eliminate get_stored_uncommitted from API.
533
            self.assertIs(None, tree.branch.get_unshelver(tree))
6538.1.11 by Aaron Bentley
Switch to much simpler implementation of restore_uncommitted.
534
535
    def test_restore_uncommitted_none(self):
536
        tree = self.make_branch_and_tree('tree')
537
        tree.restore_uncommitted()