~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/memory.py

  • Committer: Aaron Bentley
  • Date: 2006-03-28 20:53:12 UTC
  • mto: (1634.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 1635.
  • Revision ID: abentley@panoramicfeedback.com-20060328205312-914ba2c0e85bda7c
Handle lockdirs over NFS properly

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
from cStringIO import StringIO
29
29
 
30
30
from bzrlib.trace import mutter
31
 
from bzrlib.errors import TransportError, NoSuchFile, FileExists, LockError
 
31
from bzrlib.errors import (TransportError, NoSuchFile, FileExists, LockError,
 
32
                           ResourceBusy)
32
33
from bzrlib.transport import Transport, register_transport, Server
33
34
 
34
35
class MemoryStat(object):
233
234
        return self._cwd + relpath
234
235
 
235
236
 
 
237
class FakeNFSTransport(MemoryTransport):
 
238
    """A transport that behaves like NFS, for testing"""
 
239
    def rename(self, rel_from, rel_to):
 
240
        try:
 
241
            MemoryTransport.rename(self, rel_from, rel_to)
 
242
        except FileExists, e:
 
243
            abs_to = self._abspath(rel_to)
 
244
            if abs_to in self._dirs:
 
245
                raise ResourceBusy(rel_to)
 
246
            else:
 
247
                raise
 
248
 
 
249
 
236
250
class _MemoryLock(object):
237
251
    """This makes a lock."""
238
252
 
258
272
class MemoryServer(Server):
259
273
    """Server for the MemoryTransport for testing with."""
260
274
 
261
 
    def setUp(self):
 
275
    def setUp(self, scheme=None, transport_class=None):
262
276
        """See bzrlib.transport.Server.setUp."""
263
277
        self._dirs = {}
264
278
        self._files = {}
265
279
        self._locks = {}
266
 
        self._scheme = "memory+%s:" % id(self)
 
280
        if scheme is not None:
 
281
            self._scheme = scheme
 
282
        else:            
 
283
            self._scheme = "memory+%s:" % id(self)
 
284
        if transport_class is None:
 
285
            transport_class = MemoryTransport
267
286
        def memory_factory(url):
268
 
            result = MemoryTransport(url)
 
287
            result = transport_class(url)
269
288
            result._dirs = self._dirs
270
289
            result._files = self._files
271
290
            result._locks = self._locks
281
300
        return self._scheme
282
301
 
283
302
 
 
303
class FakeNFSServer(MemoryServer):
 
304
    """A fake NFS server to use with the fake transport"""
 
305
    def setUp(self):
 
306
        MemoryServer.setUp(self, "fnfs+%s:" % id(self), FakeNFSTransport)
 
307
 
 
308
 
284
309
def get_test_permutations():
285
310
    """Return the permutations to be used in testing."""
286
 
    return [(MemoryTransport, MemoryServer),
 
311
    return [(MemoryTransport, MemoryServer), (FakeNFSTransport, FakeNFSServer),
287
312
            ]