/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: Martin
  • Date: 2010-05-06 11:36:58 UTC
  • mto: This revision was merged to the branch mainline in revision 5246.
  • Revision ID: gzlist@googlemail.com-20100506113658-eu18ypalseutpn7t
Treat pywintypes.error as a user error as per OSError, rather than an internal error

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006, 2007, 2008 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
110
110
    debug,
111
111
    errors,
112
112
    lock,
 
113
    osutils,
113
114
    )
114
115
import bzrlib.config
115
116
from bzrlib.decorators import only_raises
241
242
        # incorrect.  It's possible some other servers or filesystems will
242
243
        # have a similar bug allowing someone to think they got the lock
243
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.
244
250
        info = self.peek()
245
251
        self._trace("after locking, info=%r", info)
246
 
        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:
247
256
            self._trace("rename succeeded, "
248
257
                "but lock is still held by someone else")
249
258
            raise LockContention(self)
416
425
 
417
426
        peek() reads the info file of the lock holder, if any.
418
427
        """
419
 
        return self._parse_info(self.transport.get(path))
 
428
        return self._parse_info(self.transport.get_bytes(path))
420
429
 
421
430
    def peek(self):
422
431
        """Check if the lock is held by anyone.
423
432
 
424
 
        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
425
434
        which contains some information about the current lock holder.
426
435
        Otherwise returns None.
427
436
        """
449
458
                   )
450
459
        return s.to_string()
451
460
 
452
 
    def _parse_info(self, info_file):
453
 
        return rio.read_stanza(info_file.readlines()).as_dict()
 
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()
454
470
 
455
471
    def attempt_lock(self):
456
472
        """Take the lock; fail if it's already held.
524
540
                    deadline_str = time.strftime('%H:%M:%S',
525
541
                                                 time.localtime(deadline))
526
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.
527
547
                self._report_function('%s %s\n'
528
 
                                      '%s\n' # held by
529
 
                                      '%s\n' # locked ... ago
530
 
                                      'Will continue to try until %s, unless '
531
 
                                      'you press Ctrl-C\n'
532
 
                                      'If you\'re sure that it\'s not being '
533
 
                                      'modified, use bzr break-lock %s',
534
 
                                      start,
535
 
                                      formatted_info[0],
536
 
                                      formatted_info[1],
537
 
                                      formatted_info[2],
538
 
                                      deadline_str,
539
 
                                      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
                    )
540
559
 
541
560
            if (max_attempts is not None) and (attempt_count >= max_attempts):
542
561
                self._trace("exceeded %d attempts")
598
617
    def _format_lock_info(self, info):
599
618
        """Turn the contents of peek() into something for the user"""
600
619
        lock_url = self.transport.abspath(self.path)
601
 
        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']))
602
625
        return [
603
626
            'lock %s' % (lock_url,),
604
 
            'held by %(user)s on host %(hostname)s [process #%(pid)s]' % info,
605
 
            '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,),
606
630
            ]
607
631
 
608
632
    def validate_token(self, token):