bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 1553.5.28
by Martin Pool [merge] from bzr.dev before integration | 1 | # Copyright (C) 2005, 2006 Canonical Ltd
 | 
| 1185.65.22
by Robert Collins lockable_files was extracted from branch.py - give it a copyright statement | 2 | |
| 3 | # This program is free software; you can redistribute it and/or modify
 | |
| 4 | # it under the terms of the GNU General Public License as published by
 | |
| 5 | # the Free Software Foundation; either version 2 of the License, or
 | |
| 6 | # (at your option) any later version.
 | |
| 7 | ||
| 8 | # This program is distributed in the hope that it will be useful,
 | |
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 11 | # GNU General Public License for more details.
 | |
| 12 | ||
| 13 | # You should have received a copy of the GNU General Public License
 | |
| 14 | # along with this program; if not, write to the Free Software
 | |
| 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| 16 | ||
| 1185.65.29
by Robert Collins Implement final review suggestions. | 17 | from cStringIO import StringIO | 
| 18 | import codecs | |
| 1185.80.2
by John Arbash Meinel Traced double locking code to WorkingTree creating its own control files. | 19 | #import traceback
 | 
| 1185.70.3
by Martin Pool Various updates to make storage branch mergeable: | 20 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 21 | import bzrlib | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 22 | from bzrlib.decorators import * | 
| 1185.65.10
by Robert Collins Rename Controlfiles to LockableFiles. | 23 | import bzrlib.errors as errors | 
| 1694.2.6
by Martin Pool [merge] bzr.dev | 24 | from bzrlib.errors import BzrError | 
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 25 | from bzrlib.osutils import file_iterator, safe_unicode | 
| 1185.65.29
by Robert Collins Implement final review suggestions. | 26 | from bzrlib.symbol_versioning import * | 
| 1185.80.2
by John Arbash Meinel Traced double locking code to WorkingTree creating its own control files. | 27 | from bzrlib.trace import mutter, note | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 28 | import bzrlib.transactions as transactions | 
| 1685.1.45
by John Arbash Meinel Moved url functions into bzrlib.urlutils | 29 | import bzrlib.urlutils as urlutils | 
| 30 | ||
| 1185.65.10
by Robert Collins Rename Controlfiles to LockableFiles. | 31 | |
| 1553.5.41
by Martin Pool Add new LockableFiles.LockDirStrategy; not used yet | 32 | # XXX: The tracking here of lock counts and whether the lock is held is
 | 
| 33 | # somewhat redundant with what's done in LockDir; the main difference is that
 | |
| 34 | # LockableFiles permits reentrancy.
 | |
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 35 | |
| 1185.66.3
by Aaron Bentley Renamed ControlFiles to LockableFiles | 36 | class LockableFiles(object): | 
| 1553.5.38
by Martin Pool More explanation for LockableFiles | 37 | """Object representing a set of related files locked within the same scope. | 
| 38 | ||
| 39 |     These files are used by a WorkingTree, Repository or Branch, and should
 | |
| 40 |     generally only be touched by that object.
 | |
| 41 | ||
| 42 |     LockableFiles also provides some policy on top of Transport for encoding
 | |
| 43 |     control files as utf-8.
 | |
| 44 | ||
| 1553.5.39
by Martin Pool More lock docs | 45 |     LockableFiles manage a lock count and can be locked repeatedly by
 | 
| 46 |     a single caller.  (The underlying lock implementation generally does not
 | |
| 47 |     support this.)
 | |
| 48 | ||
| 1553.5.38
by Martin Pool More explanation for LockableFiles | 49 |     Instances of this class are often called control_files.
 | 
| 50 |     
 | |
| 1553.5.43
by Martin Pool Get LockableFiles tests running against LockDir | 51 |     This object builds on top of a Transport, which is used to actually write
 | 
| 52 |     the files to disk, and an OSLock or LockDir, which controls how access to
 | |
| 53 |     the files is controlled.  The particular type of locking used is set when
 | |
| 54 |     the object is constructed.  In older formats OSLocks are used everywhere.
 | |
| 55 |     in newer formats a LockDir is used for Repositories and Branches, and 
 | |
| 56 |     OSLocks for the local filesystem.
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 57 |     """
 | 
| 1185.65.10
by Robert Collins Rename Controlfiles to LockableFiles. | 58 | |
| 1553.5.47
by Martin Pool cleanup LockableFiles | 59 |     # _lock_mode: None, or 'r' or 'w'
 | 
| 1553.5.43
by Martin Pool Get LockableFiles tests running against LockDir | 60 | |
| 1553.5.47
by Martin Pool cleanup LockableFiles | 61 |     # _lock_count: If _lock_mode is true, a positive count of the number of
 | 
| 62 |     # times the lock has been taken *by this process*.   
 | |
| 63 | ||
| 1185.69.2
by John Arbash Meinel Changed LockableFiles to take the root directory directly. Moved mode information into LockableFiles instead of Branch | 64 |     # If set to False (by a plugin, etc) BzrBranch will not set the
 | 
| 65 |     # mode on created files or directories
 | |
| 66 | _set_file_mode = True | |
| 67 | _set_dir_mode = True | |
| 1185.65.10
by Robert Collins Rename Controlfiles to LockableFiles. | 68 | |
| 1553.5.63
by Martin Pool Lock type is now mandatory for LockableFiles constructor | 69 | def __init__(self, transport, lock_name, lock_class): | 
| 1553.5.43
by Martin Pool Get LockableFiles tests running against LockDir | 70 | """Create a LockableFiles group | 
| 71 | ||
| 72 |         :param transport: Transport pointing to the directory holding the 
 | |
| 73 |             control files and lock.
 | |
| 74 |         :param lock_name: Name of the lock guarding these files.
 | |
| 1553.5.47
by Martin Pool cleanup LockableFiles | 75 |         :param lock_class: Class of lock strategy to use: typically
 | 
| 76 |             either LockDir or TransportLock.
 | |
| 1553.5.43
by Martin Pool Get LockableFiles tests running against LockDir | 77 |         """
 | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 78 | self._transport = transport | 
| 79 | self.lock_name = lock_name | |
| 80 | self._transaction = None | |
| 1553.5.47
by Martin Pool cleanup LockableFiles | 81 | self._lock_mode = None | 
| 82 | self._lock_count = 0 | |
| 1685.1.43
by John Arbash Meinel Bug in lockable files when _find_mode throws | 83 | self._find_modes() | 
| 1553.5.43
by Martin Pool Get LockableFiles tests running against LockDir | 84 | esc_name = self._escape(lock_name) | 
| 1608.2.1
by Martin Pool [merge] Storage filename escaping | 85 | self._lock = lock_class(transport, esc_name, | 
| 1553.5.59
by Martin Pool Pass file/mode bits through to creation of lock files/dirs | 86 | file_modebits=self._file_mode, | 
| 87 | dir_modebits=self._dir_mode) | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 88 | |
| 1553.5.60
by Martin Pool New LockableFiles.create_lock() method | 89 | def create_lock(self): | 
| 90 | """Create the lock. | |
| 91 | ||
| 92 |         This should normally be called only when the LockableFiles directory
 | |
| 93 |         is first created on disk.
 | |
| 94 |         """
 | |
| 1666.1.4
by Robert Collins * 'Metadir' is now the default disk format. This improves behaviour in | 95 | self._lock.create(mode=self._dir_mode) | 
| 1553.5.60
by Martin Pool New LockableFiles.create_lock() method | 96 | |
| 1553.5.53
by Martin Pool Add LockableFiles __repr__ | 97 | def __repr__(self): | 
| 98 | return '%s(%r)' % (self.__class__.__name__, | |
| 99 | self._transport) | |
| 1185.80.2
by John Arbash Meinel Traced double locking code to WorkingTree creating its own control files. | 100 | def __str__(self): | 
| 101 | return 'LockableFiles(%s, %s)' % (self.lock_name, self._transport.base) | |
| 102 | ||
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 103 | def __del__(self): | 
| 1608.2.1
by Martin Pool [merge] Storage filename escaping | 104 | if self.is_locked(): | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 105 |             # XXX: This should show something every time, and be suitable for
 | 
| 106 |             # headless operation and embedding
 | |
| 1185.67.9
by Aaron Bentley Fixed most bugs | 107 | from warnings import warn | 
| 1185.65.10
by Robert Collins Rename Controlfiles to LockableFiles. | 108 | warn("file group %r was not explicitly unlocked" % self) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 109 | self._lock.unlock() | 
| 1553.5.53
by Martin Pool Add LockableFiles __repr__ | 110 | |
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 111 | def break_lock(self): | 
| 112 | """Break the lock of this lockable files group if it is held. | |
| 113 | ||
| 114 |         The current ui factory will be used to prompt for user conformation.
 | |
| 115 |         """
 | |
| 116 | self._lock.break_lock() | |
| 117 | ||
| 1185.69.2
by John Arbash Meinel Changed LockableFiles to take the root directory directly. Moved mode information into LockableFiles instead of Branch | 118 | def _escape(self, file_or_path): | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 119 | if not isinstance(file_or_path, basestring): | 
| 120 | file_or_path = '/'.join(file_or_path) | |
| 121 | if file_or_path == '': | |
| 1185.69.2
by John Arbash Meinel Changed LockableFiles to take the root directory directly. Moved mode information into LockableFiles instead of Branch | 122 | return u'' | 
| 1685.1.45
by John Arbash Meinel Moved url functions into bzrlib.urlutils | 123 | return urlutils.escape(safe_unicode(file_or_path)) | 
| 1185.69.2
by John Arbash Meinel Changed LockableFiles to take the root directory directly. Moved mode information into LockableFiles instead of Branch | 124 | |
| 125 | def _find_modes(self): | |
| 126 | """Determine the appropriate modes for files and directories.""" | |
| 127 | try: | |
| 1534.4.28
by Robert Collins first cut at merge from integration. | 128 | st = self._transport.stat('.') | 
| 129 | except errors.TransportNotPossible: | |
| 1185.69.2
by John Arbash Meinel Changed LockableFiles to take the root directory directly. Moved mode information into LockableFiles instead of Branch | 130 | self._dir_mode = 0755 | 
| 131 | self._file_mode = 0644 | |
| 132 | else: | |
| 133 | self._dir_mode = st.st_mode & 07777 | |
| 134 |             # Remove the sticky and execute bits for files
 | |
| 135 | self._file_mode = self._dir_mode & ~07111 | |
| 136 | if not self._set_dir_mode: | |
| 137 | self._dir_mode = None | |
| 138 | if not self._set_file_mode: | |
| 139 | self._file_mode = None | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 140 | |
| 141 | def controlfilename(self, file_or_path): | |
| 142 | """Return location relative to branch.""" | |
| 1185.69.2
by John Arbash Meinel Changed LockableFiles to take the root directory directly. Moved mode information into LockableFiles instead of Branch | 143 | return self._transport.abspath(self._escape(file_or_path)) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 144 | |
| 1534.1.15
by Robert Collins * The internal storage of history, and logical branch identity have now | 145 | @deprecated_method(zero_eight) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 146 | def controlfile(self, file_or_path, mode='r'): | 
| 147 | """Open a control file for this branch. | |
| 148 | ||
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 149 |         There are two classes of file in a lockable directory: text
 | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 150 |         and binary.  binary files are untranslated byte streams.  Text
 | 
| 151 |         control files are stored with Unix newlines and in UTF-8, even
 | |
| 152 |         if the platform or locale defaults are different.
 | |
| 153 | ||
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 154 |         Such files are not openable in write mode : they are managed via
 | 
| 155 |         put and put_utf8 which atomically replace old versions using
 | |
| 156 |         atomicfile.
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 157 |         """
 | 
| 158 | ||
| 1185.69.2
by John Arbash Meinel Changed LockableFiles to take the root directory directly. Moved mode information into LockableFiles instead of Branch | 159 | relpath = self._escape(file_or_path) | 
| 1553.5.43
by Martin Pool Get LockableFiles tests running against LockDir | 160 |         # TODO: codecs.open() buffers linewise, so it was overloaded with
 | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 161 |         # a much larger buffer, do we need to do the same for getreader/getwriter?
 | 
| 162 | if mode == 'rb': | |
| 1185.65.29
by Robert Collins Implement final review suggestions. | 163 | return self.get(relpath) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 164 | elif mode == 'wb': | 
| 1185.65.12
by Robert Collins Remove the only-used-once put_controlfiles, and change put_controlfile to put and put_utf8. | 165 | raise BzrError("Branch.controlfile(mode='wb') is not supported, use put[_utf8]") | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 166 | elif mode == 'r': | 
| 1185.65.29
by Robert Collins Implement final review suggestions. | 167 | return self.get_utf8(relpath) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 168 | elif mode == 'w': | 
| 1185.65.12
by Robert Collins Remove the only-used-once put_controlfiles, and change put_controlfile to put and put_utf8. | 169 | raise BzrError("Branch.controlfile(mode='w') is not supported, use put[_utf8]") | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 170 | else: | 
| 171 | raise BzrError("invalid controlfile mode %r" % mode) | |
| 172 | ||
| 1185.65.29
by Robert Collins Implement final review suggestions. | 173 |     @needs_read_lock
 | 
| 174 | def get(self, relpath): | |
| 175 | """Get a file as a bytestream.""" | |
| 176 | relpath = self._escape(relpath) | |
| 177 | return self._transport.get(relpath) | |
| 178 | ||
| 179 |     @needs_read_lock
 | |
| 180 | def get_utf8(self, relpath): | |
| 181 | """Get a file as a unicode stream.""" | |
| 182 | relpath = self._escape(relpath) | |
| 183 |         # DO NOT introduce an errors=replace here.
 | |
| 184 | return codecs.getreader('utf-8')(self._transport.get(relpath)) | |
| 185 | ||
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 186 |     @needs_write_lock
 | 
| 1185.65.12
by Robert Collins Remove the only-used-once put_controlfiles, and change put_controlfile to put and put_utf8. | 187 | def put(self, path, file): | 
| 188 | """Write a file. | |
| 189 |         
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 190 |         :param path: The path to put the file, relative to the .bzr control
 | 
| 191 |                      directory
 | |
| 192 |         :param f: A file-like or string object whose contents should be copied.
 | |
| 193 |         """
 | |
| 1185.69.2
by John Arbash Meinel Changed LockableFiles to take the root directory directly. Moved mode information into LockableFiles instead of Branch | 194 | self._transport.put(self._escape(path), file, mode=self._file_mode) | 
| 1185.65.12
by Robert Collins Remove the only-used-once put_controlfiles, and change put_controlfile to put and put_utf8. | 195 | |
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 196 |     @needs_write_lock
 | 
| 1185.65.29
by Robert Collins Implement final review suggestions. | 197 | def put_utf8(self, path, a_string): | 
| 198 | """Write a string, encoding as utf-8. | |
| 1185.65.12
by Robert Collins Remove the only-used-once put_controlfiles, and change put_controlfile to put and put_utf8. | 199 | |
| 1185.65.29
by Robert Collins Implement final review suggestions. | 200 |         :param path: The path to put the string, relative to the transport root.
 | 
| 201 |         :param string: A file-like or string object whose contents should be copied.
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 202 |         """
 | 
| 1185.67.7
by Aaron Bentley Refactored a bit | 203 |         # IterableFile would not be needed if Transport.put took iterables
 | 
| 204 |         # instead of files.  ADHB 2005-12-25
 | |
| 1185.65.17
by Robert Collins Merge from integration, mode-changes are broken. | 205 |         # RBC 20060103 surely its not needed anyway, with codecs transcode
 | 
| 206 |         # file support ?
 | |
| 1185.69.2
by John Arbash Meinel Changed LockableFiles to take the root directory directly. Moved mode information into LockableFiles instead of Branch | 207 |         # JAM 20060103 We definitely don't want encode(..., 'replace')
 | 
| 208 |         # these are valuable files which should have exact contents.
 | |
| 1185.65.29
by Robert Collins Implement final review suggestions. | 209 | if not isinstance(a_string, basestring): | 
| 210 | raise errors.BzrBadParameterNotString(a_string) | |
| 211 | self.put(path, StringIO(a_string.encode('utf-8'))) | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 212 | |
| 213 | def lock_write(self): | |
| 1551.2.3
by Aaron Bentley Removed lock-related log spam [recommit] | 214 |         # mutter("lock write: %s (%s)", self, self._lock_count)
 | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 215 |         # TODO: Upgrade locking to support using a Transport,
 | 
| 216 |         # and potentially a remote locking protocol
 | |
| 217 | if self._lock_mode: | |
| 1594.2.22
by Robert Collins Ensure that lockable files calls finish() on transactions.: | 218 | if self._lock_mode != 'w' or not self.get_transaction().writeable(): | 
| 1694.2.6
by Martin Pool [merge] bzr.dev | 219 | raise errors.ReadOnlyError(self) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 220 | self._lock_count += 1 | 
| 221 | else: | |
| 1553.5.47
by Martin Pool cleanup LockableFiles | 222 | self._lock.lock_write() | 
| 1185.80.2
by John Arbash Meinel Traced double locking code to WorkingTree creating its own control files. | 223 |             #note('write locking %s', self)
 | 
| 224 |             #traceback.print_stack()
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 225 | self._lock_mode = 'w' | 
| 226 | self._lock_count = 1 | |
| 1563.2.34
by Robert Collins Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction | 227 | self._set_transaction(transactions.WriteTransaction()) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 228 | |
| 229 | def lock_read(self): | |
| 1551.2.3
by Aaron Bentley Removed lock-related log spam [recommit] | 230 |         # mutter("lock read: %s (%s)", self, self._lock_count)
 | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 231 | if self._lock_mode: | 
| 232 | assert self._lock_mode in ('r', 'w'), \ | |
| 233 | "invalid lock mode %r" % self._lock_mode | |
| 234 | self._lock_count += 1 | |
| 235 | else: | |
| 1553.5.47
by Martin Pool cleanup LockableFiles | 236 | self._lock.lock_read() | 
| 1185.80.2
by John Arbash Meinel Traced double locking code to WorkingTree creating its own control files. | 237 |             #note('read locking %s', self)
 | 
| 238 |             #traceback.print_stack()
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 239 | self._lock_mode = 'r' | 
| 240 | self._lock_count = 1 | |
| 241 | self._set_transaction(transactions.ReadOnlyTransaction()) | |
| 242 |             # 5K may be excessive, but hey, its a knob.
 | |
| 243 | self.get_transaction().set_cache_size(5000) | |
| 244 | ||
| 245 | def unlock(self): | |
| 1551.2.3
by Aaron Bentley Removed lock-related log spam [recommit] | 246 |         # mutter("unlock: %s (%s)", self, self._lock_count)
 | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 247 | if not self._lock_mode: | 
| 1553.5.36
by Martin Pool Clean up duplicate BranchNotLocked error and rename to ObjectNotLocked | 248 | raise errors.LockNotHeld(self) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 249 | if self._lock_count > 1: | 
| 250 | self._lock_count -= 1 | |
| 251 | else: | |
| 1185.80.2
by John Arbash Meinel Traced double locking code to WorkingTree creating its own control files. | 252 |             #note('unlocking %s', self)
 | 
| 253 |             #traceback.print_stack()
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 254 | self._finish_transaction() | 
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 255 | try: | 
| 256 | self._lock.unlock() | |
| 257 | finally: | |
| 258 | self._lock_mode = self._lock_count = None | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 259 | |
| 1553.5.35
by Martin Pool Start break-lock --show | 260 | def is_locked(self): | 
| 261 | """Return true if this LockableFiles group is locked""" | |
| 262 | return self._lock_count >= 1 | |
| 263 | ||
| 1694.2.6
by Martin Pool [merge] bzr.dev | 264 | def get_physical_lock_status(self): | 
| 265 | """Return physical lock status. | |
| 266 |         
 | |
| 267 |         Returns true if a lock is held on the transport. If no lock is held, or
 | |
| 268 |         the underlying locking mechanism does not support querying lock
 | |
| 269 |         status, false is returned.
 | |
| 270 |         """
 | |
| 271 | try: | |
| 272 | return self._lock.peek() is not None | |
| 273 | except NotImplementedError: | |
| 274 | return False | |
| 275 | ||
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 276 | def get_transaction(self): | 
| 277 | """Return the current active transaction. | |
| 278 | ||
| 279 |         If no transaction is active, this returns a passthrough object
 | |
| 280 |         for which all data is immediately flushed and no caching happens.
 | |
| 281 |         """
 | |
| 282 | if self._transaction is None: | |
| 283 | return transactions.PassThroughTransaction() | |
| 284 | else: | |
| 285 | return self._transaction | |
| 286 | ||
| 287 | def _set_transaction(self, new_transaction): | |
| 288 | """Set a new active transaction.""" | |
| 289 | if self._transaction is not None: | |
| 290 | raise errors.LockError('Branch %s is in a transaction already.' % | |
| 291 | self) | |
| 292 | self._transaction = new_transaction | |
| 293 | ||
| 294 | def _finish_transaction(self): | |
| 295 | """Exit the current transaction.""" | |
| 296 | if self._transaction is None: | |
| 297 | raise errors.LockError('Branch %s is not in a transaction' % | |
| 298 | self) | |
| 299 | transaction = self._transaction | |
| 300 | self._transaction = None | |
| 301 | transaction.finish() | |
| 1553.5.40
by Martin Pool Factor locking strategy out of LockableFiles so that we can use LockDirs in new formats. | 302 | |
| 303 | ||
| 1553.5.45
by Martin Pool Clean up Transport-based locks for old branches | 304 | class TransportLock(object): | 
| 305 | """Locking method which uses transport-dependent locks. | |
| 306 | ||
| 307 |     On the local filesystem these transform into OS-managed locks.
 | |
| 308 | ||
| 309 |     These do not guard against concurrent access via different
 | |
| 310 |     transports.
 | |
| 311 | ||
| 312 |     This is suitable for use only in WorkingTrees (which are at present
 | |
| 313 |     always local).
 | |
| 1553.5.40
by Martin Pool Factor locking strategy out of LockableFiles so that we can use LockDirs in new formats. | 314 |     """
 | 
| 1553.5.59
by Martin Pool Pass file/mode bits through to creation of lock files/dirs | 315 | def __init__(self, transport, escaped_name, file_modebits, dir_modebits): | 
| 1553.5.40
by Martin Pool Factor locking strategy out of LockableFiles so that we can use LockDirs in new formats. | 316 | self._transport = transport | 
| 317 | self._escaped_name = escaped_name | |
| 1553.5.59
by Martin Pool Pass file/mode bits through to creation of lock files/dirs | 318 | self._file_modebits = file_modebits | 
| 319 | self._dir_modebits = dir_modebits | |
| 1553.5.40
by Martin Pool Factor locking strategy out of LockableFiles so that we can use LockDirs in new formats. | 320 | |
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 321 | def break_lock(self): | 
| 322 | raise NotImplementedError(self.break_lock) | |
| 323 | ||
| 1553.5.40
by Martin Pool Factor locking strategy out of LockableFiles so that we can use LockDirs in new formats. | 324 | def lock_write(self): | 
| 325 | self._lock = self._transport.lock_write(self._escaped_name) | |
| 326 | ||
| 327 | def lock_read(self): | |
| 328 | self._lock = self._transport.lock_read(self._escaped_name) | |
| 329 | ||
| 330 | def unlock(self): | |
| 331 | self._lock.unlock() | |
| 332 | self._lock = None | |
| 333 | ||
| 1694.2.6
by Martin Pool [merge] bzr.dev | 334 | def peek(self): | 
| 335 | raise NotImplementedError() | |
| 336 | ||
| 1666.1.4
by Robert Collins * 'Metadir' is now the default disk format. This improves behaviour in | 337 | def create(self, mode=None): | 
| 1553.5.59
by Martin Pool Pass file/mode bits through to creation of lock files/dirs | 338 | """Create lock mechanism""" | 
| 339 |         # for old-style locks, create the file now
 | |
| 1553.5.60
by Martin Pool New LockableFiles.create_lock() method | 340 | self._transport.put(self._escaped_name, StringIO(), | 
| 341 | mode=self._file_modebits) |