/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/lockdir.py

  • Committer: Jelmer Vernooij
  • Date: 2010-03-21 21:39:33 UTC
  • mfrom: (5102 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5143.
  • Revision ID: jelmer@samba.org-20100321213933-fexeh9zcoz8oaju2
merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006, 2007, 2008, 2009 Canonical Ltd
 
1
# Copyright (C) 2006-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
242
242
        # incorrect.  It's possible some other servers or filesystems will
243
243
        # have a similar bug allowing someone to think they got the lock
244
244
        # when it's already held.
 
245
        #
 
246
        # See <https://bugs.edge.launchpad.net/bzr/+bug/498378> for one case.
 
247
        #
 
248
        # Strictly the check is unnecessary and a waste of time for most
 
249
        # people, but probably worth trapping if something is wrong.
245
250
        info = self.peek()
246
251
        self._trace("after locking, info=%r", info)
247
 
        if info['nonce'] != self.nonce:
 
252
        if info is None:
 
253
            raise LockFailed(self, "lock was renamed into place, but "
 
254
                "now is missing!")
 
255
        if info.get('nonce') != self.nonce:
248
256
            self._trace("rename succeeded, "
249
257
                "but lock is still held by someone else")
250
258
            raise LockContention(self)
422
430
    def peek(self):
423
431
        """Check if the lock is held by anyone.
424
432
 
425
 
        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
426
434
        which contains some information about the current lock holder.
427
435
        Otherwise returns None.
428
436
        """
451
459
        return s.to_string()
452
460
 
453
461
    def _parse_info(self, info_bytes):
454
 
        # TODO: Handle if info_bytes is empty
455
 
        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()
456
470
 
457
471
    def attempt_lock(self):
458
472
        """Take the lock; fail if it's already held.
526
540
                    deadline_str = time.strftime('%H:%M:%S',
527
541
                                                 time.localtime(deadline))
528
542
                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.
529
547
                self._report_function('%s %s\n'
530
 
                                      '%s\n' # held by
531
 
                                      '%s\n' # locked ... ago
532
 
                                      'Will continue to try until %s, unless '
533
 
                                      'you press Ctrl-C\n'
534
 
                                      'If you\'re sure that it\'s not being '
535
 
                                      'modified, use bzr break-lock %s',
536
 
                                      start,
537
 
                                      formatted_info[0],
538
 
                                      formatted_info[1],
539
 
                                      formatted_info[2],
540
 
                                      deadline_str,
541
 
                                      lock_url)
 
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
                    )
542
559
 
543
560
            if (max_attempts is not None) and (attempt_count >= max_attempts):
544
561
                self._trace("exceeded %d attempts")
600
617
    def _format_lock_info(self, info):
601
618
        """Turn the contents of peek() into something for the user"""
602
619
        lock_url = self.transport.abspath(self.path)
603
 
        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']))
604
625
        return [
605
626
            'lock %s' % (lock_url,),
606
 
            'held by %(user)s on host %(hostname)s [process #%(pid)s]' % info,
607
 
            '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,),
608
630
            ]
609
631
 
610
632
    def validate_token(self, token):