~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/lockdir.py

  • Committer: Andrew Bennetts
  • Date: 2010-01-04 02:25:11 UTC
  • mfrom: (4634.108.8 2.0)
  • mto: This revision was merged to the branch mainline in revision 4928.
  • Revision ID: andrew.bennetts@canonical.com-20100104022511-2tq2r9w2te84wzgs
Merge lp:bzr/2.0 into lp:bzr, including fixes for #343218, #495000, #495023, #494406 and #498378.

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, 2009 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.get('nonce') != self.nonce:
 
255
        if info['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 dict
 
433
        If it is held, this returns the lock info structure as a rio Stanza,
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
 
        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()
 
462
        # TODO: Handle if info_bytes is empty
 
463
        return rio.read_stanza(osutils.split_lines(info_bytes)).as_dict()
470
464
 
471
465
    def attempt_lock(self):
472
466
        """Take the lock; fail if it's already held.
540
534
                    deadline_str = time.strftime('%H:%M:%S',
541
535
                                                 time.localtime(deadline))
542
536
                lock_url = self.transport.abspath(self.path)
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
537
                self._report_function('%s %s\n'
548
 
                    '%s\n' # held by
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.',
553
 
                    start,
554
 
                    formatted_info[0],
555
 
                    formatted_info[1],
556
 
                    formatted_info[2],
557
 
                    deadline_str,
558
 
                    )
 
538
                                      '%s\n' # held by
 
539
                                      '%s\n' # locked ... ago
 
540
                                      'Will continue to try until %s, unless '
 
541
                                      'you press Ctrl-C\n'
 
542
                                      'If you\'re sure that it\'s not being '
 
543
                                      'modified, use bzr break-lock %s',
 
544
                                      start,
 
545
                                      formatted_info[0],
 
546
                                      formatted_info[1],
 
547
                                      formatted_info[2],
 
548
                                      deadline_str,
 
549
                                      lock_url)
559
550
 
560
551
            if (max_attempts is not None) and (attempt_count >= max_attempts):
561
552
                self._trace("exceeded %d attempts")
617
608
    def _format_lock_info(self, info):
618
609
        """Turn the contents of peek() into something for the user"""
619
610
        lock_url = self.transport.abspath(self.path)
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']))
 
611
        delta = time.time() - int(info['start_time'])
625
612
        return [
626
613
            '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,),
 
614
            'held by %(user)s on host %(hostname)s [process #%(pid)s]' % info,
 
615
            'locked %s' % (format_delta(delta),),
630
616
            ]
631
617
 
632
618
    def validate_token(self, token):