~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/lockdir.py

  • Committer: Vincent Ladeuil
  • Date: 2010-03-02 10:21:39 UTC
  • mfrom: (4797.2.24 2.1)
  • mto: This revision was merged to the branch mainline in revision 5069.
  • Revision ID: v.ladeuil+lp@free.fr-20100302102139-b5cba7h6xu13mekg
Merge 2.1 into trunk including fixes for #331095, #507557, #185103, #524184 and #369501

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006, 2007, 2008, 2010 Canonical Ltd
2
2
#
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
252
252
        if info is None:
253
253
            raise LockFailed(self, "lock was renamed into place, but "
254
254
                "now is missing!")
255
 
        if info['nonce'] != self.nonce:
 
255
        if info.get('nonce') != self.nonce:
256
256
            self._trace("rename succeeded, "
257
257
                "but lock is still held by someone else")
258
258
            raise LockContention(self)
430
430
    def peek(self):
431
431
        """Check if the lock is held by anyone.
432
432
 
433
 
        If it is held, this returns the lock info structure as a rio Stanza,
 
433
        If it is held, this returns the lock info structure as a dict
434
434
        which contains some information about the current lock holder.
435
435
        Otherwise returns None.
436
436
        """
459
459
        return s.to_string()
460
460
 
461
461
    def _parse_info(self, info_bytes):
462
 
        # TODO: Handle if info_bytes is empty
463
 
        return rio.read_stanza(osutils.split_lines(info_bytes)).as_dict()
 
462
        stanza = rio.read_stanza(osutils.split_lines(info_bytes))
 
463
        if stanza is None:
 
464
            # see bug 185013; we fairly often end up with the info file being
 
465
            # empty after an interruption; we could log a message here but
 
466
            # there may not be much we can say
 
467
            return {}
 
468
        else:
 
469
            return stanza.as_dict()
464
470
 
465
471
    def attempt_lock(self):
466
472
        """Take the lock; fail if it's already held.
611
617
    def _format_lock_info(self, info):
612
618
        """Turn the contents of peek() into something for the user"""
613
619
        lock_url = self.transport.abspath(self.path)
614
 
        delta = time.time() - int(info['start_time'])
 
620
        start_time = info.get('start_time')
 
621
        if start_time is None:
 
622
            time_ago = '(unknown)'
 
623
        else:
 
624
            time_ago = format_delta(time.time() - int(info['start_time']))
615
625
        return [
616
626
            'lock %s' % (lock_url,),
617
 
            'held by %(user)s on host %(hostname)s [process #%(pid)s]' % info,
618
 
            'locked %s' % (format_delta(delta),),
 
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,),
619
630
            ]
620
631
 
621
632
    def validate_token(self, token):