~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/local.py

  • Committer: Robert Collins
  • Date: 2006-03-28 14:29:13 UTC
  • mto: (1626.2.1 integration)
  • mto: This revision was merged to the branch mainline in revision 1628.
  • Revision ID: robertc@robertcollins.net-20060328142913-ac5afb37075719c6
Convert log to use the new tsort.merge_sort routine.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 
21
21
import os
22
22
import shutil
23
 
import sys
24
23
from stat import ST_MODE, S_ISDIR, ST_SIZE
25
24
import tempfile
26
25
import urllib
27
26
 
28
27
from bzrlib.trace import mutter
29
28
from bzrlib.transport import Transport, Server
30
 
from bzrlib.osutils import (abspath, realpath, normpath, pathjoin, rename, 
31
 
                            check_legal_path)
 
29
from bzrlib.osutils import abspath, realpath, normpath, pathjoin, rename
32
30
 
33
31
 
34
32
class LocalTransport(Transport):
59
57
            return LocalTransport(self.abspath(offset))
60
58
 
61
59
    def abspath(self, relpath):
62
 
        """Return the full url to the given relative URL."""
 
60
        """Return the full url to the given relative URL.
 
61
        This can be supplied with a string or a list
 
62
        """
63
63
        assert isinstance(relpath, basestring), (type(relpath), relpath)
64
 
        result = normpath(pathjoin(self.base, urllib.unquote(relpath)))
65
 
        #if result[-1] != '/':
66
 
        #    result += '/'
67
 
        return result
 
64
        return pathjoin(self.base, urllib.unquote(relpath))
68
65
 
69
66
    def relpath(self, abspath):
70
67
        """Return the local path portion from a given absolute path.
71
68
        """
72
 
        from bzrlib.osutils import relpath, strip_trailing_slash
 
69
        from bzrlib.osutils import relpath
73
70
        if abspath is None:
74
71
            abspath = u'.'
75
 
 
76
 
        return relpath(strip_trailing_slash(self.base), 
77
 
                       strip_trailing_slash(abspath))
 
72
        if abspath.endswith('/'):
 
73
            abspath = abspath[:-1]
 
74
        return relpath(self.base[:-1], abspath)
78
75
 
79
76
    def has(self, relpath):
80
77
        return os.access(self.abspath(relpath), os.F_OK)
101
98
        path = relpath
102
99
        try:
103
100
            path = self.abspath(relpath)
104
 
            check_legal_path(path)
105
101
            fp = AtomicFile(path, 'wb', new_mode=mode)
106
102
        except (IOError, OSError),e:
107
103
            self._translate_error(e, path)
134
130
        except (IOError, OSError),e:
135
131
            self._translate_error(e, path)
136
132
 
137
 
    def append(self, relpath, f, mode=None):
 
133
    def append(self, relpath, f):
138
134
        """Append the text in the file-like object into the final
139
135
        location.
140
136
        """
141
137
        try:
142
138
            fp = open(self.abspath(relpath), 'ab')
143
 
            if mode is not None:
144
 
                os.chmod(self.abspath(relpath), mode)
145
139
        except (IOError, OSError),e:
146
140
            self._translate_error(e, relpath)
147
 
        # win32 workaround (tell on an unwritten file returns 0)
148
 
        fp.seek(0, 2)
149
141
        result = fp.tell()
150
142
        self._pump(f, fp)
151
143
        return result
276
268
        except (IOError, OSError),e:
277
269
            self._translate_error(e, path)
278
270
 
279
 
    def _can_roundtrip_unix_modebits(self):
280
 
        if sys.platform == 'win32':
281
 
            # anyone else?
282
 
            return False
283
 
        else:
284
 
            return True
285
 
 
286
271
 
287
272
class ScratchTransport(LocalTransport):
288
273
    """A transport that works in a temporary dir and cleans up after itself.