1
# Copyright (C) 2006-2010 Canonical Ltd
1
# Copyright (C) 2006, 2007, 2008, 2010 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
243
241
# have a similar bug allowing someone to think they got the lock
244
242
# when it's already held.
246
# See <https://bugs.launchpad.net/bzr/+bug/498378> for one case.
244
# See <https://bugs.edge.launchpad.net/bzr/+bug/498378> for one case.
248
246
# Strictly the check is unnecessary and a waste of time for most
249
247
# people, but probably worth trapping if something is wrong.
426
423
peek() reads the info file of the lock holder, if any.
428
return self._parse_info(self.transport.get_bytes(path))
425
return self._parse_info(self.transport.get(path))
431
428
"""Check if the lock is held by anyone.
447
444
# XXX: is creating this here inefficient?
448
445
config = bzrlib.config.GlobalConfig()
447
user = config.user_email()
448
except errors.NoEmailInUsername:
450
449
user = config.username()
451
except errors.NoWhoami:
452
user = osutils.getuser_unicode()
453
450
s = rio.Stanza(hostname=get_host_name(),
454
451
pid=str(os.getpid()),
455
452
start_time=str(int(time.time())),
459
456
return s.to_string()
461
def _parse_info(self, info_bytes):
462
stanza = rio.read_stanza(osutils.split_lines(info_bytes))
458
def _parse_info(self, info_file):
459
stanza = rio.read_stanza(info_file.readlines())
463
460
if stanza is None:
464
461
# see bug 185013; we fairly often end up with the info file being
465
462
# empty after an interruption; we could log a message here but
539
536
if deadline_str is None:
540
537
deadline_str = time.strftime('%H:%M:%S',
541
538
time.localtime(deadline))
542
# As local lock urls are correct we display them.
543
# We avoid displaying remote lock urls.
544
539
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)
540
self._report_function('%s %s\n'
542
'%s\n' # locked ... ago
543
'Will continue to try until %s, unless '
545
'If you\'re sure that it\'s not being '
546
'modified, use bzr break-lock %s',
563
554
if (max_attempts is not None) and (attempt_count >= max_attempts):
564
555
self._trace("exceeded %d attempts")
565
556
raise LockContention(self)
567
558
self._trace("waiting %ss", poll)
570
# As timeout is always 0 for remote locks
571
# this block is applicable only for local
573
561
self._trace("timeout after waiting %ss", timeout)
574
raise LockContention('(local)', lock_url)
562
raise LockContention(self)
576
564
def leave_in_place(self):
577
565
self._locked_via_token = True
623
611
def _format_lock_info(self, info):
624
612
"""Turn the contents of peek() into something for the user"""
613
lock_url = self.transport.abspath(self.path)
625
614
start_time = info.get('start_time')
626
615
if start_time is None:
627
616
time_ago = '(unknown)'
629
618
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>')
620
'lock %s' % (lock_url,),
621
'held by %s on host %s [process #%s]' %
622
tuple([info.get(x, '<unknown>') for x in ['user', 'hostname', 'pid']]),
623
'locked %s' % (time_ago,),
640
626
def validate_token(self, token):