~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/matchers.py

(jameinel) Make kind markers optional for bzr status. (Martin von Gagern)

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
"""
28
28
 
29
29
__all__ = [
30
 
    'HasLayout',
31
30
    'MatchesAncestry',
32
31
    'ReturnsUnlockable',
33
32
    ]
34
33
 
35
34
from bzrlib import (
36
 
    osutils,
37
35
    revision as _mod_revision,
38
36
    )
39
37
 
40
 
from testtools.matchers import Equals, Mismatch, Matcher
 
38
from testtools.matchers import Mismatch, Matcher
41
39
 
42
40
 
43
41
class ReturnsUnlockable(Matcher):
55
53
        self.lockable_thing = lockable_thing
56
54
 
57
55
    def __str__(self):
58
 
        return ('ReturnsUnlockable(lockable_thing=%s)' %
 
56
        return ('ReturnsUnlockable(lockable_thing=%s)' % 
59
57
            self.lockable_thing)
60
58
 
61
59
    def match(self, lock_method):
114
112
        finally:
115
113
            self.repository.unlock()
116
114
        if sorted(got) != sorted(expected):
117
 
            return _AncestryMismatch(self.revision_id, sorted(got),
118
 
                sorted(expected))
119
 
 
120
 
 
121
 
class HasLayout(Matcher):
122
 
    """A matcher that checks if a tree has a specific layout.
123
 
 
124
 
    :ivar entries: List of expected entries, as (path, file_id) pairs.
125
 
    """
126
 
 
127
 
    def __init__(self, entries):
128
 
        Matcher.__init__(self)
129
 
        self.entries = entries
130
 
 
131
 
    def get_tree_layout(self, tree):
132
 
        """Get the (path, file_id) pairs for the current tree."""
133
 
        tree.lock_read()
134
 
        try:
135
 
            for path, ie in tree.iter_entries_by_dir():
136
 
                if ie.parent_id is None:
137
 
                    yield (u"", ie.file_id)
138
 
                else:
139
 
                    yield (path+ie.kind_character(), ie.file_id)
140
 
        finally:
141
 
            tree.unlock()
142
 
 
143
 
    @staticmethod
144
 
    def _strip_unreferenced_directories(entries):
145
 
        """Strip all directories that don't (in)directly contain any files.
146
 
 
147
 
        :param entries: List of path strings or (path, ie) tuples to process
148
 
        """
149
 
        directories = []
150
 
        for entry in entries:
151
 
            if isinstance(entry, basestring):
152
 
                path = entry
153
 
            else:
154
 
                path = entry[0]
155
 
            if not path or path[-1] == "/":
156
 
                # directory
157
 
                directories.append((path, entry))
158
 
            else:
159
 
                # Yield the referenced parent directories
160
 
                for dirpath, direntry in directories:
161
 
                    if osutils.is_inside(dirpath, path):
162
 
                        yield direntry
163
 
                directories = []
164
 
                yield entry
165
 
 
166
 
    def __str__(self):
167
 
        return 'HasLayout(%r)' % self.entries
168
 
 
169
 
    def match(self, tree):
170
 
        actual = list(self.get_tree_layout(tree))
171
 
        if self.entries and isinstance(self.entries[0], basestring):
172
 
            actual = [path for (path, fileid) in actual]
173
 
        if not tree.has_versioned_directories():
174
 
            entries = list(self._strip_unreferenced_directories(self.entries))
175
 
        else:
176
 
            entries = self.entries
177
 
        return Equals(entries).match(actual)
 
115
            return _AncestryMismatch(self.revision_id, sorted(got), sorted(expected))