~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/memory.py

  • Committer: Martin Pool
  • Date: 2006-06-20 07:55:43 UTC
  • mfrom: (1798 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1799.
  • Revision ID: mbp@sourcefrog.net-20060620075543-b10f6575d4a4fa32
[merge] bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
import os
25
25
import errno
26
26
import re
27
 
from stat import *
 
27
from stat import S_IFREG, S_IFDIR
28
28
from cStringIO import StringIO
 
29
import warnings
29
30
 
 
31
from bzrlib.errors import TransportError, NoSuchFile, FileExists, LockError
30
32
from bzrlib.trace import mutter
31
 
from bzrlib.errors import TransportError, NoSuchFile, FileExists, LockError
32
 
from bzrlib.transport import Transport, register_transport, Server
 
33
from bzrlib.transport import (Transport, register_transport, Server)
 
34
import bzrlib.urlutils as urlutils
 
35
 
33
36
 
34
37
 
35
38
class MemoryStat(object):
52
55
    def __init__(self, url=""):
53
56
        """Set the 'base' path where files will be stored."""
54
57
        if url == "":
55
 
            url = "memory:/"
 
58
            url = "memory:///"
56
59
        if url[-1] != '/':
57
60
            url = url + '/'
58
61
        super(MemoryTransport, self).__init__(url)
59
 
        self._cwd = url[url.find(':') + 1:]
 
62
        self._cwd = url[url.find(':') + 3:]
60
63
        # dictionaries from absolute path to file mode
61
 
        self._dirs = {}
 
64
        self._dirs = {'/':None}
62
65
        self._files = {}
63
66
        self._locks = {}
64
67
 
77
80
                    cwdsegments.pop()
78
81
                continue
79
82
            cwdsegments.append(segment)
80
 
        url = self.base[:self.base.find(':') + 1] + '/'.join(cwdsegments) + '/'
 
83
        url = self.base[:self.base.find(':') + 3] + '/'.join(cwdsegments) + '/'
81
84
        result = MemoryTransport(url)
82
85
        result._dirs = self._dirs
83
86
        result._files = self._files
90
93
        # current environment - XXX RBC 20060404 move the clone '..' handling
91
94
        # into here and call abspath from clone
92
95
        temp_t = self.clone(relpath)
93
 
        if temp_t.base.count('/') == 1:
 
96
        if temp_t.base.count('/') == 3:
94
97
            return temp_t.base
95
98
        else:
96
99
            return temp_t.base[:-1]
215
218
        if _abspath in self._files:
216
219
            return MemoryStat(len(self._files[_abspath][0]), False, 
217
220
                              self._files[_abspath][1])
218
 
        elif _abspath == '':
219
 
            return MemoryStat(0, True, None)
220
221
        elif _abspath in self._dirs:
221
222
            return MemoryStat(0, True, self._dirs[_abspath])
222
223
        else:
232
233
 
233
234
    def _abspath(self, relpath):
234
235
        """Generate an internal absolute path."""
 
236
        relpath = urlutils.unescape(relpath)
235
237
        if relpath.find('..') != -1:
236
238
            raise AssertionError('relpath contains ..')
237
239
        if relpath == '.':
 
240
            if (self._cwd == '/'):
 
241
                return self._cwd
238
242
            return self._cwd[:-1]
239
243
        if relpath.endswith('/'):
240
244
            relpath = relpath[:-1]
257
261
    def __del__(self):
258
262
        # Should this warn, or actually try to cleanup?
259
263
        if self.transport:
260
 
            warn("MemoryLock %r not explicitly unlocked" % (self.path,))
 
264
            warnings.warn("MemoryLock %r not explicitly unlocked" % (self.path,))
261
265
            self.unlock()
262
266
 
263
267
    def unlock(self):
270
274
 
271
275
    def setUp(self):
272
276
        """See bzrlib.transport.Server.setUp."""
273
 
        self._dirs = {}
 
277
        self._dirs = {'/':None}
274
278
        self._files = {}
275
279
        self._locks = {}
276
 
        self._scheme = "memory+%s:" % id(self)
 
280
        self._scheme = "memory+%s:///" % id(self)
277
281
        def memory_factory(url):
278
282
            result = MemoryTransport(url)
279
283
            result._dirs = self._dirs