15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
from cStringIO import StringIO
19
from bzrlib.lazy_import import lazy_import
20
lazy_import(globals(), """
22
from bzrlib.decorators import (needs_read_lock,
24
import bzrlib.errors as errors
25
from bzrlib.errors import BzrError
26
from bzrlib.osutils import file_iterator, safe_unicode
27
from bzrlib.symbol_versioning import (deprecated_method,
29
from bzrlib.trace import mutter, note
30
import bzrlib.transactions as transactions
31
import bzrlib.urlutils as urlutils
32
from bzrlib.decorators import (
36
from bzrlib.symbol_versioning import (
34
42
# XXX: The tracking here of lock counts and whether the lock is held is
122
127
file_or_path = '/'.join(file_or_path)
123
128
if file_or_path == '':
125
return urlutils.escape(safe_unicode(file_or_path))
130
return urlutils.escape(osutils.safe_unicode(file_or_path))
127
132
def _find_modes(self):
128
"""Determine the appropriate modes for files and directories."""
133
"""Determine the appropriate modes for files and directories.
135
:deprecated: Replaced by BzrDir._find_modes.
130
138
st = self._transport.stat('.')
131
139
except errors.TransportNotPossible:
132
140
self._dir_mode = 0755
133
141
self._file_mode = 0644
135
self._dir_mode = st.st_mode & 07777
143
# Check the directory mode, but also make sure the created
144
# directories and files are read-write for this user. This is
145
# mostly a workaround for filesystems which lie about being able to
146
# write to a directory (cygwin & win32)
147
self._dir_mode = (st.st_mode & 07777) | 00700
136
148
# Remove the sticky and execute bits for files
137
149
self._file_mode = self._dir_mode & ~07111
138
if not self._set_dir_mode:
139
self._dir_mode = None
140
if not self._set_file_mode:
141
self._file_mode = None
151
@deprecated_method(deprecated_in((1, 6, 0)))
143
152
def controlfilename(self, file_or_path):
144
"""Return location relative to branch."""
153
"""Return location relative to branch.
155
:deprecated: Use Transport methods instead.
145
157
return self._transport.abspath(self._escape(file_or_path))
147
@deprecated_method(zero_eight)
148
def controlfile(self, file_or_path, mode='r'):
149
"""Open a control file for this branch.
151
There are two classes of file in a lockable directory: text
152
and binary. binary files are untranslated byte streams. Text
153
control files are stored with Unix newlines and in UTF-8, even
154
if the platform or locale defaults are different.
156
Such files are not openable in write mode : they are managed via
157
put and put_utf8 which atomically replace old versions using
161
relpath = self._escape(file_or_path)
162
# TODO: codecs.open() buffers linewise, so it was overloaded with
163
# a much larger buffer, do we need to do the same for getreader/getwriter?
165
return self.get(relpath)
167
raise BzrError("Branch.controlfile(mode='wb') is not supported, use put[_utf8]")
169
return self.get_utf8(relpath)
171
raise BzrError("Branch.controlfile(mode='w') is not supported, use put[_utf8]")
173
raise BzrError("invalid controlfile mode %r" % mode)
160
@deprecated_method(deprecated_in((1, 5, 0)))
176
161
def get(self, relpath):
177
"""Get a file as a bytestream."""
162
"""Get a file as a bytestream.
164
:deprecated: Use a Transport instead of LockableFiles.
178
166
relpath = self._escape(relpath)
179
167
return self._transport.get(relpath)
170
@deprecated_method(deprecated_in((1, 5, 0)))
182
171
def get_utf8(self, relpath):
183
"""Get a file as a unicode stream."""
172
"""Get a file as a unicode stream.
174
:deprecated: Use a Transport instead of LockableFiles.
184
176
relpath = self._escape(relpath)
185
177
# DO NOT introduce an errors=replace here.
186
178
return codecs.getreader('utf-8')(self._transport.get(relpath))
188
180
@needs_write_lock
181
@deprecated_method(deprecated_in((1, 6, 0)))
189
182
def put(self, path, file):
192
185
:param path: The path to put the file, relative to the .bzr control
194
:param f: A file-like or string object whose contents should be copied.
187
:param file: A file-like or string object whose contents should be copied.
189
:deprecated: Use Transport methods instead.
196
191
self._transport.put_file(self._escape(path), file, mode=self._file_mode)
198
193
@needs_write_lock
194
@deprecated_method(deprecated_in((1, 6, 0)))
199
195
def put_bytes(self, path, a_string):
200
196
"""Write a string of bytes.
202
198
:param path: The path to put the bytes, relative to the transport root.
203
:param string: A string object, whose exact bytes are to be copied.
199
:param a_string: A string object, whose exact bytes are to be copied.
201
:deprecated: Use Transport methods instead.
205
203
self._transport.put_bytes(self._escape(path), a_string,
206
204
mode=self._file_mode)
208
206
@needs_write_lock
207
@deprecated_method(deprecated_in((1, 6, 0)))
209
208
def put_utf8(self, path, a_string):
210
209
"""Write a string, encoding as utf-8.
212
211
:param path: The path to put the string, relative to the transport root.
213
212
:param string: A string or unicode object whose contents should be copied.
214
:deprecated: Use Transport methods instead.
215
216
# IterableFile would not be needed if Transport.put took iterables
216
217
# instead of files. ADHB 2005-12-25