32
32
from errors import BzrError
33
33
from textui import show_status
37
35
BZR_BRANCH_FORMAT = "Bazaar-NG branch, format 0.0.4\n"
38
36
## TODO: Maybe include checks for common corruption of newlines, etc?
89
87
Base directory of the branch.
90
None, or a duple with 'r' or 'w' for the first element and a positive
94
Open file used for locking.
94
99
def __init__(self, base, init=False, find_root=True, lock_mode='w'):
95
100
"""Create new branch object at a particular location.
119
124
['use "bzr init" to initialize a new working tree',
120
125
'current bzr can only operate from top-of-tree'])
121
126
self._check_format()
122
self._lockfile = None
127
self._lockfile = self.controlfile('branch-lock', 'wb')
123
128
self.lock(lock_mode)
125
130
self.text_store = ImmutableStore(self.controlfilename('text-store'))
134
139
__repr__ = __str__
138
def lock(self, mode='w'):
139
"""Lock the on-disk branch, excluding other processes."""
145
om = os.O_WRONLY | os.O_CREAT
150
raise BzrError("invalid locking mode %r" % mode)
153
lockfile = os.open(self.controlfilename('branch-lock'), om)
155
if e.errno == errno.ENOENT:
156
# might not exist on branches from <0.0.4
157
self.controlfile('branch-lock', 'w').close()
158
lockfile = os.open(self.controlfilename('branch-lock'), om)
162
fcntl.lockf(lockfile, lm)
164
fcntl.lockf(lockfile, fcntl.LOCK_UN)
166
self._lockmode = None
168
self._lockmode = mode
171
warnings.warning("please write a locking method for platform %r" % sys.platform)
173
self._lockmode = None
175
self._lockmode = mode
144
from warnings import warn
145
warn("branch %r was not explicitly unlocked" % self)
149
def lock(self, mode):
151
raise BzrError('branch %r is already locked: %r' % (self, self._lock_mode))
153
from bzrlib.lock import lock, LOCK_SH, LOCK_EX
159
raise ValueError('invalid lock mode %r' % mode)
161
lock(self._lockfile, m)
162
self._lock_mode = (mode, 1)
166
if not self._lock_mode:
167
raise BzrError('branch %r is not locked' % (self))
168
from bzrlib.lock import unlock
169
unlock(self._lockfile)
170
self._lock_mode = None
178
173
def _need_readlock(self):
179
if self._lockmode not in ['r', 'w']:
174
if not self._lock_mode:
180
175
raise BzrError('need read lock on branch, only have %r' % self._lockmode)
182
178
def _need_writelock(self):
183
if self._lockmode not in ['w']:
179
if (self._lock_mode == None) or (self._lock_mode[0] != 'w'):
184
180
raise BzrError('need write lock on branch, only have %r' % self._lockmode)