32
33
'ReturnsUnlockable',
35
36
from bzrlib import (
36
38
revision as _mod_revision,
40
from bzrlib import lazy_import
41
lazy_import.lazy_import(globals(),
43
from bzrlib.smart.request import request_handlers as smart_request_handlers
44
from bzrlib.smart import vfs
39
47
from testtools.matchers import Equals, Mismatch, Matcher
131
139
"""Get the (path, file_id) pairs for the current tree."""
134
return [(path, ie.file_id) for path, ie
135
in tree.iter_entries_by_dir()]
142
for path, ie in tree.iter_entries_by_dir():
143
if ie.parent_id is None:
144
yield (u"", ie.file_id)
146
yield (path+ie.kind_character(), ie.file_id)
151
def _strip_unreferenced_directories(entries):
152
"""Strip all directories that don't (in)directly contain any files.
154
:param entries: List of path strings or (path, ie) tuples to process
157
for entry in entries:
158
if isinstance(entry, basestring):
162
if not path or path[-1] == "/":
164
directories.append((path, entry))
166
# Yield the referenced parent directories
167
for dirpath, direntry in directories:
168
if osutils.is_inside(dirpath, path):
139
173
def __str__(self):
140
return ('HasLayout(%r)' % self.entries)
174
return 'HasLayout(%r)' % self.entries
142
176
def match(self, tree):
143
actual = self.get_tree_layout(tree)
177
actual = list(self.get_tree_layout(tree))
144
178
if self.entries and isinstance(self.entries[0], basestring):
145
179
actual = [path for (path, fileid) in actual]
146
return Equals(actual).match(self.entries)
180
if not tree.has_versioned_directories():
181
entries = list(self._strip_unreferenced_directories(self.entries))
183
entries = self.entries
184
return Equals(entries).match(actual)
187
class _NoVfsCallsMismatch(Mismatch):
188
"""Mismatch describing a list of HPSS calls which includes VFS requests."""
190
def __init__(self, vfs_calls):
191
self.vfs_calls = vfs_calls
194
return "no VFS calls expected, got: %s" % ",".join([
195
"%s(%s)" % (c.method,
196
", ".join([repr(a) for a in c.args])) for c in self.vfs_calls])
199
class ContainsNoVfsCalls(Matcher):
200
"""Ensure that none of the specified calls are HPSS calls."""
203
return 'ContainsNoVfsCalls()'
206
def match(cls, hpss_calls):
208
for call in hpss_calls:
210
request_method = smart_request_handlers.get(call.call.method)
212
# A method we don't know about doesn't count as a VFS method.
214
if issubclass(request_method, vfs.VfsRequest):
215
vfs_calls.append(call.call)
216
if len(vfs_calls) == 0:
218
return _NoVfsCallsMismatch(vfs_calls)