35
36
_VIEWS_FORMAT1_MARKER = "Bazaar views format 1\n"
39
class NoSuchView(errors.BzrError):
40
"""A view does not exist.
43
_fmt = u"No such view: %(view_name)s."
45
def __init__(self, view_name):
46
self.view_name = view_name
49
class ViewsNotSupported(errors.BzrError):
50
"""Views are not supported by a tree format.
53
_fmt = ("Views are not supported by %(tree)s;"
54
" use 'brz upgrade' to change your tree to a later format.")
56
def __init__(self, tree):
60
class FileOutsideView(errors.BzrError):
62
_fmt = ('Specified file "%(file_name)s" is outside the current view: '
65
def __init__(self, file_name, view_files):
66
self.file_name = file_name
67
self.view_str = ", ".join(view_files)
38
70
class _Views(object):
39
71
"""Base class for View managers."""
119
151
return self._views[view_name]
121
raise errors.NoSuchView(view_name)
153
raise NoSuchView(view_name)
123
155
def set_view(self, view_name, view_files, make_current=True):
124
156
"""Add or update a view definition.
175
207
def _load_view_info(self):
176
208
"""Load the current view and dictionary of view definitions."""
177
209
if not self._loaded:
178
self.tree.lock_read()
210
with self.tree.lock_read():
181
212
view_content = self.tree._transport.get_bytes('views')
182
except errors.NoSuchFile, e:
213
except errors.NoSuchFile as e:
183
214
self._current, self._views = None, {}
185
216
keywords, self._views = \
186
217
self._deserialize_view_content(view_content)
187
218
self._current = keywords.get('current')
190
219
self._loaded = True
192
221
def _serialize_view_content(self, keywords, view_dict):
193
222
"""Convert view keywords and a view dictionary into a stream."""
194
223
lines = [_VIEWS_FORMAT1_MARKER]
195
224
for key in keywords:
196
line = "%s=%s\n" % (key,keywords[key])
225
line = "%s=%s\n" % (key, keywords[key])
197
226
lines.append(line.encode('utf-8'))
199
228
lines.append("views:\n".encode('utf-8'))
200
229
for view in sorted(view_dict):
201
230
view_data = "%s\0%s\n" % (view, "\0".join(view_dict[view]))
202
231
lines.append(view_data.encode('utf-8'))
203
return "".join(lines)
232
return b"".join(lines)
205
234
def _deserialize_view_content(self, view_content):
206
235
"""Convert a stream into view keywords and a dictionary of views."""
257
286
def _not_supported(self, *a, **k):
258
raise errors.ViewsNotSupported(self.tree)
287
raise ViewsNotSupported(self.tree)
260
289
get_view_info = _not_supported
261
290
set_view_info = _not_supported
281
310
if tree.supports_views():
282
311
view_files = tree.views.lookup_view()
283
312
if view_files and not osutils.is_inside_any(view_files, relpath):
284
raise errors.FileOutsideView(relpath, view_files)
313
raise FileOutsideView(relpath, view_files)