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
 | 
| 1887.1.1
by Adeodato Simó Do not separate paragraphs in the copyright statement with blank lines, | 2 | #
 | 
| 1185.65.22
by Robert Collins lockable_files was extracted from branch.py - give it a copyright statement | 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.
 | |
| 1887.1.1
by Adeodato Simó Do not separate paragraphs in the copyright statement with blank lines, | 7 | #
 | 
| 1185.65.22
by Robert Collins lockable_files was extracted from branch.py - give it a copyright statement | 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.
 | |
| 1887.1.1
by Adeodato Simó Do not separate paragraphs in the copyright statement with blank lines, | 12 | #
 | 
| 1185.65.22
by Robert Collins lockable_files was extracted from branch.py - give it a copyright statement | 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 | 
| 2696.1.1
by Martin Pool Remove things deprecated in 0.11 and earlier | 27 | from bzrlib.symbol_versioning import (deprecated_method, | 
| 28 |         )
 | |
| 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 | |
| 1185.65.29
by Robert Collins Implement final review suggestions. | 147 |     @needs_read_lock
 | 
| 148 | def get(self, relpath): | |
| 149 | """Get a file as a bytestream.""" | |
| 150 | relpath = self._escape(relpath) | |
| 151 | return self._transport.get(relpath) | |
| 152 | ||
| 153 |     @needs_read_lock
 | |
| 154 | def get_utf8(self, relpath): | |
| 155 | """Get a file as a unicode stream.""" | |
| 156 | relpath = self._escape(relpath) | |
| 157 |         # DO NOT introduce an errors=replace here.
 | |
| 158 | return codecs.getreader('utf-8')(self._transport.get(relpath)) | |
| 159 | ||
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 160 |     @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. | 161 | def put(self, path, file): | 
| 162 | """Write a file. | |
| 163 |         
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 164 |         :param path: The path to put the file, relative to the .bzr control
 | 
| 165 |                      directory
 | |
| 166 |         :param f: A file-like or string object whose contents should be copied.
 | |
| 167 |         """
 | |
| 1955.3.8
by John Arbash Meinel avoid some deprecation warnings in other parts of the code | 168 | self._transport.put_file(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. | 169 | |
| 1185.65.27
by Robert Collins Tweak storage towards mergability. | 170 |     @needs_write_lock
 | 
| 2249.5.11
by John Arbash Meinel Audit Branch to ensure utf8 revision ids. | 171 | def put_bytes(self, path, a_string): | 
| 172 | """Write a string of bytes. | |
| 173 | ||
| 174 |         :param path: The path to put the bytes, relative to the transport root.
 | |
| 175 |         :param string: A string object, whose exact bytes are to be copied.
 | |
| 176 |         """
 | |
| 177 | self._transport.put_bytes(self._escape(path), a_string, | |
| 178 | mode=self._file_mode) | |
| 179 | ||
| 180 |     @needs_write_lock
 | |
| 1185.65.29
by Robert Collins Implement final review suggestions. | 181 | def put_utf8(self, path, a_string): | 
| 182 | """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. | 183 | |
| 1185.65.29
by Robert Collins Implement final review suggestions. | 184 |         :param path: The path to put the string, relative to the transport root.
 | 
| 2249.5.11
by John Arbash Meinel Audit Branch to ensure utf8 revision ids. | 185 |         :param string: A string or unicode object whose contents should be copied.
 | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 186 |         """
 | 
| 1185.67.7
by Aaron Bentley Refactored a bit | 187 |         # IterableFile would not be needed if Transport.put took iterables
 | 
| 188 |         # instead of files.  ADHB 2005-12-25
 | |
| 1185.65.17
by Robert Collins Merge from integration, mode-changes are broken. | 189 |         # RBC 20060103 surely its not needed anyway, with codecs transcode
 | 
| 190 |         # 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 | 191 |         # JAM 20060103 We definitely don't want encode(..., 'replace')
 | 
| 192 |         # these are valuable files which should have exact contents.
 | |
| 1185.65.29
by Robert Collins Implement final review suggestions. | 193 | if not isinstance(a_string, basestring): | 
| 194 | raise errors.BzrBadParameterNotString(a_string) | |
| 2249.5.11
by John Arbash Meinel Audit Branch to ensure utf8 revision ids. | 195 | self.put_bytes(path, a_string.encode('utf-8')) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 196 | |
| 2018.5.75
by Andrew Bennetts Add Repository.{dont_,}leave_lock_in_place. | 197 | def leave_in_place(self): | 
| 198 | """Set this LockableFiles to not clear the physical lock on unlock.""" | |
| 199 | self._lock.leave_in_place() | |
| 200 | ||
| 201 | def dont_leave_in_place(self): | |
| 202 | """Set this LockableFiles to clear the physical lock on unlock.""" | |
| 203 | self._lock.dont_leave_in_place() | |
| 204 | ||
| 2279.7.1
by Andrew Bennetts ``LockableFiles.lock_write()`` now accepts a ``token`` keyword argument, so that | 205 | def lock_write(self, token=None): | 
| 206 | """Lock this group of files for writing. | |
| 207 |         
 | |
| 208 |         :param token: if this is already locked, then lock_write will fail
 | |
| 209 |             unless the token matches the existing lock.
 | |
| 210 |         :returns: a token if this instance supports tokens, otherwise None.
 | |
| 211 |         :raises TokenLockingNotSupported: when a token is given but this
 | |
| 212 |             instance doesn't support using token locks.
 | |
| 213 |         :raises MismatchedToken: if the specified token doesn't match the token
 | |
| 214 |             of the existing lock.
 | |
| 2018.5.145
by Andrew Bennetts Add a brief explanation of what tokens are used for to lock_write docstrings. | 215 | |
| 216 |         A token should be passed in if you know that you have locked the object
 | |
| 217 |         some other way, and need to synchronise this object's state with that
 | |
| 218 |         fact.
 | |
| 2279.7.1
by Andrew Bennetts ``LockableFiles.lock_write()`` now accepts a ``token`` keyword argument, so that | 219 |         """
 | 
| 1551.2.3
by Aaron Bentley Removed lock-related log spam [recommit] | 220 |         # mutter("lock write: %s (%s)", self, self._lock_count)
 | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 221 |         # TODO: Upgrade locking to support using a Transport,
 | 
| 222 |         # and potentially a remote locking protocol
 | |
| 223 | if self._lock_mode: | |
| 1594.2.22
by Robert Collins Ensure that lockable files calls finish() on transactions.: | 224 | if self._lock_mode != 'w' or not self.get_transaction().writeable(): | 
| 1694.2.6
by Martin Pool [merge] bzr.dev | 225 | raise errors.ReadOnlyError(self) | 
| 2279.7.1
by Andrew Bennetts ``LockableFiles.lock_write()`` now accepts a ``token`` keyword argument, so that | 226 | self._lock.validate_token(token) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 227 | self._lock_count += 1 | 
| 2018.14.1
by Andrew Bennetts Update to current hpss branch? Fix lots of test failures. | 228 | return self._token_from_lock | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 229 | else: | 
| 2279.7.1
by Andrew Bennetts ``LockableFiles.lock_write()`` now accepts a ``token`` keyword argument, so that | 230 | token_from_lock = self._lock.lock_write(token=token) | 
| 1185.80.2
by John Arbash Meinel Traced double locking code to WorkingTree creating its own control files. | 231 |             #note('write locking %s', self)
 | 
| 232 |             #traceback.print_stack()
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 233 | self._lock_mode = 'w' | 
| 234 | self._lock_count = 1 | |
| 1563.2.34
by Robert Collins Remove the commit and rollback transaction methods as misleading, and implement a WriteTransaction | 235 | self._set_transaction(transactions.WriteTransaction()) | 
| 2018.14.1
by Andrew Bennetts Update to current hpss branch? Fix lots of test failures. | 236 | self._token_from_lock = token_from_lock | 
| 2279.7.1
by Andrew Bennetts ``LockableFiles.lock_write()`` now accepts a ``token`` keyword argument, so that | 237 | return token_from_lock | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 238 | |
| 239 | def lock_read(self): | |
| 1551.2.3
by Aaron Bentley Removed lock-related log spam [recommit] | 240 |         # mutter("lock read: %s (%s)", self, self._lock_count)
 | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 241 | if self._lock_mode: | 
| 242 | assert self._lock_mode in ('r', 'w'), \ | |
| 243 | "invalid lock mode %r" % self._lock_mode | |
| 244 | self._lock_count += 1 | |
| 245 | else: | |
| 1553.5.47
by Martin Pool cleanup LockableFiles | 246 | self._lock.lock_read() | 
| 1185.80.2
by John Arbash Meinel Traced double locking code to WorkingTree creating its own control files. | 247 |             #note('read locking %s', self)
 | 
| 248 |             #traceback.print_stack()
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 249 | self._lock_mode = 'r' | 
| 250 | self._lock_count = 1 | |
| 251 | self._set_transaction(transactions.ReadOnlyTransaction()) | |
| 252 |             # 5K may be excessive, but hey, its a knob.
 | |
| 253 | self.get_transaction().set_cache_size(5000) | |
| 254 | ||
| 255 | def unlock(self): | |
| 1551.2.3
by Aaron Bentley Removed lock-related log spam [recommit] | 256 |         # mutter("unlock: %s (%s)", self, self._lock_count)
 | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 257 | if not self._lock_mode: | 
| 1553.5.36
by Martin Pool Clean up duplicate BranchNotLocked error and rename to ObjectNotLocked | 258 | raise errors.LockNotHeld(self) | 
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 259 | if self._lock_count > 1: | 
| 260 | self._lock_count -= 1 | |
| 261 | else: | |
| 1185.80.2
by John Arbash Meinel Traced double locking code to WorkingTree creating its own control files. | 262 |             #note('unlocking %s', self)
 | 
| 263 |             #traceback.print_stack()
 | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 264 | self._finish_transaction() | 
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 265 | try: | 
| 266 | self._lock.unlock() | |
| 267 | finally: | |
| 268 | self._lock_mode = self._lock_count = None | |
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 269 | |
| 1553.5.35
by Martin Pool Start break-lock --show | 270 | def is_locked(self): | 
| 271 | """Return true if this LockableFiles group is locked""" | |
| 272 | return self._lock_count >= 1 | |
| 273 | ||
| 1694.2.6
by Martin Pool [merge] bzr.dev | 274 | def get_physical_lock_status(self): | 
| 275 | """Return physical lock status. | |
| 276 |         
 | |
| 277 |         Returns true if a lock is held on the transport. If no lock is held, or
 | |
| 278 |         the underlying locking mechanism does not support querying lock
 | |
| 279 |         status, false is returned.
 | |
| 280 |         """
 | |
| 281 | try: | |
| 282 | return self._lock.peek() is not None | |
| 283 | except NotImplementedError: | |
| 284 | return False | |
| 285 | ||
| 1185.65.1
by Aaron Bentley Refactored out ControlFiles and RevisionStore from _Branch | 286 | def get_transaction(self): | 
| 287 | """Return the current active transaction. | |
| 288 | ||
| 289 |         If no transaction is active, this returns a passthrough object
 | |
| 290 |         for which all data is immediately flushed and no caching happens.
 | |
| 291 |         """
 | |
| 292 | if self._transaction is None: | |
| 293 | return transactions.PassThroughTransaction() | |
| 294 | else: | |
| 295 | return self._transaction | |
| 296 | ||
| 297 | def _set_transaction(self, new_transaction): | |
| 298 | """Set a new active transaction.""" | |
| 299 | if self._transaction is not None: | |
| 300 | raise errors.LockError('Branch %s is in a transaction already.' % | |
| 301 | self) | |
| 302 | self._transaction = new_transaction | |
| 303 | ||
| 304 | def _finish_transaction(self): | |
| 305 | """Exit the current transaction.""" | |
| 306 | if self._transaction is None: | |
| 307 | raise errors.LockError('Branch %s is not in a transaction' % | |
| 308 | self) | |
| 309 | transaction = self._transaction | |
| 310 | self._transaction = None | |
| 311 | transaction.finish() | |
| 1553.5.40
by Martin Pool Factor locking strategy out of LockableFiles so that we can use LockDirs in new formats. | 312 | |
| 313 | ||
| 1553.5.45
by Martin Pool Clean up Transport-based locks for old branches | 314 | class TransportLock(object): | 
| 315 | """Locking method which uses transport-dependent locks. | |
| 316 | ||
| 317 |     On the local filesystem these transform into OS-managed locks.
 | |
| 318 | ||
| 319 |     These do not guard against concurrent access via different
 | |
| 320 |     transports.
 | |
| 321 | ||
| 322 |     This is suitable for use only in WorkingTrees (which are at present
 | |
| 323 |     always local).
 | |
| 1553.5.40
by Martin Pool Factor locking strategy out of LockableFiles so that we can use LockDirs in new formats. | 324 |     """
 | 
| 1553.5.59
by Martin Pool Pass file/mode bits through to creation of lock files/dirs | 325 | 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. | 326 | self._transport = transport | 
| 327 | self._escaped_name = escaped_name | |
| 1553.5.59
by Martin Pool Pass file/mode bits through to creation of lock files/dirs | 328 | self._file_modebits = file_modebits | 
| 329 | 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. | 330 | |
| 1687.1.6
by Robert Collins Extend LockableFiles to support break_lock() calls. | 331 | def break_lock(self): | 
| 332 | raise NotImplementedError(self.break_lock) | |
| 333 | ||
| 2018.5.75
by Andrew Bennetts Add Repository.{dont_,}leave_lock_in_place. | 334 | def leave_in_place(self): | 
| 335 | raise NotImplementedError(self.leave_in_place) | |
| 336 | ||
| 2018.5.76
by Andrew Bennetts Testing that repository.{dont_,}leave_lock_in_place raises NotImplementedError if lock_write returns None. | 337 | def dont_leave_in_place(self): | 
| 338 | raise NotImplementedError(self.dont_leave_in_place) | |
| 339 | ||
| 2279.7.1
by Andrew Bennetts ``LockableFiles.lock_write()`` now accepts a ``token`` keyword argument, so that | 340 | def lock_write(self, token=None): | 
| 341 | if token is not None: | |
| 342 | raise errors.TokenLockingNotSupported(self) | |
| 1553.5.40
by Martin Pool Factor locking strategy out of LockableFiles so that we can use LockDirs in new formats. | 343 | self._lock = self._transport.lock_write(self._escaped_name) | 
| 344 | ||
| 345 | def lock_read(self): | |
| 346 | self._lock = self._transport.lock_read(self._escaped_name) | |
| 347 | ||
| 348 | def unlock(self): | |
| 349 | self._lock.unlock() | |
| 350 | self._lock = None | |
| 351 | ||
| 1694.2.6
by Martin Pool [merge] bzr.dev | 352 | def peek(self): | 
| 353 | raise NotImplementedError() | |
| 354 | ||
| 1666.1.4
by Robert Collins * 'Metadir' is now the default disk format. This improves behaviour in | 355 | def create(self, mode=None): | 
| 1553.5.59
by Martin Pool Pass file/mode bits through to creation of lock files/dirs | 356 | """Create lock mechanism""" | 
| 357 |         # for old-style locks, create the file now
 | |
| 1955.3.8
by John Arbash Meinel avoid some deprecation warnings in other parts of the code | 358 | self._transport.put_bytes(self._escaped_name, '', | 
| 1553.5.60
by Martin Pool New LockableFiles.create_lock() method | 359 | mode=self._file_modebits) | 
| 2279.7.1
by Andrew Bennetts ``LockableFiles.lock_write()`` now accepts a ``token`` keyword argument, so that | 360 | |
| 361 | def validate_token(self, token): | |
| 362 | if token is not None: | |
| 363 | raise errors.TokenLockingNotSupported(self) | |
| 364 |