~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/local.py

  • Committer: Robert Collins
  • Date: 2005-10-17 11:56:54 UTC
  • mfrom: (1185.16.59)
  • Revision ID: robertc@robertcollins.net-20051017115654-662239e1587524a8
mergeĀ fromĀ martin.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 
 
17
 
"""Transport for the local filesystem.
18
 
 
19
 
This is a fairly thin wrapper on regular file IO."""
 
16
"""Implementation of Transport for the local filesystem.
 
17
"""
20
18
 
21
19
import os
22
20
import errno
23
21
import shutil
24
22
from stat import ST_MODE, S_ISDIR, ST_SIZE
25
23
import tempfile
26
 
import urllib
27
24
 
28
25
from bzrlib.trace import mutter
29
26
from bzrlib.transport import Transport, register_transport, \
30
27
    TransportError, NoSuchFile, FileExists
31
 
from bzrlib.osutils import abspath
 
28
 
32
29
 
33
30
class LocalTransportError(TransportError):
34
31
    pass
44
41
        # realpath is incompatible with symlinks. When we traverse
45
42
        # up we might be able to normpath stuff. RBC 20051003
46
43
        super(LocalTransport, self).__init__(
47
 
            os.path.normpath(abspath(base)))
 
44
            os.path.normpath(os.path.abspath(base)))
48
45
 
49
46
    def should_cache(self):
50
47
        return False
60
57
            return LocalTransport(self.abspath(offset))
61
58
 
62
59
    def abspath(self, relpath):
63
 
        """Return the full url to the given relative URL.
 
60
        """Return the full url to the given relative path.
64
61
        This can be supplied with a string or a list
65
62
        """
66
 
        assert isinstance(relpath, basestring), (type(relpath), relpath)
67
 
        return os.path.join(self.base, urllib.unquote(relpath))
 
63
        if isinstance(relpath, basestring):
 
64
            relpath = [relpath]
 
65
        return os.path.join(self.base, *relpath)
68
66
 
69
67
    def relpath(self, abspath):
70
68
        """Return the local path portion from a given absolute path.
71
69
        """
72
70
        from bzrlib.osutils import relpath
73
 
        if abspath is None:
74
 
            abspath = '.'
75
71
        return relpath(self.base, abspath)
76
72
 
77
73
    def has(self, relpath):
115
111
        """Iter the relative paths of files in the transports sub-tree."""
116
112
        queue = list(self.list_dir('.'))
117
113
        while queue:
118
 
            relpath = urllib.quote(queue.pop(0))
 
114
            relpath = queue.pop(0)
119
115
            st = self.stat(relpath)
120
116
            if S_ISDIR(st[ST_MODE]):
121
117
                for i, basename in enumerate(self.list_dir(relpath)):
243
239
    def __del__(self):
244
240
        shutil.rmtree(self.base, ignore_errors=True)
245
241
        mutter("%r destroyed" % self)
 
242
 
 
243
# If nothing else matches, try the LocalTransport
 
244
register_transport(None, LocalTransport)
 
245
register_transport('file://', LocalTransport)