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