~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/memory.py

Merge bzr.dev

Show diffs side-by-side

added added

removed removed

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