22
22
from cStringIO import StringIO
24
24
from bzrlib.trace import mutter
25
from bzrlib.errors import TransportError, NoSuchFile, FileExists
25
from bzrlib.errors import TransportError, NoSuchFile, FileExists, LockError
26
26
from bzrlib.transport import Transport, register_transport, Server
28
28
class MemoryStat(object):
70
71
result = MemoryTransport(url)
71
72
result._dirs = self._dirs
72
73
result._files = self._files
74
result._locks = self._locks
75
77
def abspath(self, relpath):
76
78
"""See Transport.abspath()."""
77
return self.base[:-1] + self._abspath(relpath)
79
return self.base[:-1] + self._abspath(relpath)[len(self._cwd) - 1:]
79
81
def append(self, relpath, f):
80
82
"""See Transport.append()."""
176
178
elif _abspath in self._dirs:
177
179
return MemoryStat(0, True, self._dirs[_abspath])
179
raise NoSuchFile(relpath)
181
# def lock_read(self, relpath):
184
# def lock_write(self, relpath):
181
raise NoSuchFile(_abspath)
183
def lock_read(self, relpath):
184
"""See Transport.lock_read()."""
185
return _MemoryLock(self._abspath(relpath), self)
187
def lock_write(self, relpath):
188
"""See Transport.lock_write()."""
189
return _MemoryLock(self._abspath(relpath), self)
187
191
def _abspath(self, relpath):
188
192
"""Generate an internal absolute path."""
197
201
return self._cwd + relpath
204
class _MemoryLock(object):
205
"""This makes a lock."""
207
def __init__(self, path, transport):
208
assert isinstance(transport, MemoryTransport)
210
self.transport = transport
211
if self.path in self.transport._locks:
212
raise LockError('File %r already locked' % (self.path,))
213
self.transport._locks[self.path] = self
216
# Should this warn, or actually try to cleanup?
218
warn("MemoryLock %r not explicitly unlocked" % (self.path,))
222
del self.transport._locks[self.path]
223
self.transport = None
200
226
class MemoryServer(Server):
201
227
"""Server for the MemoryTransport for testing with."""
204
230
"""See bzrlib.transport.Server.setUp."""
205
234
self._scheme = "memory+%s:" % id(self)
206
register_transport(self._scheme, MemoryTransport)
235
def memory_factory(url):
236
result = MemoryTransport(url)
237
result._dirs = self._dirs
238
result._files = self._files
239
result._locks = self._locks
241
register_transport(self._scheme, memory_factory)
208
243
def tearDown(self):
209
244
"""See bzrlib.transport.Server.tearDown."""