/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: John Arbash Meinel
  • Date: 2010-01-06 17:46:15 UTC
  • mto: (4634.119.1 2.0)
  • mto: This revision was merged to the branch mainline in revision 4951.
  • Revision ID: john@arbash-meinel.com-20100106174615-cq1nckxhbuyemgjx
Fix bug #503886, errors setting up logging go to stderr.

The basic issue is that we were using logging to describe failures
to set up logging. However, those fail with bad error messages
rather than giving us the output we want. This was especially bad
when the failure was occuring on the server. Since 'ssh' will pass
back the stderr stream without bzr handling it at all.

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 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,
114
113
    )
115
114
import bzrlib.config
116
 
from bzrlib.decorators import only_raises
117
115
from bzrlib.errors import (
118
116
        DirectoryNotEmpty,
119
117
        FileExists,
252
250
        if info is None:
253
251
            raise LockFailed(self, "lock was renamed into place, but "
254
252
                "now is missing!")
255
 
        if info.get('nonce') != self.nonce:
 
253
        if info['nonce'] != self.nonce:
256
254
            self._trace("rename succeeded, "
257
255
                "but lock is still held by someone else")
258
256
            raise LockContention(self)
296
294
                                            info_bytes)
297
295
        return tmpname
298
296
 
299
 
    @only_raises(LockNotHeld, LockBroken)
300
297
    def unlock(self):
301
298
        """Release a held lock
302
299
        """
425
422
 
426
423
        peek() reads the info file of the lock holder, if any.
427
424
        """
428
 
        return self._parse_info(self.transport.get_bytes(path))
 
425
        return self._parse_info(self.transport.get(path))
429
426
 
430
427
    def peek(self):
431
428
        """Check if the lock is held by anyone.
432
429
 
433
 
        If it is held, this returns the lock info structure as a dict
 
430
        If it is held, this returns the lock info structure as a rio Stanza,
434
431
        which contains some information about the current lock holder.
435
432
        Otherwise returns None.
436
433
        """
458
455
                   )
459
456
        return s.to_string()
460
457
 
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()
 
458
    def _parse_info(self, info_file):
 
459
        return rio.read_stanza(info_file.readlines()).as_dict()
470
460
 
471
461
    def attempt_lock(self):
472
462
        """Take the lock; fail if it's already held.
540
530
                    deadline_str = time.strftime('%H:%M:%S',
541
531
                                                 time.localtime(deadline))
542
532
                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
533
                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
 
                    )
 
534
                                      '%s\n' # held by
 
535
                                      '%s\n' # locked ... ago
 
536
                                      'Will continue to try until %s, unless '
 
537
                                      'you press Ctrl-C\n'
 
538
                                      'If you\'re sure that it\'s not being '
 
539
                                      'modified, use bzr break-lock %s',
 
540
                                      start,
 
541
                                      formatted_info[0],
 
542
                                      formatted_info[1],
 
543
                                      formatted_info[2],
 
544
                                      deadline_str,
 
545
                                      lock_url)
559
546
 
560
547
            if (max_attempts is not None) and (attempt_count >= max_attempts):
561
548
                self._trace("exceeded %d attempts")
617
604
    def _format_lock_info(self, info):
618
605
        """Turn the contents of peek() into something for the user"""
619
606
        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']))
 
607
        delta = time.time() - int(info['start_time'])
625
608
        return [
626
609
            '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,),
 
610
            'held by %(user)s on host %(hostname)s [process #%(pid)s]' % info,
 
611
            'locked %s' % (format_delta(delta),),
630
612
            ]
631
613
 
632
614
    def validate_token(self, token):