243
243
# have a similar bug allowing someone to think they got the lock
244
244
# when it's already held.
246
# See <https://bugs.launchpad.net/bzr/+bug/498378> for one case.
246
# See <https://bugs.edge.launchpad.net/bzr/+bug/498378> for one case.
248
248
# Strictly the check is unnecessary and a waste of time for most
249
249
# people, but probably worth trapping if something is wrong.
447
447
# XXX: is creating this here inefficient?
448
448
config = bzrlib.config.GlobalConfig()
450
user = config.user_email()
451
except errors.NoEmailInUsername:
450
452
user = config.username()
451
except errors.NoWhoami:
452
user = osutils.getuser_unicode()
453
453
s = rio.Stanza(hostname=get_host_name(),
454
454
pid=str(os.getpid()),
455
455
start_time=str(int(time.time())),
539
539
if deadline_str is None:
540
540
deadline_str = time.strftime('%H:%M:%S',
541
541
time.localtime(deadline))
542
# As local lock urls are correct we display them.
543
# We avoid displaying remote lock urls.
544
542
lock_url = self.transport.abspath(self.path)
545
if lock_url.startswith('file://'):
546
lock_url = lock_url.split('.bzr/')[0]
549
user, hostname, pid, time_ago = formatted_info
550
msg = ('%s lock %s ' # lock_url
554
'[process #%s], ' # pid
555
'acquired %s.') # time ago
556
msg_args = [start, lock_url, user, hostname, pid, time_ago]
558
msg += ('\nWill continue to try until %s, unless '
560
msg_args.append(deadline_str)
561
msg += '\nSee "bzr help break-lock" for more.'
562
self._report_function(msg, *msg_args)
543
# See <https://bugs.edge.launchpad.net/bzr/+bug/250451>
544
# the URL here is sometimes not one that is useful to the
545
# user, perhaps being wrapped in a lp-%d or chroot decorator,
546
# especially if this error is issued from the server.
547
self._report_function('%s %s\n'
549
'%s\n' # locked ... ago
550
'Will continue to try until %s, unless '
551
'you press Ctrl-C.\n'
552
'See "bzr help break-lock" for more.',
563
560
if (max_attempts is not None) and (attempt_count >= max_attempts):
564
561
self._trace("exceeded %d attempts")
565
562
raise LockContention(self)
567
564
self._trace("waiting %ss", poll)
570
# As timeout is always 0 for remote locks
571
# this block is applicable only for local
573
567
self._trace("timeout after waiting %ss", timeout)
574
raise LockContention('(local)', lock_url)
568
raise LockContention(self)
576
570
def leave_in_place(self):
577
571
self._locked_via_token = True
623
617
def _format_lock_info(self, info):
624
618
"""Turn the contents of peek() into something for the user"""
619
lock_url = self.transport.abspath(self.path)
625
620
start_time = info.get('start_time')
626
621
if start_time is None:
627
622
time_ago = '(unknown)'
629
624
time_ago = format_delta(time.time() - int(info['start_time']))
630
user = info.get('user', '<unknown>')
631
hostname = info.get('hostname', '<unknown>')
632
pid = info.get('pid', '<unknown>')
626
'lock %s' % (lock_url,),
627
'held by %s on host %s [process #%s]' %
628
tuple([info.get(x, '<unknown>') for x in ['user', 'hostname', 'pid']]),
629
'locked %s' % (time_ago,),
640
632
def validate_token(self, token):