~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/local.py

(mbp) merge bzr.dev to 0.8, prepare for release

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
 
28
28
from bzrlib.trace import mutter
29
29
from bzrlib.transport import Transport, Server
30
 
from bzrlib.osutils import abspath, realpath, normpath, pathjoin, rename
 
30
from bzrlib.osutils import (abspath, realpath, normpath, pathjoin, rename, 
 
31
                            check_legal_path, rmtree)
31
32
 
32
33
 
33
34
class LocalTransport(Transport):
68
69
    def relpath(self, abspath):
69
70
        """Return the local path portion from a given absolute path.
70
71
        """
71
 
        from bzrlib.osutils import relpath
 
72
        from bzrlib.osutils import relpath, strip_trailing_slash
72
73
        if abspath is None:
73
74
            abspath = u'.'
74
 
        if len(abspath) > 1 and abspath.endswith('/'):
75
 
            abspath = abspath[:-1]
76
 
        if self.base == '/':
77
 
            root = '/'
78
 
        else:
79
 
            root = self.base[:-1]
80
 
        return relpath(root, abspath)
 
75
 
 
76
        return relpath(strip_trailing_slash(self.base), 
 
77
                       strip_trailing_slash(abspath))
81
78
 
82
79
    def has(self, relpath):
83
80
        return os.access(self.abspath(relpath), os.F_OK)
104
101
        path = relpath
105
102
        try:
106
103
            path = self.abspath(relpath)
 
104
            check_legal_path(path)
107
105
            fp = AtomicFile(path, 'wb', new_mode=mode)
108
106
        except (IOError, OSError),e:
109
107
            self._translate_error(e, path)
136
134
        except (IOError, OSError),e:
137
135
            self._translate_error(e, path)
138
136
 
139
 
    def append(self, relpath, f):
 
137
    def append(self, relpath, f, mode=None):
140
138
        """Append the text in the file-like object into the final
141
139
        location.
142
140
        """
143
141
        try:
144
142
            fp = open(self.abspath(relpath), 'ab')
 
143
            if mode is not None:
 
144
                os.chmod(self.abspath(relpath), mode)
145
145
        except (IOError, OSError),e:
146
146
            self._translate_error(e, relpath)
147
147
        # win32 workaround (tell on an unwritten file returns 0)
152
152
 
153
153
    def copy(self, rel_from, rel_to):
154
154
        """Copy the item at rel_from to the location at rel_to"""
155
 
        import shutil
156
155
        path_from = self.abspath(rel_from)
157
156
        path_to = self.abspath(rel_to)
158
157
        try:
202
201
            # Both from & to are on the local filesystem
203
202
            # Unfortunately, I can't think of anything faster than just
204
203
            # copying them across, one by one :(
205
 
            import shutil
206
 
 
207
204
            total = self._get_total(relpaths)
208
205
            count = 0
209
206
            for path in relpaths:
297
294
        super(ScratchTransport, self).__init__(base)
298
295
 
299
296
    def __del__(self):
300
 
        shutil.rmtree(self.base, ignore_errors=True)
 
297
        rmtree(self.base, ignore_errors=True)
301
298
        mutter("%r destroyed" % self)
302
299
 
303
300