~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/lockable_files.py

  • Committer: Robert Collins
  • Date: 2007-03-08 04:06:06 UTC
  • mfrom: (2323.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 2442.
  • Revision ID: robertc@robertcollins.net-20070308040606-84gsniv56huiyjt4
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright (C) 2005, 2006 Canonical Ltd
2
 
 
 
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
7
 
 
 
7
#
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
11
# GNU General Public License for more details.
12
 
 
 
12
#
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
19
19
#import traceback
20
20
 
21
21
import bzrlib
22
 
from bzrlib.decorators import *
 
22
from bzrlib.decorators import (needs_read_lock,
 
23
        needs_write_lock)
23
24
import bzrlib.errors as errors
24
25
from bzrlib.errors import BzrError
25
26
from bzrlib.osutils import file_iterator, safe_unicode
26
 
from bzrlib.symbol_versioning import *
 
27
from bzrlib.symbol_versioning import (deprecated_method, 
 
28
        zero_eight)
27
29
from bzrlib.trace import mutter, note
28
30
import bzrlib.transactions as transactions
 
31
import bzrlib.urlutils as urlutils
 
32
 
29
33
 
30
34
# XXX: The tracking here of lock counts and whether the lock is held is
31
35
# somewhat redundant with what's done in LockDir; the main difference is that
73
77
        :param lock_class: Class of lock strategy to use: typically
74
78
            either LockDir or TransportLock.
75
79
        """
76
 
        object.__init__(self)
77
80
        self._transport = transport
78
81
        self.lock_name = lock_name
79
82
        self._transaction = None
80
 
        self._find_modes()
81
83
        self._lock_mode = None
82
84
        self._lock_count = 0
 
85
        self._find_modes()
83
86
        esc_name = self._escape(lock_name)
84
87
        self._lock = lock_class(transport, esc_name,
85
88
                                file_modebits=self._file_mode,
119
122
            file_or_path = '/'.join(file_or_path)
120
123
        if file_or_path == '':
121
124
            return u''
122
 
        return bzrlib.transport.urlescape(safe_unicode(file_or_path))
 
125
        return urlutils.escape(safe_unicode(file_or_path))
123
126
 
124
127
    def _find_modes(self):
125
128
        """Determine the appropriate modes for files and directories."""
190
193
                     directory
191
194
        :param f: A file-like or string object whose contents should be copied.
192
195
        """
193
 
        self._transport.put(self._escape(path), file, mode=self._file_mode)
 
196
        self._transport.put_file(self._escape(path), file, mode=self._file_mode)
 
197
 
 
198
    @needs_write_lock
 
199
    def put_bytes(self, path, a_string):
 
200
        """Write a string of bytes.
 
201
 
 
202
        :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.
 
204
        """
 
205
        self._transport.put_bytes(self._escape(path), a_string,
 
206
                                  mode=self._file_mode)
194
207
 
195
208
    @needs_write_lock
196
209
    def put_utf8(self, path, a_string):
197
210
        """Write a string, encoding as utf-8.
198
211
 
199
212
        :param path: The path to put the string, relative to the transport root.
200
 
        :param string: A file-like or string object whose contents should be copied.
 
213
        :param string: A string or unicode object whose contents should be copied.
201
214
        """
202
215
        # IterableFile would not be needed if Transport.put took iterables
203
216
        # instead of files.  ADHB 2005-12-25
207
220
        # these are valuable files which should have exact contents.
208
221
        if not isinstance(a_string, basestring):
209
222
            raise errors.BzrBadParameterNotString(a_string)
210
 
        self.put(path, StringIO(a_string.encode('utf-8')))
 
223
        self.put_bytes(path, a_string.encode('utf-8'))
211
224
 
212
225
    def lock_write(self):
213
226
        # mutter("lock write: %s (%s)", self, self._lock_count)
336
349
    def create(self, mode=None):
337
350
        """Create lock mechanism"""
338
351
        # for old-style locks, create the file now
339
 
        self._transport.put(self._escaped_name, StringIO(), 
 
352
        self._transport.put_bytes(self._escaped_name, '',
340
353
                            mode=self._file_modebits)