341
def unlock_ref(self, name):
343
transport = self.worktree_transport
345
transport = self.transport
346
lockname = name + ".lock"
348
self.transport.delete(lockname)
332
352
def lock_ref(self, name):
333
353
if name == b"HEAD":
334
354
transport = self.worktree_transport
337
357
self._ensure_dir_exists(name)
338
358
lockname = name + ".lock"
340
return transport.lock_write(lockname)
341
except TransportNotPossible:
342
# better than not locking at all, I guess?
343
if transport.has(lockname):
344
raise LockError(lockname + " exists")
345
transport.put_bytes(lockname, "Locked by brz-git")
346
from ...lock import LogicalLockResult
347
return LogicalLockResult(lambda: transport.delete(lockname))
360
local_path = self.transport.local_abspath(name)
362
# This is racy, but what can we do?
363
if self.transport.has(lockname):
364
raise LockContention(name)
365
lock_result = self.transport.put_bytes(lockname, b'Locked by brz-git')
366
return LogicalLockResult(lambda: self.transport.delete(lockname))
369
gf = GitFile(local_path, 'wb')
370
except FileLocked as e:
371
raise LockContention(name, e)
375
self.transport.delete(lockname)
377
raise LockBroken(lockname)
378
# GitFile.abort doesn't care if the lock has already disappeared
380
return LogicalLockResult(unlock)
350
383
class TransportRepo(BaseRepo):