/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1852.16.5 by John Arbash Meinel
[merge] bzr.dev 2255, resolve conflicts, update copyrights
1
# Copyright (C) 2006, 2007 Canonical Ltd
1852.15.9 by Robert Collins
Add missing test script.
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1852.15.9 by Robert Collins
Add missing test script.
16
17
"""Tests for the extra cases that WorkingTree.walkdirs can encounter."""
18
19
import os
20
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
21
from breezy import transform
22
from breezy.tests.features import SymlinkFeature
23
from breezy.tests.per_workingtree import TestCaseWithWorkingTree
1852.15.9 by Robert Collins
Add missing test script.
24
25
# tests to write:
26
# type mismatches - file to link, dir, dir to file, link, link to file, dir
27
7143.15.2 by Jelmer Vernooij
Run autopep8.
28
2457.2.5 by Marius Kruger
move DirBlock out of TestWalkdirs as per review comment
29
class DirBlock:
2457.2.6 by Marius Kruger
add DirBlock comment
30
    """Object representation of the tuples returned by dirstate."""
2457.2.5 by Marius Kruger
move DirBlock out of TestWalkdirs as per review comment
31
32
    def __init__(self, tree, file_path, file_name=None, id=None,
33
                 inventory_kind=None, stat=None, disk_kind='unknown'):
34
        self.file_path = file_path
35
        self.abspath = tree.abspath(file_path)
36
        self.relpath = tree.relpath(file_path)
3376.2.11 by Martin Pool
Compare to None using is/is not not ==
37
        if file_name is None:
7143.15.2 by Jelmer Vernooij
Run autopep8.
38
            file_name = os.path.split(file_path)[-1]
39
            if len(file_name) == 0:
40
                file_name = os.path.split(file_path)[-2]
2457.2.5 by Marius Kruger
move DirBlock out of TestWalkdirs as per review comment
41
        self.file_name = file_name
42
        self.id = id
43
        self.inventory_kind = inventory_kind
44
        self.stat = stat
45
        self.disk_kind = disk_kind
46
47
    def as_tuple(self):
7143.15.2 by Jelmer Vernooij
Run autopep8.
48
        return (self.relpath, self.file_name, self.disk_kind,
49
                self.stat, self.id, self.inventory_kind)
2457.2.5 by Marius Kruger
move DirBlock out of TestWalkdirs as per review comment
50
51
    def as_dir_tuple(self):
7143.15.2 by Jelmer Vernooij
Run autopep8.
52
        return (self.relpath, self.id)
2457.2.5 by Marius Kruger
move DirBlock out of TestWalkdirs as per review comment
53
54
    def __str__(self):
55
        return """
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
56
file_path      = %r
57
abspath        = %r
58
relpath        = %r
59
file_name      = %r
60
id             = %r
61
inventory_kind = %r
62
stat           = %r
63
disk_kind      = %r""" % (self.file_path, self.abspath, self.relpath,
7143.15.2 by Jelmer Vernooij
Run autopep8.
64
                          self.file_name, self.id, self.inventory_kind, self.stat,
65
                          self.disk_kind)
2457.2.5 by Marius Kruger
move DirBlock out of TestWalkdirs as per review comment
66
67
68
class TestWalkdirs(TestCaseWithWorkingTree):
69
7143.15.2 by Jelmer Vernooij
Run autopep8.
70
    added = 'added'
71
    missing = 'missing'
72
    unknown = 'unknown'
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
73
74
    def get_tree(self, file_status, prefix=None):
1852.15.9 by Robert Collins
Add missing test script.
75
        tree = self.make_branch_and_tree('.')
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
76
        dirblocks = []
77
        paths = [
78
            file_status + ' file',
79
            file_status + ' dir/',
80
            file_status + ' dir/a file',
81
            file_status + ' empty dir/',
82
            ]
83
        self.build_tree(paths)
84
85
        def add_dirblock(path, kind):
2457.2.5 by Marius Kruger
move DirBlock out of TestWalkdirs as per review comment
86
            dirblock = DirBlock(tree, path)
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
87
            if file_status != self.unknown:
88
                dirblock.inventory_kind = kind
89
            if file_status != self.missing:
90
                dirblock.disk_kind = kind
91
                dirblock.stat = os.lstat(dirblock.relpath)
92
            dirblocks.append(dirblock)
93
94
        add_dirblock(paths[0], 'file')
95
        add_dirblock(paths[1], 'directory')
96
        add_dirblock(paths[2], 'file')
97
        add_dirblock(paths[3], 'directory')
98
99
        if file_status != self.unknown:
6829.2.1 by Jelmer Vernooij
Avoid passing in file_ids/revision_ids in a few more places.
100
            tree.add(paths)
101
            for dirblock in dirblocks:
102
                if file_status != self.unknown:
103
                    dirblock.id = tree.path2id(dirblock.relpath)
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
104
105
        if file_status == self.missing:
106
            # now make the files be missing
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
107
            tree.controldir.root_transport.delete(dirblocks[0].relpath)
108
            tree.controldir.root_transport.delete_tree(dirblocks[1].relpath)
109
            tree.controldir.root_transport.delete_tree(dirblocks[3].relpath)
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
110
1852.15.9 by Robert Collins
Add missing test script.
111
        expected_dirblocks = [
2255.2.47 by Robert Collins
Adjust walkdirs tests to talk a lock around walk_dirs.
112
            (('', tree.path2id('')),
6883.22.15 by Jelmer Vernooij
Fix remaining walkdirs test.
113
             [dirblocks[1].as_tuple()] +
6883.22.20 by Jelmer Vernooij
Fix test.
114
             ([dirblocks[3].as_tuple()]
6883.22.15 by Jelmer Vernooij
Fix remaining walkdirs test.
115
                 if (tree.has_versioned_directories() or file_status == self.unknown) else []) +
6883.18.1 by Jelmer Vernooij
Support walkdirs when used for trees without versioned directories.
116
             [dirblocks[0].as_tuple()]
7143.15.2 by Jelmer Vernooij
Run autopep8.
117
             ),
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
118
            (dirblocks[1].as_dir_tuple(),
119
             [dirblocks[2].as_tuple()]
7143.15.2 by Jelmer Vernooij
Run autopep8.
120
             ),
6862.5.1 by Jelmer Vernooij
Fix walkdirs tests for formats without versioned directories.
121
            ]
6883.18.1 by Jelmer Vernooij
Support walkdirs when used for trees without versioned directories.
122
        if (tree.has_versioned_directories() or
7143.15.2 by Jelmer Vernooij
Run autopep8.
123
                file_status != self.missing):
6883.18.1 by Jelmer Vernooij
Support walkdirs when used for trees without versioned directories.
124
            expected_dirblocks.append(
125
                (dirblocks[3].as_dir_tuple(),
126
                 []
7143.15.2 by Jelmer Vernooij
Run autopep8.
127
                 ))
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
128
        if prefix:
129
            expected_dirblocks = [e for e in expected_dirblocks
7143.15.2 by Jelmer Vernooij
Run autopep8.
130
                                  if len(e) > 0 and len(e[0]) > 0 and e[0][0] == prefix]
1852.15.10 by Robert Collins
Tweak the Tree.walkdirs interface more to be more useful.
131
        return tree, expected_dirblocks
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
132
2457.2.7 by Marius Kruger
extract method as per review request
133
    def _test_walkdir(self, file_status, prefix=""):
134
        result = []
135
        tree, expected_dirblocks = self.get_tree(file_status, prefix)
136
        tree.lock_read()
137
        for dirinfo, dirblock in tree.walkdirs(prefix):
138
            result.append((dirinfo, list(dirblock)))
139
        tree.unlock()
140
141
        # check each return value for debugging ease.
142
        for pos, item in enumerate(expected_dirblocks):
143
            result_pos = []
144
            if len(result) > pos:
145
                result_pos = result[pos]
146
            self.assertEqual(item, result_pos)
147
        self.assertEqual(expected_dirblocks, result)
148
1852.15.10 by Robert Collins
Tweak the Tree.walkdirs interface more to be more useful.
149
    def test_walkdir_unknowns(self):
150
        """unknown files and directories should be reported by walkdirs."""
2457.2.7 by Marius Kruger
extract method as per review request
151
        self._test_walkdir(self.unknown)
1852.15.10 by Robert Collins
Tweak the Tree.walkdirs interface more to be more useful.
152
153
    def test_walkdir_from_unknown_dir(self):
154
        """Doing a walkdir when the requested prefix is unknown but on disk."""
2457.2.7 by Marius Kruger
extract method as per review request
155
        self._test_walkdir(self.unknown, 'unknown dir')
156
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
157
    def test_walkdir_missings(self):
158
        """missing files and directories should be reported by walkdirs."""
2457.2.7 by Marius Kruger
extract method as per review request
159
        self._test_walkdir(self.missing)
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
160
161
    def test_walkdir_from_dir(self):
162
        """Doing a walkdir when the requested prefix is known and on disk."""
2457.2.7 by Marius Kruger
extract method as per review request
163
        self._test_walkdir(self.added, 'added dir')
2457.2.1 by Marius Kruger
* Fix workingtree.walkdirs to support getting a prefix which specifies an empty directory.
164
165
    def test_walkdir_from_empty_dir(self):
166
        """Doing a walkdir when the requested prefix is empty dir."""
2457.2.7 by Marius Kruger
extract method as per review request
167
        self._test_walkdir(self.added, 'added empty dir')
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
168
169
    def test_walkdir_from_missing_dir(self):
170
        """Doing a walkdir when the requested prefix is missing but on disk."""
2457.2.7 by Marius Kruger
extract method as per review request
171
        self._test_walkdir(self.missing, 'missing dir')
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
172
173
    def test_walkdirs_type_changes(self):
174
        """Walkdir shows the actual kinds on disk and the recorded kinds."""
2949.5.1 by Alexander Belchenko
selftest: use SymlinkFeature instead of TestSkipped where appropriate
175
        self.requireFeature(SymlinkFeature)
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
176
        tree = self.make_branch_and_tree('.')
177
        paths = ['file1', 'file2', 'dir1/', 'dir2/']
178
        self.build_tree(paths)
6816.1.1 by Jelmer Vernooij
Avoid passing in file ids.
179
        tree.add(paths)
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
180
        tt = transform.TreeTransform(tree)
181
        root_transaction_id = tt.trans_id_tree_path('')
182
        tt.new_symlink('link1',
7143.15.2 by Jelmer Vernooij
Run autopep8.
183
                       root_transaction_id, 'link-target', b'link1')
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
184
        tt.new_symlink('link2',
7143.15.2 by Jelmer Vernooij
Run autopep8.
185
                       root_transaction_id, 'link-target', b'link2')
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
186
        tt.apply()
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
187
        tree.controldir.root_transport.delete_tree('dir1')
188
        tree.controldir.root_transport.delete_tree('dir2')
189
        tree.controldir.root_transport.delete('file1')
190
        tree.controldir.root_transport.delete('file2')
191
        tree.controldir.root_transport.delete('link1')
192
        tree.controldir.root_transport.delete('link2')
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
193
        changed_paths = ['dir1', 'file1/', 'link1', 'link2/']
194
        self.build_tree(changed_paths)
195
        os.symlink('target', 'dir2')
196
        os.symlink('target', 'file2')
197
        dir1_stat = os.lstat('dir1')
198
        dir2_stat = os.lstat('dir2')
199
        file1_stat = os.lstat('file1')
200
        file2_stat = os.lstat('file2')
201
        link1_stat = os.lstat('link1')
202
        link2_stat = os.lstat('link2')
203
        expected_dirblocks = [
7143.15.2 by Jelmer Vernooij
Run autopep8.
204
            (('', tree.path2id('')),
205
             [('dir1', 'dir1', 'file', dir1_stat, tree.path2id('dir1'),
206
               'directory' if tree.has_versioned_directories() else None),
207
              ('dir2', 'dir2', 'symlink', dir2_stat, tree.path2id('dir2'),
208
               'directory' if tree.has_versioned_directories() else None),
209
              ('file1', 'file1', 'directory', file1_stat,
210
               tree.path2id('file1'), 'file'),
211
              ('file2', 'file2', 'symlink', file2_stat,
212
               tree.path2id('file2'), 'file'),
213
              ('link1', 'link1', 'file', link1_stat,
214
               tree.path2id('link1'), 'symlink'),
215
              ('link2', 'link2', 'directory', link2_stat,
216
               tree.path2id('link2'), 'symlink'),
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
217
              ]
6876.3.2 by Jelmer Vernooij
Fix walkdirs for trees without versioned directories.
218
             )]
219
        if tree.has_versioned_directories():
220
            expected_dirblocks.extend([
7143.15.2 by Jelmer Vernooij
Run autopep8.
221
                (('dir1', tree.path2id('dir1')),
222
                 [
223
                    ]
224
                 ),
225
                (('dir2', tree.path2id('dir2')),
226
                    [
227
                    ]
228
                 )])
6876.3.2 by Jelmer Vernooij
Fix walkdirs for trees without versioned directories.
229
        expected_dirblocks.extend([
7143.15.2 by Jelmer Vernooij
Run autopep8.
230
            (('file1', None),
231
             [
232
                ]
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
233
             ),
7143.15.2 by Jelmer Vernooij
Run autopep8.
234
            (('link2', None),
235
             [
236
                ]
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
237
             ),
6876.3.2 by Jelmer Vernooij
Fix walkdirs for trees without versioned directories.
238
            ])
239
        with tree.lock_read():
240
            result = list(tree.walkdirs())
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
241
        # check each return value for debugging ease.
242
        for pos, item in enumerate(expected_dirblocks):
243
            self.assertEqual(item, result[pos])
244
        self.assertEqual(len(expected_dirblocks), len(result))
2408.1.4 by Alexander Belchenko
workingtree_implementations: make usage of symlinks optional
245
246
    def test_walkdirs_type_changes_wo_symlinks(self):
247
        # similar to test_walkdirs_type_changes
248
        # but don't use symlinks for safe testing on win32
249
        tree = self.make_branch_and_tree('.')
250
        paths = ['file1', 'dir1/']
251
        self.build_tree(paths)
6816.1.1 by Jelmer Vernooij
Avoid passing in file ids.
252
        tree.add(paths)
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
253
        tree.controldir.root_transport.delete_tree('dir1')
254
        tree.controldir.root_transport.delete('file1')
2408.1.4 by Alexander Belchenko
workingtree_implementations: make usage of symlinks optional
255
        changed_paths = ['dir1', 'file1/']
256
        self.build_tree(changed_paths)
257
        dir1_stat = os.lstat('dir1')
258
        file1_stat = os.lstat('file1')
6861.1.1 by Jelmer Vernooij
More foreign branch test fixes.
259
        if tree.has_versioned_directories():
260
            expected_dirblocks = [
7143.15.2 by Jelmer Vernooij
Run autopep8.
261
                (('', tree.path2id('')),
262
                 [('dir1', 'dir1', 'file', dir1_stat, tree.path2id('dir1'), 'directory'),
263
                  ('file1', 'file1', 'directory', file1_stat,
264
                   tree.path2id('file1'), 'file'),
265
                  ]
266
                 ),
267
                (('dir1', tree.path2id('dir1')),
268
                 [
269
                    ]
270
                 ),
271
                (('file1', None),
272
                 [
273
                    ]
6861.1.1 by Jelmer Vernooij
More foreign branch test fixes.
274
                 ),
275
                ]
276
        else:
277
            expected_dirblocks = [
7143.15.2 by Jelmer Vernooij
Run autopep8.
278
                (('', tree.path2id('')),
279
                 [('dir1', 'dir1', 'file', dir1_stat, tree.path2id('dir1'), None),
280
                  ('file1', 'file1', 'directory', file1_stat,
281
                   tree.path2id('file1'), 'file'),
6861.1.1 by Jelmer Vernooij
More foreign branch test fixes.
282
                  ]
283
                 ),
7143.15.2 by Jelmer Vernooij
Run autopep8.
284
                (('file1', None),
285
                 [
286
                    ]
6861.1.1 by Jelmer Vernooij
More foreign branch test fixes.
287
                 ),
288
                ]
6876.3.2 by Jelmer Vernooij
Fix walkdirs for trees without versioned directories.
289
        with tree.lock_read():
290
            result = list(tree.walkdirs())
2408.1.4 by Alexander Belchenko
workingtree_implementations: make usage of symlinks optional
291
        # check each return value for debugging ease.
292
        for pos, item in enumerate(expected_dirblocks):
293
            self.assertEqual(item, result[pos])
294
        self.assertEqual(len(expected_dirblocks), len(result))